Ios AVFoundation AVMutableComposition-带音频的视频-冻结视频

Ios AVFoundation AVMutableComposition-带音频的视频-冻结视频,ios,avfoundation,avmutablecomposition,Ios,Avfoundation,Avmutablecomposition,我有一个录音带。将其添加到AVMutableComposition并导出时,播放声音时视频将冻结。我错过了什么 我有两首歌: _compositionVideoTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; _compositionAudioTrack = [self.composition addMuta

我有一个录音带。将其添加到AVMutableComposition并导出时,播放声音时视频将冻结。我错过了什么

我有两首歌:

_compositionVideoTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
_compositionAudioTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
然后创建轨迹:

AVAssetTrack *clipVideoTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *clipAudioTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[_compositionVideoTrack insertTimeRange:editRange ofTrack:clipVideoTrack atTime:self.composition.duration error:&editError];
[_compositionAudioTrack insertTimeRange:editRange ofTrack:clipAudioTrack atTime:self.composition.duration error:&editError];
然后我插入曲目:

AVAssetTrack *clipVideoTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *clipAudioTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[_compositionVideoTrack insertTimeRange:editRange ofTrack:clipVideoTrack atTime:self.composition.duration error:&editError];
[_compositionAudioTrack insertTimeRange:editRange ofTrack:clipAudioTrack atTime:self.composition.duration error:&editError];
最后,我导出它:

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

文件是.mp4。可能是文件格式吗?

尝试使用下面的方法导出

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

我认为您应该添加AVMutableVideoCompositionInstruction

您可以尝试这样做:

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];
然后使用可变组合初始化AVAssetExportSession

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

希望这将帮助您

我已尝试将AVAssetExportPresetPassthrough更改为AVAssetExportPresetMediumQuality。也不起作用。你保存了你的视频吗??或者您刚刚导出??视频是否每次都冻结在特定帧上?可能是视频曲目的时间范围不正确。您正在插入从{clipVideoTrack}和{clipAudioTrack}到从构图持续时间开始的构图轨迹的时间范围。当声音开始时,视频开始冻结。音频和视频不能同时播放。是的,我希望添加到comp的所有剪辑都在前一个剪辑之后,这就是为什么我将其添加到comp的持续时间中。如果没有看到更多的代码,很难说。我猜在声音开始时,AVMUTABLEVEOCompositionInstruction中AVMUTABLEVEOCompositionLayerInstructions的顺序有问题。您找到了什么解决方案?或者你找到了吗?我应该在说明书中添加什么?