我有一个GPUImageColorDodgeBlend
连接了两个输入的过滤器:
- A
GPUImageVideoCamera
从 iPhone 摄像机获取帧。 - A
GPUImageMovie
这是一个 (MP4) 视频文件,我想放在实时摄像机源上。
然后将GPUImageColorDodgeBlend
其连接到两个输出:
- A
GPUImageImageView
提供混合操作的实时预览。 - A
GPUImageMovieWriter
按下录制按钮后将电影写入存储。
现在,在视频开始录制之前,100% 的时间一切正常。可以很好地GPUImageVideo
混合在实时摄像机视频上,并且不会报告任何问题或警告。
但是,当GPUImageMovieWriter
开始录制时,事情开始随机出错。大约 80-90% 的时间,GPUImageMovieWriter
工作完美,没有错误或警告,输出视频正确写入。
然而,大约 10-20% 的时间(据我所知,这是相当随机的),在录制过程中似乎出现问题(尽管屏幕预览继续正常工作)。
具体来说,我开始收到数百个Program appending pixel buffer at time:
错误。
此错误源自 中的- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex
方法GPUImageWriter
。
此问题是由frameTime
报告给此方法的值的问题触发的。
据我所知,问题是由于作者有时会收到由摄像机编号的帧(它们往往具有极高的时间值,例如64616612394291,时间刻度为1000000000)。但是,有时作者会得到编号GPUImageMovie
为低得多的帧(例如200200的时间刻度为30000)。
GPUImageWriter
只要帧值增加,这似乎很高兴,但是一旦帧值减少,它就会停止写入并发出Program appending pixel buffer at time:
错误。
我似乎在做一些相当普遍的事情,而且这在任何地方都没有被报告为错误,所以我的问题是(对任何或所有这些问题的答案都值得赞赏——它们不一定都需要按顺序单独回答问题):
值从何而来——为什么根据来源或来源编号
frameTime
似乎如此随意?为什么它在每个之间交替 - 帧编号方案不应该在所有帧之间保持一致?frameTime
GPUImageVideoCamera
GPUImageMovie
我认为这个问题是由不增加
frameTime
的 s 引起的是否正确?...如果是这样,为什么100% 的时间在屏幕上
GPUImageView
接受和显示frameTime
s 就好了,但GPUImageMovieWriter
需要订购它们?...如果是这样,我如何确保
frameTime
进来的 s 是有效的?我尝试添加if (frameTime.value < previousFrameTime.value) return;
以跳过任何有效的编号较小的帧 - 大多数情况下。不幸的是,当我设置playsAtActualSpeed
它时,GPUImageMovie
这往往变得不那么有效,因为所有帧最终都会在某个点之后被跳过。
...或者这可能是一个错误,在这种情况下,我需要在 GitHub 上报告它——但我很想知道在frameTime
s 的工作方式中是否有一些我在这里忽略的东西。