ffmpeg中的pts,dts,duration時間記錄都是基於timebase換算,咱們主要分析下pts的時間怎麼換算,其它的是同樣的換算。ffmpeg的時間換算對許多新接觸同窗算是一個大坑,不少剛接觸ffmpeg的同窗都不容易搞清楚它的時間計算方法。html
咱們先看下ffmpeg時間是怎麼算的:編程
一幀圖像(音頻)的時間戳(時間戳通常以第一幀爲0開始)ide
時間戳 = pts * (AVRational.num/AVRational.den)函數
爲何要這麼算(挖坑)咱們看下ffmpeg的說明:編碼
「當有理數用浮點數作轉換時是有損的,ffmpeg要求高精度的計算的時間戳,因此用分數來作換算」。spa
咱們在看下換算用到的結構體,一看到他是用分數就容易理解了3d
typedef struct AVRational{視頻
int num; ///<分子htm
int den; ///< 分母blog
} 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)
更多的資料也能夠關注我51cto上的視頻課程
夏老師的課堂 http://edu.51cto.com/lecturer/12016059.html