2011-07-06 115 views
9

我想對視頻編碼H264作爲用libavccodec的ffmpeg :: avcodec_encode_video設置PTS H264

ffmpeg::avcodec_encode_video(codec,output,size,avframe);

返回我沒有avframe-錯誤> PTS值是否設置正確。
我試圖將其設置爲0,1,AV_NOPTS_VALUE和90KHz的幀序號*,但仍然得到錯誤non-strictly-monotonic PTS

的ffmpeg.c示例設置有關ffmpeg的packet.pts :: av_rescale_q(),但這僅僅是所謂的後你已經編碼了框架!

當與MP4V編解碼器一起使用時,avcodec_encode_video()本身正確設置pts值。

+2

使用較新的版本關閉ffmpeg簡單設置「ppicture-> pts = pCodecCtx-> frame_number;」作品 –

回答

0

我也有這個問題。至於我記得,該錯誤與dts

設置

out_video_packet.dts = AV_NOPTS_VALUE; 

幫我

0

一個嚴格的增加單調函數是一個函數,其中f(x)的< F(Y)如果x yy。< y。 所以它意味着你不能用與你一樣的PTS編碼2幀......用計數器檢查例子,它不應該返回錯誤。

6

我有同樣的問題,解決它通過計算點調用avcodec_encode_video如下之前:

//Calculate PTS: (1/FPS) * sample rate * frame number 
//sample rate 90KHz is for h.264 at 30 fps 
picture->pts = (1.0/30) * 90 * frame_count; 
out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture); 

解決方案從this helpful blog post

(注被盜:改變採樣率千赫,表示以Hz遠幀間太長,可能需要玩這個值 - 這裏不是一個視頻編碼專家,只是想要一些有用的東西,這樣做)

1

我也有這個問題。我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. 
+0

你的nextPTS函數何時溢出(即static_pts> INT_MAX)怎麼辦? – tmatth

+0

如果static_pts有溢出的危險,只需將其類型從int更改爲int64_t即可。 – Alanmars