91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-26 16:45:05 來源:網絡 閱讀:17536 作者:夏曹俊 欄目:編程語言

    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)



更多的資料也可以關注我51cto上的視頻課程

夏老師的課堂 http://edu.51cto.com/lecturer/12016059.html

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

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

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

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

栖霞市| 神池县| 揭东县| 康保县| 沈阳市| 民丰县| 峡江县| 仪征市| 榆林市| 遂宁市| 景谷| 韶山市| 西乌珠穆沁旗| 张掖市| 新田县| 全南县| 宣汉县| 白银市| 西乌珠穆沁旗| 贵南县| 徐汇区| 江门市| 得荣县| 乐至县| 富民县| 长武县| 宝兴县| 石门县| 依安县| 新竹县| 昌吉市| 丰县| 九江市| 克拉玛依市| 内江市| 祁阳县| 舞阳县| 望谟县| 淮阳县| 梅州市| 青龙|