У меня тоже была эта проблема. Я решил проблему таким образом:
Перед тем как вызвать
ffmpeg::avcodec_encode_video(codec,output,size,avframe);
Вы устанавливаете значение pts для avframe целочисленного значения, которое имеет начальное значение 0 и увеличивается на единицу каждый раз, как показано ниже:
avframe->pts = nextPTS();
Реализация nextPTS ():
int nextPTS()
{
static int static_pts = 0;
return static_pts ++;
}
После того, как вы задали значение в avframe, затем закодировали его. Если кодировка успешно. Добавьте следующий код:
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);
Это добавит правильное значение dts для закодированного AVFrame. Среди кода - пакет типа AVPacket, mOutputCodeCtxPtr типа AVCodecContext * и mOutputStreamPtr типа AVStream.
avcodec_encode_video возвращает 0, указывает на то, что текущий кадр буферизован, необходимо сбросить все буферизованные кадры после того, как все кадры были закодированы. Код сбрасывает весь буферный кадр примерно так:
int ret;
while((ret = ffmpeg::avcodec_encode_video(codec,output,size,NULL)) >0)
;// place your code here.