h264 ffmpeg: как инициализировать ffmpeg для декодирования NAL, созданных с помощью x264

Я закодировал некоторые кадры, используя x264, используя x264_encoder_encode, и после этого я создал 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 );
}
}

Теперь я хочу декодировать эти AVPackets с помощью avcodec_decode_video2. Я думаю, проблема в том, что я не инициализировал должным образом декодер, потому что для кодирования я использовал «сверхбыстрый» профиль и мелодию «zerolatency» (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.

Может кто-нибудь мне помочь? Извините, если мои знания в этой области низкие, я новичок.

Благодарю.

0

Решение

Я написал простое клиент-серверное приложение, которое передает потоковое RGB-видео, используя lib x264 для кодирования и ffmpeg для декодирования.
Вы можете найти код здесь: https://github.com/filippobrizzi/raw_rgb_straming

Он показывает, как настроить x264 и ffmpeg для кодирования / декодирования.

1

Другие решения

Прямо сейчас вы инициализируете декодер как

pCodecContext-> extradata = NULL;

это не правильно. Вам нужно выделить память для этого поля и скопировать данные из AVCodecContext :: extradata кодировщика в выделенный буфер. AVCodecContext :: extradata_size указывает размер этого буфера дополнительных данных в байтах

1

Убедитесь, что вы создаете правильные пакеты. Посмотрите, как это делается в 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))

0
По вопросам рекламы [email protected]