日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

视频中的DTS与PTS的理解

發(fā)布時(shí)間:2023/12/29 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 视频中的DTS与PTS的理解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://blog.itpub.net/30004768/viewspace-1338882/

DTS(解碼時(shí)間戳)和PTS(顯示時(shí)間戳)分別是解碼器進(jìn)行解碼和顯示幀時(shí)相對(duì)于SCR(系統(tǒng)參考)的時(shí)間戳。SCR可以理解為解碼器應(yīng)該開始從磁盤讀取數(shù)據(jù)時(shí)的時(shí)間。
mpeg文件中的每一個(gè)包都有一個(gè)SCR時(shí)間戳并且這個(gè)時(shí)間戳就是讀取這個(gè)數(shù)據(jù)包時(shí)的系統(tǒng)時(shí)間。通常情況下,解碼器會(huì)在它開始讀取mpeg流時(shí)啟動(dòng)系統(tǒng)時(shí)鐘(系統(tǒng)時(shí)鐘的初始值是第一個(gè)數(shù)據(jù)包的SCR值,通常為0但也可以不從0開始)。

DTS 時(shí)間戳決定了解碼器在SCR時(shí)間等于DTS時(shí)間時(shí)進(jìn)行解碼,PTS時(shí)間戳也是類似的。通常,DTS/PTS時(shí)間戳指示的是晚于音視頻包中的SCR的一個(gè)時(shí) 間。例如,如果一個(gè)視頻數(shù)據(jù)包的SCR是100ms(意味著此包是播放100ms以后從磁盤中讀取的),那么DTS/PTS值就差不多是200 /280ms,表明當(dāng)SCR到200ms時(shí)這個(gè)視頻數(shù)據(jù)應(yīng)該被解碼并在80ms以后被顯示出來(視頻數(shù)據(jù)在一個(gè)buffer中一直保存到開始解碼)下 溢通常發(fā)生在設(shè)置的視頻數(shù)據(jù)流相關(guān)mux率太高。

如果mux率是1000000bits/sec(意味著解碼器要以1000000bits/sec的速率 讀取文件),可是視頻速率是2000000bits/sec(意味著需要以2000000bits/sec的速率顯示視頻數(shù)據(jù)),從磁盤中讀取視頻數(shù)據(jù)時(shí) 速度不夠快以至于1秒鐘內(nèi)不能夠讀取足夠的視頻數(shù)據(jù)。這種情況下DTS/PTS時(shí)間戳就會(huì)指示視頻在從硬盤中讀出來之前進(jìn)行解碼或顯示(DTS/PTS時(shí)間戳就要比包含它們的數(shù)據(jù)包中的SCR時(shí)間要早了)。
如今依靠解碼器,這基本已經(jīng)不是什么問題了(盡管MPEG文件因?yàn)閼?yīng)該沒有下溢而并不完全符合MPEG標(biāo)準(zhǔn))。一些解碼器(很多著名的基于PC的播放器)盡可能快的讀取文件以便顯示視頻,可以的話直接忽略SCR。

注意在你提供的列表中,平均的視頻流速率為~3Mbps(3000000bits/sec)但是它的峰值達(dá)到了14Mbps(相當(dāng)大,DVD限制在 9.8Mbps內(nèi))。這意味著mux率需要調(diào)整足夠大以處理14Mbps的部分, bbMPEG計(jì)算出來的mux率有時(shí)候太低而導(dǎo)致下溢。
你計(jì)劃讓視頻流速率這么高么?這已經(jīng)超過了DVD的說明了,而且很可能在大多數(shù)獨(dú)立播放其中都不能播放。如果你不是這么計(jì)劃,我會(huì)從1增加mquant的值并且在視頻設(shè)置中將最大碼流設(shè)置為9Mbps以保持一個(gè)小一點(diǎn)的碼流。

