【问题标题】:AVFoundation AVMutableComposition - video with audio - freezes videoAVFoundation AVMutableComposition - 带音频的视频 - 冻结视频
【发布时间】:2014-03-18 17:42:45
【问题描述】:

我有一个录制的有声视频。将其添加到 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];

最后我导出它:

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

文件是 .mp4。会不会是文件格式?

【问题讨论】:

  • 视频是否每次都冻结在特定帧上?可能是视频轨道的时间范围不正确。您正在将时间范围从 {clipVideoTrack} 和 {clipAudioTrack} 插入到从合成持续时间开始的合成轨道。
  • 声音开始时视频开始冻结。音频和视频不能同时播放。是的,我希望所有添加到伴奏的剪辑都在前一个之后,这就是为什么我将它添加到伴奏的持续时间中。
  • 没有看到更多的代码,很难说。我的猜测是,在声音开始时,AVMutableVideoCompositionInstruction 中的 AVMutableVideoCompositionLayerInstructions 的顺序有问题。
  • 您找到什么解决方案来解决这个问题?或者你找到了吗?

标签: ios avfoundation avmutablecomposition


【解决方案1】:

尝试使用以下导出

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

【讨论】:

  • 我尝试将 AVAssetExportPresetPassthrough 更改为 AVAssetExportPresetMediumQuality。也没有用。
  • 您的视频保存了吗??或者你刚刚导出了??
【解决方案2】:

你可以尝试这样做:

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

希望对你有帮助

【讨论】:

    【解决方案3】:

    我认为你应该添加 AVMutableVideoCompositionInstruction

    【讨论】:

    • 我应该在指令中添加什么?
    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多