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