1. 程式人生 > >ffmpeg中的時間 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q 介紹

ffmpeg中的時間 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q 介紹

ffmpeg中的時間 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q等介紹 

目錄 [hide]

視訊的顯示和存放原理

對於一個電影,幀是這樣來顯示的:I B B P。現在我們需要在顯示B幀之前知道P幀中的資訊。因此,幀可能會按照這樣的方式來儲存:IPBB。這就是為什麼我們會有一個解碼時間戳和一個顯示時間戳的原因。解碼時間戳告訴我們什麼時候需要解碼,顯示時間戳告訴我們什麼時候需要顯示。所以,在這種情況下,我們的流可以是這樣的:

PTS: 1 4 2 3
DTS: 1 2 3 4
Stream: I P B B

通常PTS和DTS只有在流中有B幀的時候會不同。

DTS和PTS

音訊和視訊流都有一些關於以多快速度和什麼時間來播放它們的資訊在裡面。音訊流有采樣,視訊流有每秒的幀率。然而,如果我們只是簡單的通過數幀和乘以幀率的方式來同步視訊,那麼就很有可能會失去同步。於是作為一種補充,在流中的包有種叫做DTS(解碼時間戳)和PTS(顯示時間戳)的機制。為了這兩個引數,你需要了解電影存放的方式。像MPEG等格式,使用被叫做B幀(B表示雙向bidrectional)的方式。另外兩種幀被叫做I幀和P幀(I表示關鍵幀,P表示預測幀)。I幀包含了某個特定的完整影象。P幀依賴於前面的I幀和P幀並且使用比較或者差分的方式來編碼。B幀與P幀有點類似,但是它是依賴於前面和後面的幀的資訊的。這也就解釋了為什麼我們可能在呼叫avcodec_decode_video以後會得不到一幀影象。

ffmpeg中的時間單位

AV_TIME_BASE

ffmpeg中的內部計時單位(時間基),ffmepg中的所有時間都是於它為一個單位,比如AVStream中的duration即以為著這個流的長度為duration個AV_TIME_BASE。AV_TIME_BASE定義為:

#define         AV_TIME_BASE   1000000

AV_TIME_BASE_Q

ffmpeg內部時間基的分數表示,實際上它是AV_TIME_BASE的倒數。從它的定義能很清楚的看到這點:

#define         AV_TIME_BASE_Q   (AVRational){1, AV_TIME_BASE}

AVRatioal的定義如下:

typedef struct AVRational{
int num; //numerator
int den; //denominator
} AVRational;

ffmpeg提供了一個把AVRatioal結構轉換成double的函式:

複製程式碼
static inline double av_q2d(AVRational a){
/**
* Convert rational to double.
* @param a rational to convert
**/
    return a.num / (double) a.den;
}
複製程式碼

現在可以根據pts來計算一楨在整個視訊中的時間位置:

timestamp(秒) = pts * av_q2d(st->time_base)

計算視訊長度的方法:

time(秒) = st->duration * av_q2d(st->time_base)

這裡的st是一個AVStream物件指標。

時間基轉換公式

  • timestamp(ffmpeg內部時間戳) = AV_TIME_BASE * time(秒)
  • time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg內部時間戳)

所以當需要把視訊跳轉到N秒的時候可以使用下面的方法:

int64_t timestamp = N * AV_TIME_BASE; 
2
av_seek_frame(fmtctx, index_of_video, timestamp, AVSEEK_FLAG_BACKWARD);

ffmpeg同樣為我們提供了不同時間基之間的轉換函式:

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

這個函式的作用是計算a * bq / cq,來把時間戳從一個時基調整到另外一個時基。在進行時基轉換的時候,我們應該首選這個函式,因為它可以避免溢位的情況發生。

相關推薦

演算法時間複雜度概括——o(1)o(n)o(logn)o(nlogn)

在描述演算法複雜度時,經常用到o(1), o(n), o(logn), o(nlogn)來表示對應演算法的時間複雜度。這裡進行歸納一下它們代表的含義:這是演算法的時空複雜度的表示。不僅僅用於表示時間複雜度,也用於表示空間複雜度。   O後面的括號中有一個函式,指明某個演算法的

