我使用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。
任何人都可以帮助我吗?对不起,如果我对这方面的了解很少,我很新。
感谢。
答案 0 :(得分:1)
我编写了一个简单的客户端/服务器应用程序,它使用lib x264进行原始RGB视频流式处理,然后使用ffmpeg进行解码。 您可以在此处找到代码:https://github.com/filippobrizzi/raw_rgb_straming
它显示了如何设置x264和ffmpeg来编码/解码。
答案 1 :(得分:1)
现在您将解码器初始化为
pCodecContext-&gt; extradata = NULL;
这不正确。您需要为此字段分配内存,并将数据从编码器的AVCodecContext :: extradata复制到分配的缓冲区中。 AVCodecContext :: extradata_size指定此extradata缓冲区的大小(以字节为单位)
答案 2 :(得分: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)
)