我也有這個問題。我sloved這樣的問題:你調用
ffmpeg::avcodec_encode_video(codec,output,size,avframe);
之前
設置avframe一個整數值的PTS值,每次都有一個初始值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);
它會爲編碼的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.
使用較新的版本關閉ffmpeg簡單設置「ppicture-> pts = pCodecCtx-> frame_number;」作品 –