【轉】演算法時間複雜度概括——o(1)o(n)o(logn)o(nlogn)

       在描述演算法複雜度時,經常用到o(1), o(n), o(logn), o(

視訊流DTSPTS到底是什麼;

翻譯了一下:Q:hi,這可能是一個弱智問題,但是當我使用bbMEG1.24beta17編碼時,一直以來總是遇到這個下溢的問題。我從日誌檔案中得到的唯一啟示就是我應該更改mux率。。。但是幫助文件卻說將mux率設定為0可以強制其值由編碼器來計算。有誰知道我應該設定什麼值麼?能有

ffmpeg時間 DTSPTSAV_TIME_BASEAV_TIME_BASE_Q 介紹

ffmpeg中的時間 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q等介紹  目錄 [hide] 視訊的顯示和存放原理 對於一個電影,幀是這樣來顯示的:I B B P。現在我們需要在顯示B幀之前知道P幀中的資訊。因此,幀可能會按照這樣的方

音視訊GOP PTSDTS

視訊 視訊的播放過程可以簡單理解為一幀一幀的畫面按照時間順序呈現出來的過程,就像在一個本子的每一頁畫上畫,然後快速翻動的感覺。 但是在實際應用中,並不是每一幀都是完整的畫面,因為如果每一幀畫面都是完整的圖片,那麼一個視訊的體積就會很大,這樣對於網路傳輸或者視訊資料儲存

mysql 數據庫根據當前系統時間,取前後幾秒幾分鐘幾小時幾天

() ubd mysql second int 宋體 ffffff tex 時間 取時間: select current_timestamp; 輸出:2016-06-16 16:12:52 select now(); 輸出:2016-06-16 16:12:52 s

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現和解析(附原始碼)。 任意半徑值濾波(擴充套件至百分比濾波器)O(1)時間複雜度演算法的原理實現及效果 任意半徑值濾波(擴充套件至百分比濾波器)O(1)時間複雜度演算法的原理實現及

  四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有幾位朋友

iview的tabe加入inputselect時間外掛和table的編輯刪除操作

  如圖,實現的目標table能有編輯的input、能選擇的下拉框、還有日期選擇器、最後的操作裡面可以點選編輯和刪除當前的行操作。 自己解說的,怕有些地方講的不好,放上demo的連結地址 對應的github的demo連結地址:https://github.com

MySQL時間型別DATETIMETIMESTAMPDATETIMEYEAR

1.幾個的區別 詳細可以參考:https://www.cnblogs.com/Jie-Jack/p/3793304.html 2.針對時間型別的一些操作 nodejs支援多種格式轉換為時間戳: var str1 = "2017-01-19 13:00:00"; va

linuxwho命令顯示的ttypts和(:0)(:0.0)是什麼意思

 root pts/3       2018-08-16 10:06 (:0.0) admin1是登入的使用者 pts/0告訴您使用者登入的是哪個“偽終端”, pts/1+(:0)就是在主機上開啟第二個終端。 :0被稱

MySQL時間時間戳和字串之間的轉換

涉及的函式        date_format(date,format)     //時間轉換成字串        unix_timestamp()  //時間或字串

理解ffmpegptsdts,time_base

net avcodec stream nal next 我只 pack per mes 首先介紹下概念: PTS:Presentation Time Stamp。PTS主要用於度量解碼後的視頻幀什麽時候被顯示出來 DTS:Decode Time Stamp。DTS主要是標識

ffprobe分析視訊檔案dtspts等資訊

./ffprobe -show_frames -select_streams v /data/test1s.mp4 | grep pict_type 只顯示視訊流的幀型別 ./ffprobe -show_frames -select_streams v /data/test1s.mp4 |

JavaMySql時間型別與字串型別的相互轉換

          很多時候,我們在做專案的時候經常會遇到前臺傳回來的時間引數。有的時候,前臺會做處理,將文字框的字串轉化為時間型別的;有的時候,前臺就直接傳字串型別的,所以,作為後臺開發人員要知道,資料庫中時間型別與字串的相互轉換。 1.MySql中時間型別與字串型別相互

DTSPTS 概念剖析

DTS,PTS的概念如下所述:DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在於告訴播放器該在什麼時候解碼這一幀的資料.PTS(演示時間):即顯示時間戳,這個時間戳用來告訴播放器該在什麼時候顯示這一幀的資料。需要注意的是:雖然DTS,PTS是用於指導播放端的行為,但它們是在

FFMPEG dtspts區別

CopyFrom:http://www.cnblogs.com/yinxiangpei/articles/3892982.html 視訊的顯示和存放原理 對於一個電影,幀是這樣來顯示的:I B B P。現在我們需要在顯示B幀之前知道P幀中的資訊。因此,幀可能會按照

獲取當前時間戳和隨機數的獲取Java RandomThreadLocalRandomUUID類的方法應用(隨機數)

(一)獲取時間戳:第一種方法:var timestamp = Date.parse(new Date());結果:1280977330000第二種方法:var timestamp = (new Date()).valueOf();結果:1280977330748第三種方法:v

Mysql使用sql語句查詢前一個天前一週前一月時間的方法

查詢一天:select * from 表名 where to_days(時間欄位名) = to_days(now());昨天SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 時間欄位名) <= 17天SELECT *

MySQL資料庫有欄位型別是日期時間的插入語句的寫法處理

MySQL資料庫中,與時間有關的型別有 DATE,TIME,TIMESTAMP: 時間戳mysql> create table ts(f1 TIMESTAMP); Query OK, 0

使用ADB更改系統設定的引數 如背光亮度休眠時間

感謝https://blog.csdn.net/jimbo_lee/article/details/52168189 分享Android4.2以後的原始碼android-17\com\android\commands目錄下較之前的版本多了一個settings命令,檢視其中的S