ffmpeg Provided packet is too small, needs to be

ffmpeg Provided packet is too small, needs to be

我们在调用

avcodec_encode_xxxx

的时候,会出现上面的错误,原因是没有初始化

AVPacket

例如:

ret = avcodec_encode_audio2( pEncCodecCtx, &encPkt, encFrame, &got_output);

也就是说encPkt没有初始化,ffmpeg为初始化提供了一个api

av_init_packet

但是仅仅调用这个函数是不够的,依然会得到上面的错误,av_init_packet实现在libavcodec/avpacket.c
看看av_init_packet的实现:

 33 void av_init_packet(AVPacket *pkt)
 34 {
 35     pkt->pts                  = AV_NOPTS_VALUE;
 36     pkt->dts                  = AV_NOPTS_VALUE;
 37     pkt->pos                  = -1;
 38     pkt->duration             = 0;
 39     pkt->convergence_duration = 0;
 40     pkt->flags                = 0;
 41     pkt->stream_index         = 0;
 42     pkt->buf                  = NULL;
 43     pkt->side_data            = NULL;
 44     pkt->side_data_elems      = 0;
 45 }

可以看到并没有初始化data和size,因此除了调用av_init_packet这个函数外还需要初始化data和size

av_init_packet(&pkt);

pkt.size = 0;

pkt.data = NULL;

avcodec_encode_xxx( …, &pkt …. )

 

其实ffmpeg的官方提供的example里面就有这样的函数

/** Initialize one data packet for reading or writing. */
static void init_packet(AVPacket *packet)
{
av_init_packet(packet);
/** Set the packet data and size so that it is recognized as being empty. */
packet->data = NULL;
packet->size = 0;
}

ihttps://www.ffmpeg.org/doxygen/2.2/transcode_aac_8c-example.html

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章转载自:IT夜班车,否则按侵权处理i.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *