1. 程式人生 > >C++程式設計音視訊庫ffmpeg的pts時間換算方法

C++程式設計音視訊庫ffmpeg的pts時間換算方法

ffmpeg中的pts,dts,duration時間記錄都是基於timebase換算,我們主要分析下pts的時間怎麼換算,其它的是一樣的換算。ffmpeg的時間換算對許多新接觸同學算是一個大坑,很多剛接觸ffmpeg的同學都不容易搞清楚它的時間計算方法。

我們先看下ffmpeg時間是怎麼算的:

一幀影象(音訊)的時間戳(時間戳一般以第一幀為0開始)= pts * (AVRational.num/AVRational.den)

為什麼要這麼算(挖坑)我們看下ffmpeg的說明:

“當有理數用浮點數做轉換時是有損的,ffmpeg要求高精度的計算的時間戳,所以用分數來做換算”。

我們在看下換算用到的結構體,一看到他是用分數就容易理解了

typedef struct AVRational{

int num; ///<分子

int den; ///< 分母

} AVRational;

其實當num=1,den=1000的時候pts的時間單位就相當於毫秒 1/1000秒

其實當num=1,den=1000000的時候pts的時間單位就相當於微秒 1/1000000秒

時間換算

比如我們要通過ffmpeg實現直播推流,推流一個檔案,檔案中的時間基數一般是{ num=1,den=1000000} ,推流用的正常是timebase {num=1,den=1000}。那就可以做如下計算:

推流的pts = 檔案pts * 檔案timebase / 推流timebase

如果手動計算要判斷分母是否為0,不然會造成程式宕掉。當然ffmpeg內部也提供了轉換的函式

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;

可以直接呼叫


我們程式碼示例一下

AVCodecContext *vc = NULL; //視訊編碼器上下文

AVStream *vs = NULL; //輸出rtmp封裝器的視訊流

///編碼,推流處理程式碼。。。。。

。。。

。。。

//編碼後的視訊packet,時間基數使用的視訊編碼器

AVPacket pkt;

。。。

//推流用pts

//使用ffmpeg函式換算

//pkt.pts = av_rescale_q(pkt.pts,vc->timebase,vs->timebase);

//如果手動換算

if(vc->timebase.den > 0 && vs->timebase.den > 0)

pkt.pts = pkt.pts * (vc->timebase.num/vc->timebase.den)/(vs->timebase.num/vs->timebase.den)


更多的資料也可以關注我csdn上的視訊課程 夏老師課程專欄http://edu.csdn.net/lecturer/961

C++程式設計FFMpeg實時美顏直播推流實戰-基於ffmpeg,qt5,opencv視訊課程

C++程式設計FFMpeg實時美顏直播推流實戰-基於ffmpeg,qt5,opencv視訊課程