繁体   English   中英

h264 ffmpeg:如何初始化ffmpeg以解码使用x264创建的NAL

[英]h264 ffmpeg: How to initialize ffmpeg to decode NALs created with 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进行编码/解码。

现在,您像这样初始化解码器

pCodecContext-> extradata = NULL;

这是不正确的。 您需要为此字段分配一个内存,并将数据从编码器的AVCodecContext :: extradata复制到分配的缓冲区中。 AVCodecContext :: extradata_size以字节为单位指定此额外数据缓冲区的大小

确保您正在构建正确的数据包。 在ffmpeg中查看操作方法: http : static int encode_nals(AVCodecContext *ctx, AVPacket *pkt, x264_nal_t *nals, int nnal)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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM