0

AndroidでFFMPEG+x264を使用して、YUV420フレームをビデオファイルにエンコードしています。各フレームで次のコードを使用してエンコードします。

avcodec_encode_video2(gVideoWriteCodecCtx, &packet, pCurrentFrame, &gotPacket);

最初の数回の呼​​び出しで、フレームバッファがいっぱいになり、何もエンコードされません。最初のエンコードが発生すると、x264_lookahead_get_framesが呼び出されます。フレーム配列が正しく入力されていることがわかりますが、最初の項目はNULLです。結果として、x264_weights_analyseでは、frames [p0]として取得された参照フレームがNULLであり、そこで例外が発生します。

スライスタイプ.c、「フレーム」の最初のフレームはNULLです

if( h->param.analyse.i_weighted_pred && b == p1 )
    {
        x264_emms();
        x264_weights_analyse( h, fenc, frames[p0], 1 );
        w = fenc->weight[0];
    }

そして例外はそこで起こります、refはNULLです

static void x264_weights_analyse( x264_t *h, x264_frame_t *fenc, x264_frame_t *ref, int b_lookahead )
    {
        int i_delta_index = fenc->i_frame - ref->i_frame - 1;

このエンコーダーはほとんどの人に機能すると確信しているので、私は確かに何かが欠けています:)「frames」配列のこの最初のフレームがnullである理由を誰かが知っていますか?

どうもありがとう

4

1 に答える 1

0

それが誰かを助けることができるなら、それは図書館で何か奇妙なもののように見えます。lookahead.c line236でこれらの2行を反転すると、次のようになります。

x264_stack_align( x264_slicetype_decide, h );
x264_lookahead_update_last_nonb( h, h->lookahead->next.list[0] );

x264_lookahead_update_last_nonb( h, h->lookahead->next.list[0] );
x264_stack_align( x264_slicetype_decide, h );
于 2013-01-05T23:02:57.750 に答える