2011-02-23 16 views
5

मैं छवियों और ध्वनि फ़ाइलों का उपयोग कर एक मूवी फ़ाइल (एमपी 4) बनाने के लिए AVFoundation का उपयोग कर रहा हूं।आईओएस 4 पर AVFoundation का उपयोग कर फिल्म में ऑडियो फ़ाइल सामग्री कैसे जोड़ें?

मैंने AVAssetWriterInputPixelBufferAdaptor का उपयोग करके सफलतापूर्वक मूवी फ़ाइल बनाई है जो मूवी फ़ाइल में CVPixelBufferRef (UIImage ऑब्जेक्ट्स से निकाली गई) को जोड़ती है।

अब, मैं उस फिल्म में किसी फ़ाइल से ऑडियो सामग्री जोड़ना चाहता हूं। डिवाइस माइक्रोफ़ोन से डेटा प्राप्त करना वह नहीं है जो मैं यहां सोच रहा हूं। और, मुझे AVAssetWriterInputPixelBufferAdaptor के समान कुछ भी नहीं मिला जो उस फिल्म फ़ाइल में ऑडियो डेटा लिखने में मदद कर सकता है।

क्या मुझे यहां कुछ याद आ रही है?

+0

मुझे बहुत ही समस्या है। मेरे आवेदन में मैंने कैमरा रोल निर्देशिका में संग्रहीत वीडियो फ़ाइल के आधार पर एक मूवी बनाई है (सीधे पिक्सेल एक्सेस का उपयोग करके किए गए कुछ बदलावों के साथ)। इसके लिए मैंने AVAsset/AVAssetReader/AVAssetWriter कक्षाओं और संबंधित का उपयोग किया है। मेरी एकमात्र समस्या यह है कि मेरी फिल्म में कोई ऑडियो ट्रैक नहीं है, केवल वीडियो डेटा है। मैं अपनी फिल्म में ऑडियो ट्रैक "संलग्न" करना चाहता हूं जो मूल वीडियो फ़ाइल से आता है। कुछ कारणों से मैं ऐसा नहीं कर सका जब वीडियो लिख रहा था, इसलिए अब मैं वीडियो रूपांतरण के बाद ऐसा करने का एक तरीका खोज रहा हूं। – peter

उत्तर

5

कम से कम मेरे लिए समाधान AVMutableComposition class का उपयोग करना था।

1)) AVMutableComposition वर्ग वस्तु
2 बनाने के 2 AVURLAsset वर्ग वस्तुओं को बनाने के लिए, पहले अपने वीडियो फ़ाइल के आधार पर, और दूसरा एक फ़ाइल पर आधारित है कि आप
3 से ऑडियो ट्रैक निकालना चाहते हैं) AVMutableCompositionTrack 2 बनाने वर्ग की वस्तुओं, ऑडियो ट्रैक के साथ एक से पहले, वीडियो ट्रैक के साथ एक दूसरे की तरह (उचित संपत्ति के आधार पर 2 से वस्तुओं))
4) AVAssetExportSession वर्ग बनाने के 1 से रचना वस्तु)
5) के आधार पर अपने सत्र निर्यात

सर्वश्रेष्ठ संबंध

0

धन्यवाद @ पीटर। यहां कोड में समाधान है।

-(BOOL)compositeVideo{ 
    //Record cur video 
    NSURL *curAudio = [[NSBundle mainBundle]URLForResource:@"a" withExtension:@".pcm"]; 
    NSURL *curVideo = [[NSBundle mainBundle]URLForResource:@"v" withExtension:@".mp4"]; 
    AVAsset *video = [AVAsset assetWithURL:curVideo]; 
    AVAsset *audio = [AVAsset assetWithURL:curAudio]; 
    AVAssetTrack *vTrack = [[video tracksWithMediaType:AVMediaTypeVideo] firstObject]; 
    NSArray *arr = [audio tracksWithMediaType:AVMediaTypeAudio]; 
    AVAssetTrack *aTrack = [arr firstObject]; 

    AVMutableComposition *composition = [AVMutableComposition composition]; 
    AVMutableCompositionTrack *visualTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:1]; 
    AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    NSError *error; 
    [visualTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, video.duration) ofTrack:vTrack atTime:kCMTimeZero error:&error]; 
    if (error) { 
     NSLog(@"video composition failed! error:%@", error); 
     return NO; 
    } 
    [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audio.duration) ofTrack:aTrack atTime:kCMTimeZero error:&error]; 
    if (error) { 
     NSLog(@"audio composition failed! error:%@", error); 
     return NO; 
    } 

    AVAssetExportSession *exporter = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; 
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; 
    exporter.outputURL = [NSURL fileURLWithPath:[path stringByAppendingPathComponent:@"compositedVideo.mp4"]]; 
    [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; 
    exporter.outputFileType = AVFileTypeQuickTimeMovie; 
    [exporter exportAsynchronouslyWithCompletionHandler:^{ 
     if (exporter.error) { 
      NSLog(@"exporter synthesization failed! error:%@", error); 
      [self.delegate compositeDidFinishAtURL:nil duration:-1]; 
     }else{ 
      [self.delegate compositeDidFinishAtURL:exporter.outputURL duration:CMTimeGetSeconds(video.duration)]; 
     } 
    }]; 
    return YES; 
} 
संबंधित मुद्दे