c++ - h264 ffmpeg : How to initialize ffmpeg to decode NALs created with x264

标签 c++ ffmpeg decode h.264 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 );
    }
}

现在我要做的是使用 avcodec_decode_video2 解码这些 AVPackets。我认为问题是我没有正确初始化解码器,因为编码我使用了“超快”配置文件和“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。

谁能帮帮我?抱歉,如果我在这方面的知识不够,我是新手。

谢谢。

最佳答案

我编写了一个简单的客户端/服务器应用程序,它使用 lib x264 进行编码并使用 ffmpeg 进行解码来流式传输原始 RGB 视频。 您可以在此处找到代码:https://github.com/filippobrizzi/raw_rgb_straming

它展示了如何设置 x264 和 ffmpeg 进行编码/解码。

关于c++ - h264 ffmpeg : How to initialize ffmpeg to decode NALs created with x264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322670/

相关文章:

c++ - 从控制台读取字符

c++ - vector 未正确填充

c++ - 用C++设计一个有助于减少 "repetitive operations on objects"的小对象池

python - pandas 解码字符串返回 NaN

Android解码乌克兰字符

algorithm - 解码 HID 数据

c++ - Cmake 拒绝找到正确的 MinGW 文件夹

ffmpeg - x264参数配置

image - ffmpeg 图像与背景图像一起滚动

android - liblinphone android x86_64 ffmpeg 无法加载