私もこの問題を抱えていました。私はこのように問題を解決しました:
呼び出す前に
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のポイントに値を指定した後、それをエンコードします。正常にエンコードされた場合。次のコードを追加します。
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.