2014-02-18 6 views
8

Ich habe ein aufgezeichnetes Video mit Ton. Wenn Sie das zu einer AVMutableComposition hinzufügen und es dann exportieren, wird das Video beim Abspielen des Sounds eingefroren. Was vermisse ich?AVFoundation AVMutableComposition - Video mit Audio - friert Video ein

Ich habe meine zwei Spuren:

_compositionVideoTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
_compositionAudioTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

Erstellen Sie dann den Titel:

AVAssetTrack *clipVideoTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
AVAssetTrack *clipAudioTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

Dann füge ich den Titel:

[_compositionVideoTrack insertTimeRange:editRange ofTrack:clipVideoTrack atTime:self.composition.duration error:&editError]; 
[_compositionAudioTrack insertTimeRange:editRange ofTrack:clipAudioTrack atTime:self.composition.duration error:&editError]; 

Schließlich ich es exportieren:

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:urlAsset presetName:AVAssetExportPresetPassthrough]; 
exportSession.outputFileType = AVFileTypeQuickTimeMovie; 

Und die Datei ist .mp4. Könnte es das Dateiformat sein?

+0

Fängt das Video jedes Mal an einem bestimmten Frame ein? Es könnte sein, dass der Zeitbereich für die Videospur falsch ist. Sie fügen den Zeitbereich von {clipVideoTrack} und {clipAudioTrack} in die Kompositionsspur ein, die mit der Dauer der Komposition beginnt. – jlw

+0

Das Video beginnt zu frieren, wenn der Ton beginnt. Audio und Video können nicht gleichzeitig wiedergegeben werden. Ja, ich möchte, dass alle Clips, die zu der Comp hinzugefügt wurden, hinter der vorherigen liegen, deshalb füge ich sie zur Dauer der Comp hinzu. – Mikael

+0

Ohne mehr von Ihrem Code zu sehen, ist es schwer zu sagen. Meine Vermutung ist, dass etwas mit der Reihenfolge Ihrer AVMutableVideoCompositionLayerInstructions in der AVMutableVideoCompositionInstruction zum Zeitpunkt des Soundstarts nicht stimmt. – jlw

Antwort

0

Versuchen Sie exportieren mit unter

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:self.inputAsset presetName:AVAssetExportPresetLowQuality]; 
    exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
+0

Ich habe versucht, AVAssetExportPresetPassthrough zu AVAssetExportPresetMediumQuality zu ändern. Hat auch nicht funktioniert. – Mikael

+0

Hast du dein Video gespeichert ?? oder du hast gerade exportiert ?? – iDeveloper

+0

Es wird gespeichert, nur den gesamten Code nicht angezeigt – Mikael

0

ich glaube, Sie AVMutableVideoCompositionInstruction hinzufügen sollten

+0

Was soll ich zu der Anweisung hinzufügen? – Mikael

0

Sie ca versuchen, wie dies zu tun:

AVMutableComposition *mutableComposition = [AVMutableComposition composition]; 
AVMutableCompositionTrack *videoCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:clipVideoTrack atTime:kCMTimeZero error:nil]; 
AVMutableCompositionTrack *audioCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

und dann init AVAssetExportSession mit wandelbaren Zusammensetzung

AVAssetExportSession* exporter = [[AVAssetExportSession alloc] initWithAsset:mutableComposition presetName:AVAssetExportPresetHighestQuality]; 

hoffe das hilft dir