2013-04-26 2 views
7

Je suis en train de mixer un fichier audio et vidéo en utilisant AVMutableComposition. Voici mon code pour que:Comment répéter une piste audio si la durée de la vidéo est supérieure à la durée de l'audio

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]; 

problème que je suis confronté est ma durée de fichier audio est plus courte que la durée de la vidéo. Donc ce que je veux faire est de boucler le fichier audio jusqu'à la fin de la vidéo. Comme ma vidéo est de 60 secondes et l'audio est de 35 secondes, donc l'audio devrait se répéter pendant 25 secondes.

Quelqu'un peut-il m'aider comment cela peut-il être fait.

Répondre

4

Solution 1: Créer une nouvelle CMTimeRange et insertTimeRange dans 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"); 
} 

NOTE: non testé, mais il devrait fonctionner.

EDIT:

Solution 2: Essayez ceci. N'utilisez pas mon code et remplacez cette ligne ci-dessous par la vôtre

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

ne fonctionne pas. votre logique semble correcte mais l'audio s'arrête après 35 secondes – coder1010

+0

J'ai déjà essayé avec la b_composition. J'ai utilisé ta logique. pas les mêmes lignes. est-il possible d'ajouter deux pistes audio dans la mixcomposition? – coder1010

+0

relire ma réponse et réessayer –

Questions connexes