2013-04-26 15 views
7

मैं AVMutableComposition का उपयोग कर एक ऑडियो और वीडियो फ़ाइल मिश्रण कर रहा हूं। नीचे इसके लिए मेरा कोड है:ऑडियो अवधि को दोहराएं यदि ऑडियो अवधि ऑडियो अवधि से अधिक समय में

enter code here 
AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

NSString *bundleDirectory = [[NSBundle mainBundle] bundlePath]; 

NSString *audio_inputFilePath = [bundleDirectory stringByAppendingPathComponent:@"xyz.mp3"];//audio of 35 seconds 

NSURL *audio_inputFileUrl = [NSURL fileURLWithPath:audio_inputFilePath]; 

    NSURL *video_inputFileUrl = [NSURL fileURLWithPath:videoOutputPath]; 

    NSString *outputFilePath = [documentsDirectory stringByAppendingPathComponent:@"video.mp4"];//video of 60 seconds 

NSURL *outputFileUrl = [NSURL fileURLWithPath:outputFilePath]; 

if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
     [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil]; 

    CMTime nextClipStartTime = kCMTimeZero; 

    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:video_inputFileUrl options:nil]; 

CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration); 

    AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

[a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 

    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audio_inputFileUrl options:nil]; 
    enter code here 
    CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration); 
    enter code here 
    AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 
    enter code here 
    AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset640x480]; 

समस्या का सामना करना पड़ रहा है मेरी ऑडियो फ़ाइल अवधि वीडियो अवधि से कम है। तो मैं वीडियो को समाप्त होने तक ऑडियो फ़ाइल लूप करना चाहता हूं। मेरे वीडियो की तरह 60 सेकंड है और ऑडियो 35 सेकंड है, इसलिए ऑडियो को 25 सेकंड के लिए दोहराया जाना चाहिए।

क्या कोई मेरी मदद कर सकता है कि यह कैसे किया जा सकता है।

उत्तर

4

समाधान 1: एक नया CMTimeRange और insertTimeRange बनाएं में AVMutableCompositionTrack

if (videoAsset.duration>audioAsset.duration) 
{ 
    //new time range 
    CMTime duration = CMTimeMakeWithSeconds(CMTimeGetSeconds(videoAsset.duration)-CMTimeGetSeconds(audioAsset.duration), audioAsset.duration.timescale); 
    if (CMTIME_IS_VALID(duration)) 
    { 
    CMTimeRange video_timeRange2 = CMTimeRangeMake(audioAsset.duration,duration); 
    //start from where left 
    CMTime nextClipStartTime2 = audioAsset.duration; 
    //add in AVMutableCompositionTrack 
    [b_compositionVideoTrack insertTimeRange:video_timeRange2 ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime2 error:nil]; 
    } 
    else 
     NSLog(@"time is invalid"); 
} 

नोट: नहीं परीक्षण किया, लेकिन यह काम करना चाहिए।

संपादित:

समाधान 2: इस प्रयास करें। मेरे कोड का उपयोग न करें और नीचे इस पंक्ति को अपने

[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeInvalid error:nil]; 
+0

काम नहीं कर रहा है। आपका तर्क सही लगता है लेकिन फिर भी 35 सेकंड – coder1010

+0

के बाद ऑडियो बंद हो जाता है मैंने पहले से ही b_composition के साथ प्रयास किया है। मैंने आपके तर्क का इस्तेमाल किया। एक ही लाइन नहीं। क्या मिश्रण मिश्रण में दो ऑडियो ट्रैक जोड़ना संभव है ?? – coder1010

+0

मेरा जवाब दोबारा पढ़ें और पुनः प्रयास करें –

संबंधित मुद्दे