2つの入力が接続されたGPUImageColorDodgeBlend
フィルターがあります。
GPUImageVideoCamera
iPhoneビデオカメラからフレームを取得しているA。GPUImageMovie
ライブカメラフィードに重ねたい(MP4)ビデオファイルです。
次に、GPUImageColorDodgeBlend
は2つの出力に接続されます。
GPUImageImageView
動作中のブレンドのライブプレビューを提供するためのA。GPUImageMovieWriter
録画ボタンが押されたときにムービーをストレージに書き込むためのA。
これで、ビデオの録画が開始される前に、すべてが100%正常に機能します。はGPUImageVideo
ライブカメラビデオにうまくブレンドされており、問題や警告は報告されていません。
ただし、GPUImageMovieWriter
録音を開始すると、ランダムに問題が発生し始めます。約80〜90%の時間、GPUImageMovieWriter
完全に機能し、エラーや警告はなく、出力ビデオは正しく書き込まれます。
ただし、約10〜20%の時間(そして私が見る限り、これはかなりランダムです)、記録プロセス中に問題が発生しているように見えます(画面上のプレビューは引き続き正常に機能します)。
具体的には、何百ものProgram appending pixel buffer at time:
エラーが発生し始めます。
このエラーは、の- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex
メソッドが原因で発生しGPUImageWriter
ます。
frameTime
この問題は、このメソッドに報告される値の問題によって引き起こされます。
私が見ることができることから、問題は、ビデオカメラによって番号が付けられたフレームをライターが時々受信することによって引き起こされます( 1000000000のタイムスケールで64616612394291のような非常に高い時間値を持つ傾向があります)。ただし、ライターは、によって番号が付けられたフレームを取得することがあります。フレームの番号ははるかに低くなります(タイムスケールが30000の200200など)。GPUImageMovie
GPUImageWriter
フレーム値が増加している限りは問題ないようですが、フレーム値が減少すると、書き込みが停止し、Program appending pixel buffer at time:
エラーが発生します。
私はかなり一般的なことをしているようですが、これはバグとしてどこにも報告されていないので、私の質問は次のとおりです(これらのいずれかまたはすべてへの回答はありがたいです-必ずしもすべてが別々に順番に回答される必要はありません質問):
値はどこから来るのですか?ソースまたはソースに従って番号が付けられている
frameTime
かどうかが、なぜそれほど恣意的に見えるのですか?なぜそれがそれぞれの間で交互になるのですか?フレーム番号付けスキームはすべてのフレームにわたって均一であるべきではありませんか?frameTime
GPUImageVideoCamera
GPUImageMovie
この問題はsが増加しないことが原因であると考えるのは正しい
frameTime
ですか?...もしそうなら、なぜ100%の時間、画面上で問題なくs
GPUImageView
を受け入れて表示するのに、注文する必要があるのでしょうか。frameTime
GPUImageMovieWriter
...もしそうなら、どうすれば
frameTime
入ってくるが有効であることを確認できますか?if (frameTime.value < previousFrameTime.value) return;
ほとんどの場合、機能する数の少ないフレームをスキップするように追加してみました。残念ながら、これを設定すると、特定のポイントの後にすべてのフレームがスキップされるためplaysAtActualSpeed
、GPUImageMovie
これははるかに効果が低くなる傾向があります。
...またはおそらくこれはバグです。その場合はGitHubで報告する必要がありますが、ここで見落としていることがあるかどうかを知りたいと思いますframeTime
。