3 votes

Fusionner Audio avec Vidéo

Je essaie de fusionner des fichiers audio avec des fichiers vidéo. Voici mon effort :

AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];

AVMutableComposition* mixComposition = [AVMutableComposition composition];

AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];

AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];   

NSString* videoName = @"export.mov";

NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
NSURL    *exportUrl = [NSURL fileURLWithPath:exportPath];

if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}

_assetExport.outputFileType = @"com.apple.quicktime-movie";
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) {      
            // votre code de complétion ici
     }       
 }
];

Tout semble fonctionner correctement, mais je ne comprends pas pourquoi ce code ne fonctionne pas ! J'obtiens les assets pour l'audio et la vidéo également. Mais je ne parviens pas à créer une session d'exportation.

2voto

DivineDesert Points 4932

Essayez d'utiliser AVAssetExportPresetPassthrough

Vérifiez également si vous pouvez obtenir une erreur en utilisant le code de complétion

 [_assetExport exportAsynchronouslyWithCompletionHandler:
     ^(void ) { 
         switch (_assetExport.status) 
         {
             case AVAssetExportSessionStatusFailed:
             {
                 NSLog (@"ÉCHEC %@",_assetExport.error);
                 break;
             }
             case AVAssetExportSessionStatusCompleted: 
             {
                 break;
             }
             case AVAssetExportSessionStatusCancelled: 
             {
                 NSLog (@"ANNULÉ");
                 break;
             }
         }
         NSLog("État de l'exportation %d-- %@", _assetExport.status, _assetExport.outputURL);
        }
     ];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X