2016-08-02 47 views
0

申し訳ありませんが、元のUHDシーケンスを.yuv形式でダウンロードし、.mp4コンテナ(h264 4:4:4,100%の品質、25fps)でffmpegでエンコードしました。私がffprobeを使ってエンコードされているフレームの数を調べると、600秒になるので、ビデオは24秒です。 を介してこれらのエンコードされたビデオシーケンスを実行すると、av_read_frameがエラーコード-12を返す前に処理されるフレームの40〜50%しか得られません。だから私は、ストリームの途中にあるav_read_frameによって読み取られ、関数が-12を返すように強制するいくつかのデータパッケージがあると推測しています。FFmpeg av_read_frameはフレームを正しく読み込みませんか?

どのように私はフレーム(600)の完全な数をエンコードすることができますこの問題に対処する必要がありますか? av_read_frame0と異なる値を返す場合は、av_free_packetとし、次のフレームを読み進めますか? av_read_frameは、のエラーコードを返します。このエラーコードはEOFに使用されていますので、ファイルコードの終わりは絶縁できますか?

答えて

1

あなたのデコードに何が問題なのかを言うのは難しいですが、まだ-12は理解できない魔法の数字ではありません。

printf("%s\n", av_err2str(-12)); 

これは実際にはCannot allocate memoryと表示されます。

そして、正の戻り値をav_read_frame()から取得する場合は、問題ありません。

av_free_packet()は代わりに、それぞれav_read_frame()ループの末尾にav_packet_unref()を使用して非推奨になりました。

最後に
while(av_read_frame(fmt_ctx, &pkt) >= 0) { 
    // decode packet and other stuff 
    av_packet_unref(&pkt); 
} 

、通常解凍するフレームがあるかどうかを示す適切な値にint型のパラメータを設定しますav_decode_video2()またはその他のデコード機能するので、EOFを心配する必要はありません。

新しいffmpeg(> = 3.1)デコード/エンコードAPIを使用している場合、または実際にEOFを処理する必要がある場合は、戻り値をAVERROR_EOFと比較してください。

+0

残念ながら私はffmpegの古いビルドを使用しています。私は 'av_free_packet'を使用する必要があります。 –

+0

とにかく、うん今それは動作します。あなたの答えをありがとう。私は関数を読みながらより慎重に考えました。 –

関連する問題