FFmpeg декодирует необработанный буфер с помощью avcodec_decode_video2

Я получаю поток h264, где я, по крайней мере, знаю размер одного кадра. Поток поступает правильно, так как я могу сохранить его в файле и воспроизвести с помощью vlc. Воспроизведение файла для меня не проблема, так как я включаю libavformat. Но libavformat возвращает мне AVPacket, который я могу напрямую передать avcodec_decode_video2. В этом случае я получил байпоток. Как я могу передать необработанный поток h264 в avcodec_decode_video2? Как я могу обернуть мои данные в AVPacket. VLC не нужно угадывать какие-либо данные.

5

Решение

Более или менее легко декодировать поток. Этот код работает идеально для меня:

class ffmpegstreamdestination
{
public:
ffmpegstreamdestination(AVCodecID decoder):
{
m_pCodec= avcodec_find_decoder(decoder);
m_pCodecCtx = avcodec_alloc_context3(m_pCodec);
avcodec_open2(m_pCodecCtx,m_pCodec,0);
m_pFrame=avcodec_alloc_frame();
}

~ffmpegstreamdestination()
{
av_free(m_pFrame);
avcodec_close(m_pCodecCtx);
}

void decodeStreamData(unsigned char * pData, size_t sz)
{
AVPacket        packet;
av_init_packet(&packet);

packet.data=pData;
packet.size=(int)sz;
int framefinished=0;
int nres=avcodec_decode_video2(m_pCodecCtx,m_pFrame,&framefinished,&packet);

if(framefinished)
{
// do the yuv magic and call a consumer
}

return;
}

protected:
AVCodecContext  *m_pCodecCtx;
AVCodec         *m_pCodec;
AVFrame         *m_pFrame;
};

вызов decodeStreamData ожидает данные в виде кадров. Вы должны искать в потоке NAL (более или менее магический номер заголовка), который в h264 случае 0x00000001. Это начало кадра. Заполнение AVPacket не так проблематично, как я думал. Если у вас нет информации, вы можете оставить атрибуты в ней как инициализированные av_init_packet. Например, есть проблемы, если у вас другая частота кадров.

Как всегда, если вы видите ошибку или думаете, что что-то будет работать лучше, приветствуется короткое сообщение.

6

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

Других решений пока нет …

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