2つの入力が接続されたGPUImageColorDodgeBlendフィルターがあります。
GPUImageVideoCameraiPhoneビデオカメラからフレームを取得している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かどうかが、なぜそれほど恣意的に見えるのですか?なぜそれがそれぞれの間で交互になるのですか?フレーム番号付けスキームはすべてのフレームにわたって均一であるべきではありませんか?frameTimeGPUImageVideoCameraGPUImageMovieこの問題はsが増加しないことが原因であると考えるのは正しい
frameTimeですか?...もしそうなら、なぜ100%の時間、画面上で問題なくs
GPUImageViewを受け入れて表示するのに、注文する必要があるのでしょうか。frameTimeGPUImageMovieWriter...もしそうなら、どうすれば
frameTime入ってくるが有効であることを確認できますか?if (frameTime.value < previousFrameTime.value) return;ほとんどの場合、機能する数の少ないフレームをスキップするように追加してみました。残念ながら、これを設定すると、特定のポイントの後にすべてのフレームがスキップされるためplaysAtActualSpeed、GPUImageMovieこれははるかに効果が低くなる傾向があります。
...またはおそらくこれはバグです。その場合はGitHubで報告する必要がありますが、ここで見落としていることがあるかどうかを知りたいと思いますframeTime。