我也有这个问题。我以这种方式解决了这个问题:
在调用之前
ffmpeg::avcodec_encode_video(codec,output,size,avframe);
您将 avframe 的 pts 值设置为一个整数值,其初始值为 0 并且每次递增 1,就像这样:
avframe->pts = nextPTS();
nextPTS() 的实现是:
int nextPTS()
{
static int static_pts = 0;
return static_pts ++;
}
在给 avframe 的 pts 一个值之后,然后对其进行编码。如果编码成功。添加以下代码:
if (packet.pts != AV_NOPTS_VALUE)
packet.pts = av_rescale_q(packet.pts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base);
if (packet.dts != AV_NOPTS_VALUE)
packet.dts = av_rescale_q(packet.dts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base);
它将为编码的 AVFrame 添加正确的 dts 值。其中,AVPacket 类型的packe、AVCodecContext* 类型的mOutputCodeCtxPtr 和AVStream 类型的mOutputStreamPtr。
avcodec_encode_video 返回 0 表示当前帧已被缓冲,您必须在所有帧编码后刷新所有缓冲帧。代码刷新所有缓冲的帧有点像:
int ret;
while((ret = ffmpeg::avcodec_encode_video(codec,output,size,NULL)) >0)
;// place your code here.