12
votes

Comment ajouter audio au fichier vidéo sur iPhone sdk

J'ai un fichier vidéo et un fichier audio. Est-il possible de la fusionner à une vidéo avec un fichier sonore. Je pense que Avmutablecomposition devrait m'aider, mais je ne comprends toujours pas comment. des conseils?


0 commentaires

3 Réponses :


6
votes

Oui, il est possible, voici un extrait de code utilisé pour ajouter de l'audio à une composition existante, j'ai attrapé ceci à partir du code d'échantillon Apples, vous devriez probablement voir tout le projet, vous le trouverez très utile, le projet est AVEILDITDEMO et vous pouvez le trouver dans le matériel de la WWDC 2010 qu'ils ont posté ici développeur.apple.com/videos/wwdc/2010. Espère que cela aide xxx

}


2 commentaires

Où est cette démo? Je ne peux pas trouver de télécharger pour cela n'importe où.


Je ne fusingons qu'un seul fichier audio / vidéo. Le problème est que, mon fichier vidéo de 40 secondes et un fichier audio est de 28 secondes. Donc, pour les 12 (40-28) secondes restantes - je veux la répéter à partir de 0 secondes dans un fichier audio. Comment ça? Y a-t-il une façon directe de faire cela?



19
votes

Merci Daniel. Je l'ai compris, c'est facile.

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

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";
DLog(@"file type %@",_assetExport.outputFileType);
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) {      
            // your completion code here
     }       
 }
 ];


5 commentaires

De manière appropriée, ce morceau de code ne fonctionne pas correctement ..Quandi je mettez en place ce code dans mon projet, il sera écrasé sur [COMPOSITIONCOMMENTAIRYRACTERRACTERRY: CMTIMERANGEMAKE (KCMTERYZERO, AUDIOAST.DARATION) OFTRACK: [[[[AUDIOASSET TrackswithType: Avmediatypaidio] ObjectAindex: 0] ATTME: erreur kcmtimezero: nil]; et montre qu'il n'y a pas d'objet à l'index zéro ..


@Swastik Je rencontre le même problème sur l'occasion, surtout lorsque vous travaillez avec des fichiers de l'iCloud. Le correctif pour moi a été de faire 2 choses. 1) Vérifiez que le fichier que j'essaye d'utiliser est valide pour le type de média que j'essaie de l'utiliser comme et 2) Assurez-vous que le fichier dispose de données avec celui-ci (ce qui ne porte pas avec le iCloud)


Salut Steve, je fusionne seulement un seul fichier audio / vidéo. Le problème est que, mon fichier vidéo de 40 secondes et un fichier audio est de 28 secondes. Donc, pour les 12 (40-28) secondes restantes - je veux la répéter à partir de 0 secondes dans un fichier audio. Comment ça? Y a-t-il une façon directe de faire cela?


Même problème ...... s'est écrasé sur [[AudioAsset TrackswithMédièrent: Avmediatypeaidio] ObjectAindex: 0] Il n'y a pas d'objet chez Index Zero, aucune solution de recherche?


@jayeshlathiya avez-vous trouvé une solution ??



0
votes

Voici la version SWIFT:

    func mixAudio(audioURL audioURL: NSURL, videoURL: NSURL) {
    let audioAsset = AVURLAsset(URL: audioURL)
    let videoAsset = AVURLAsset(URL: videoURL)

    let mixComposition = AVMutableComposition()

    let compositionCommentaryTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)

    // add audio
    let timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
    let track = audioAsset.tracksWithMediaType(AVMediaTypeAudio)[0]
    do {
        try compositionCommentaryTrack.insertTimeRange(timeRange, ofTrack: track, atTime: kCMTimeZero)
    }
    catch {
        print("Error insertTimeRange for audio track \(error)")
    }

    // add video
    let compositionVideoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)

    let timeRangeVideo = CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
    let trackVideo = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    do {
        try compositionVideoTrack.insertTimeRange(timeRangeVideo, ofTrack: trackVideo, atTime: kCMTimeZero)
    }
    catch {
        print("Error insertTimeRange for video track \(error)")
    }

    // export
    let assetExportSession = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetPassthrough)
    let videoName = "export.mov"
    exportPath = "\(NSTemporaryDirectory())/\(videoName)"
    let exportURL = NSURL(fileURLWithPath: exportPath!)

    if NSFileManager.defaultManager().fileExistsAtPath(exportPath!) {
        do {
            try NSFileManager.defaultManager().removeItemAtPath(exportPath!)
        }
        catch {
            print("Error deleting export.mov: \(error)")
        }
    }

    assetExportSession?.outputFileType = "com.apple.quicktime-movie"
    assetExportSession?.outputURL = exportURL
    assetExportSession?.shouldOptimizeForNetworkUse = true
    assetExportSession?.exportAsynchronouslyWithCompletionHandler({ 
        print("Mixed audio and video!")
        dispatch_async(dispatch_get_main_queue(), {
            print(self.exportPath!)

        })
    })

}


0 commentaires