首页 文章

iOS / AVFoundation:如何在播放期间消除(偶尔)AVComposition中不同视频之间的空白帧

提问于
浏览
2

我正在处理的应用程序通过在连续的时间间隔内将相同的AVAssetTrack(从原始视频网址创建)多次添加到同一AVComposition,将视频循环指定#次 . 该应用程序类似地通过从合成的AVMutableCompositionTrack(对于AVMediaTypeVideo)“移除”时间范围并将新剪辑的AVAssetTrack插入先前移除的时间范围,将新视频剪辑插入到现有合成中 .

然而,偶然地并且在某种程度上很少,在将如上所述的新剪辑插入到原始循环视频的重复内的时间范围内之后,产生的空白帧仅出现在视频循环的过渡点(在合成内),但仅在播放过程中 - 视频正确导出而没有间隙 .

这让我相信问题在于AVPlayer或AVPlayerItem以及帧当前如何缓冲以进行回放,而不是我如何插入/循环剪辑或选择正确的CMTime标记来执行此操作 . 该应用程序同时做了很多事情(通过NSTimer在UI中循环可视化,通过Amazing Audio Engine进行音频播放) - 我的问题可能是资源竞争的结果吗?

还有一点需要注意:我理解资产中音频和视频之间的差异会导致故障(即底层音频比视频长度略长),但是因为我没有向GPUImageWriter添加audioEncodingTarget,所以我是用于录制和保存视频,视频没有音频组件 .

您可以指出我的任何想法或方向将不胜感激!提前谢谢了 .

Update :闪烁与GPUImage库记录的"Had to drop a video frame"错误一致,根据创建者的说法,该错误与手机无法足够快地处理视频有关 . 多线程可以解决这个问题吗?

Update 2 :所以闪光实际上并不总是对应于不得不丢弃视频帧错误 . 我还禁用了所有的AVRecorder / Amazing Audio Engine代码,问题仍然存在,这使得它不是这些引擎之间资源竞争的问题 . 我一直在记录AVPlayer项目的属性,并注意到'isPlayBackLikelyToKeepUp'始终为NO,而'isPlaybackBufferFull'始终为yes .

1 回答

  • 1

    所以问题就解决了 - 有点令人沮丧的是,修复是多么简单 . 我只使用一个较短的时间范围来将视频添加到合成而不是AVAssetTrack的时间范围 . 没有更多的闪光 . 希望用户不会错过30秒的时间:)

    shortened_duration = CMTimeSubtract(originalVideoAssetTrack.timeRange.duration,CMTimeMake(1,30));

相关问题