C++編程音視頻庫ffmpeg的pts時間怎麼換算

    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

C++編程FFMpegSDK美顏直播推流實戰-基於qt5,opencv視頻課程

http://edu.51cto.com/course/10840.html

wKiom1mc-AbjkX_PAAgvk24sr5Y458.png-wh_50

wKiom1mc-BuAYOV2AAfvlgpFbks765.png-wh_50

相關文章
相關標籤/搜索