0

x264_encoder_encode を使用して x264 を使用していくつかのフレームをエンコードした後、次のような関数を使用して AVPackets を作成しました。

bool PacketizeNals( uint8_t* a_pNalBuffer, int a_nNalBufferSize, AVPacket* a_pPacket )
{
    if ( !a_pPacket )
return false;
    a_pPacket->data = a_pNalBuffer;
    a_pPacket->size = a_nNalBufferSize;
    a_pPacket->stream_index = 0;
    a_pPacket->flags = AV_PKT_FLAG_KEY;

    a_pPacket->pts = int64_t(0x8000000000000000);
    a_pPacket->dts = int64_t(0x8000000000000000);
}

この関数を次のように呼び出します。

x264_nal_t* nals;
int num_nals = encode_frame(pic, &nals);
for (int i = 0; i < num_nals; i++)
{
    AVPacket* pPacket = ( AVPacket* )av_malloc( sizeof( AVPacket ) );
    av_init_packet( pPacket );
    if ( PacketizeNals( nals[i].p_payload, nals[i].i_payload, pPacket ) )
    {
        packets.push_back( pPacket );
    }
}

ここでやりたいことは、avcodec_decode_video2 を使用してこれらの AVPackets をデコードすることです。問題は、エンコードに「超高速」プロファイルと「ゼロレイテンシー」チューン( x264 )を使用し、デコードにこれらのオプションを ffmpeg に指定する方法がわからないため、デコーダーを適切に初期化していないことだと思います。いくつかの例では、ビデオが保存されているファイルを使用してデコーダーを初期化する人々を読んだことがありますが、この場合は AVPackets を直接持っています。デコードしようとしているのは次のとおりです。

avcodec_init();  
avcodec_register_all();  
AVCodec* pCodec;  
pCodec=avcodec_find_decoder(CODEC_ID_H264);  
AVCodecContext* pCodecContext;  
pCodecContext=avcodec_alloc_context();  
avcodec_open(pCodecContext,pCodec);  
pCodecContext->width = 320;
pCodecContext->height = 200;
pCodecContext->extradata = NULL;
unsigned int nNumPackets = packets.size();
int frameFinished = 0;
for ( auto it = packets.begin(); it != packets.end(); it++ )
{
    AVFrame* pFrame;
    pFrame = avcodec_alloc_frame();
    AVPacket* pPacket = *it;
    int iReturn = avcodec_decode_video2( pCodecContext, pFrame, &frameFinished, pPacket );
}

しかし、iReturn では常に -1 です。

誰でも私を助けることができますか?この分野の知識が低ければ申し訳ありませんが、私は新しいです。

ありがとう。

4

3 に答える 3

2

エンコードに lib x264 を使用し、デコードに ffmpeg を使用して生の RGB ビデオをストリーミングする単純なクライアント/サーバー アプリケーションを作成しました。ここでコードを見つけることができます: https://github.com/filippobrizzi/raw_rgb_straming

エンコード/デコードするように x264 と ffmpeg をセットアップする方法を示します。

于 2014-08-01T12:44:11.163 に答える
1

今、次のようにデコーダーを初期化します

pCodecContext->extradata = NULL;

これは正しくありません。このフィールドにメモリを割り当て、エンコーダの AVCodecContext::extradata から割り当てられたバッファにデータをコピーする必要があります。AVCodecContext::extradata_size は、このエクストラデータ バッファのサイズをバイト単位で指定します

于 2014-12-14T17:23:42.133 に答える
0

正しいパケットを作成していることを確認してください。これが ffmpeg でどのように行われるかを参照してください: http://ffmpeg.org/doxygen/trunk/libx264_8c_source.html (static int encode_nals(AVCodecContext *ctx, AVPacket *pkt, x264_nal_t *nals, int nnal)およびstatic int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, int *got_packet))

于 2013-01-15T10:46:09.883 に答える