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

时间:2015-07-17 15:33:58

标签: ios avfoundation avplayer gpuimage avmutablecomposition

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

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

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

还有一点需要注意:我理解资产中音频和视频之间的差异可能会导致故障(即底层音频比视频长度略长),但因为我没有将audioEncodingTarget添加到GPUImageWriter中我正在使用录制和保存视频,视频没有音频组件。

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

更新:闪烁符合GPUImage库记录的“必须丢弃视频帧”错误,根据创建者的说法,该错误与手机无法快速处理视频有关足够。多线程可以解决这个问题吗?

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

1 个答案:

答案 0 :(得分:1)

所以问题解决了 - 有点令人沮丧的是修复的简单程度。我只是将时间范围缩短了一帧,以便将视频添加到合成而不是AVAssetTrack的时间范围。没有更多的闪光。希望用户不会错过30秒......

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