如果你確實(shí)想讓視頻碼率那么高,你需要增大mux率。從提供的列表可以得出bbMPEG使用14706800bits/sec或者1838350bytes /sec的mux率(總數(shù)據(jù)速率為:1838350bytes/sec(14706800bits/sec)行)。你在強(qiáng)制mux率字段設(shè)置的值應(yīng)該是以
bytes/sec為單位并被50整除。所以我會(huì)從36767(1838350/50)開始,一直增加直到不會(huì)再出現(xiàn)下溢錯(cuò)誤為止。
音視頻同步原理[ffmpeg]
ffmpeg對(duì)視頻文件進(jìn)行解碼的大致流程:
1. 注冊(cè)所有容器格式和CODEC: av_register_all()
2. 打開文件: av_open_input_file()
3. 從文件中提取流信息: av_find_stream_info()
4. 窮舉所有的流,查找其中種類為CODEC_TYPE_VIDEO
5. 查找對(duì)應(yīng)的碼器: avcodec_find_decoder()
6. 打開編解碼器: avcodec_open()
7. 為解碼幀分配內(nèi)存: avcodec_alloc_frame()
8. 不停地從碼流中提取中幀數(shù)據(jù): av_read_frame()
9. 判斷幀的類型,對(duì)于視頻幀調(diào)用: avcodec_decode_video(
10. 解碼完后,釋放解碼器: avcodec_close()
11. 關(guān)閉輸入文件:av_close_input_file()
output_example.c 中AV同步的代碼如下(我的代碼有些修改),這個(gè)實(shí)現(xiàn)相當(dāng)簡(jiǎn)單,不過挺說明問題。
音視頻同步-時(shí)間戳
媒體內(nèi)容在播放時(shí),最令人頭痛的就是音視頻不同步。從技術(shù)上來說,解決音視頻同步問題的最佳方案就是時(shí)間戳:首先選擇一個(gè)參考時(shí)鐘(要求參考時(shí)鐘上的時(shí)間是線性遞增的);生成數(shù)據(jù)流時(shí)依據(jù)參考時(shí)鐘上的時(shí)間給每個(gè)數(shù)據(jù)塊都打上時(shí)間戳(一般包括開始時(shí)間和結(jié)束時(shí)間);在播放時(shí),讀取數(shù)據(jù)塊上的時(shí)間戳,同時(shí)參考當(dāng)前參考時(shí)鐘上的時(shí)間來安排播放(如果數(shù)據(jù)塊的開始時(shí)間大于當(dāng)前參考時(shí)鐘上的時(shí)間,則不急于播放該數(shù)據(jù)塊,直到參考時(shí)鐘達(dá)到數(shù)據(jù)塊的開始時(shí)間;如果數(shù)據(jù)塊的開始時(shí)間小于當(dāng)前參考時(shí)鐘上的時(shí)間,則“盡快”播放這塊數(shù)據(jù)或者索性將這塊數(shù)據(jù)“丟棄”,以使播放進(jìn)度追上參考時(shí)鐘)。

可見,避免音視頻不同步現(xiàn)象有兩個(gè)關(guān)鍵——一是在生成數(shù)據(jù)流時(shí)要打上正確的時(shí)間戳。如果數(shù)據(jù)塊上打的時(shí)間戳本身就有問題,那么播放時(shí)再怎么調(diào)整也于事無補(bǔ)。假如,視頻流內(nèi)容是從0s開始的,假設(shè)10s時(shí)有人開始說話,要求配上音頻流,那么音頻流的起始時(shí)間應(yīng)該是10s,如果時(shí)間戳從0s或其它時(shí)間開始打,則這個(gè)混合的音視頻流在時(shí)間同步上本身就出了問題。打時(shí)間戳?xí)r,視頻流和音頻流都是參考參考時(shí)鐘的時(shí)間,而數(shù)據(jù)流之間不會(huì)發(fā)生參考關(guān)系;也就是說,視頻流和音頻流是通過一個(gè)中立的第三方(也就是參考時(shí)鐘)來實(shí)現(xiàn)同步的。第二個(gè)關(guān)鍵的地方,就是在播放時(shí)基于時(shí)間戳對(duì)數(shù)據(jù)流的控制,也就是對(duì)數(shù)據(jù)塊早到或晚到采取不同的處理方法。圖2.8中,參考時(shí)鐘時(shí)間在0-10s內(nèi)播放視頻流內(nèi)容過程中,即使收到了音頻流數(shù)據(jù)塊也不能立即播放它,而必須等到參考時(shí)鐘的時(shí)間達(dá)到10s之后才可以,否則就會(huì)引起音視頻不同步問題。
基于時(shí)間戳的播放過程中,僅僅對(duì)早到的或晚到的數(shù)據(jù)塊進(jìn)行等待或快速處理,有時(shí)候是不夠的。如果想要更加主動(dòng)并且有效地調(diào)節(jié)播放性能,需要引入一個(gè)反饋機(jī)制,也就是要將當(dāng)前數(shù)據(jù)流速度太快或太慢的狀態(tài)反饋給“源”,讓源去放慢或加快數(shù)據(jù)流的速度。熟悉DirectShow的讀者一定知道,DirectShow中的質(zhì)量控制(Quality Control)就是這么一個(gè)反饋機(jī)制。DirectShow對(duì)于音視頻同步的解決方案是相當(dāng)出色的。但WMF SDK在播放時(shí)只負(fù)責(zé)將ASF數(shù)據(jù)流讀出并解碼,而并不負(fù)責(zé)音視頻內(nèi)容的最終呈現(xiàn),所以它也缺少這樣的一個(gè)反饋機(jī)制。
音視頻同步通訊SDK源碼包分享:
Android:http://down.51cto.com/data/711001
Windows:http://down.51cto.com/data/715497
Linux:http://download.csdn.net/detail/weixiaowenrou/5169796
IOS:http://down.51cto.com/data/715486
WEB:http://down.51cto.com/data/710983

總結(jié)

以上是生活随笔為你收集整理的视频中的DTS与PTS的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。