理解音視頻 PTS 和 DTS

来源:http://www.cnblogs.com/samirchen/archive/2017/06/23/7071824.html
-Advertisement-
Play Games

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


視頻

視頻的播放過程可以簡單理解為一幀一幀的畫面按照時間順序呈現出來的過程,就像在一個本子的每一頁畫上畫,然後快速翻動的感覺。

image

但是在實際應用中,並不是每一幀都是完整的畫面,因為如果每一幀畫面都是完整的圖片,那麼一個視頻的體積就會很大,這樣對於網路傳輸或者視頻數據存儲來說成本太高,所以通常會對視頻流中的一部分畫面進行壓縮(編碼)處理。由於壓縮處理的方式不同,視頻中的畫面幀就分為了不同的類別,其中包括:I 幀、P 幀、B 幀。

I、P、B 幀

I 幀、P 幀、B 幀的區別在於:

  • I 幀(Intra coded frames):I 幀圖像採用幀內編碼方式,即只利用了單幀圖像內的空間相關性,而沒有利用時間相關性。I 幀使用幀內壓縮,不使用運動補償,由於 I 幀不依賴其它幀,所以是隨機存取的入點,同時是解碼的基準幀。I 幀主要用於接收機的初始化和通道的獲取,以及節目的切換和插入,I 幀圖像的壓縮倍數相對較低。I 幀圖像是周期性出現在圖像序列中的,出現頻率可由編碼器選擇。
  • P 幀(Predicted frames):P 幀和 B 幀圖像採用幀間編碼方式,即同時利用了空間和時間上的相關性。P 幀圖像只採用前向時間預測,可以提高壓縮效率和圖像質量。P 幀圖像中可以包含幀內編碼的部分,即 P 幀中的每一個巨集塊可以是前向預測,也可以是幀內編碼。
  • B 幀(Bi-directional predicted frames):B 幀圖像採用雙向時間預測,可以大大提高壓縮倍數。值得註意的是,由於 B 幀圖像採用了未來幀作為參考,因此 MPEG-2 編碼碼流中圖像幀的傳輸順序和顯示順序是不同的。

也就是說,一個 I 幀可以不依賴其他幀就解碼出一幅完整的圖像,而 P 幀、B 幀不行。P 幀需要依賴視頻流中排在它前面的幀才能解碼出圖像。B 幀則需要依賴視頻流中排在它前面或後面的幀才能解碼出圖像。

這就帶來一個問題:在視頻流中,先到來的 B 幀無法立即解碼,需要等待它依賴的後面的 I、P 幀先解碼完成,這樣一來播放時間與解碼時間不一致了,順序打亂了,那這些幀該如何播放呢?這時就需要我們來瞭解另外兩個概念:DTS 和 PTS。

DTS、PTS 的概念

DTS、PTS 的概念如下所述:

  • DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在於告訴播放器該在什麼時候解碼這一幀的數據。
  • PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什麼時候顯示這一幀的數據。

需要註意的是:雖然 DTS、PTS 是用於指導播放端的行為,但它們是在編碼的時候由編碼器生成的。

當視頻流中沒有 B 幀時,通常 DTS 和 PTS 的順序是一致的。但如果有 B 幀時,就回到了我們前面說的問題:解碼順序和播放順序不一致了。

比如一個視頻中,幀的顯示順序是:I B B P,現在我們需要在解碼 B 幀時知道 P 幀中信息,因此這幾幀在視頻流中的順序可能是:I P B B,這時候就體現出每幀都有 DTS 和 PTS 的作用了。DTS 告訴我們該按什麼順序解碼這幾幀圖像,PTS 告訴我們該按什麼順序顯示這幾幀圖像。順序大概如下:

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

音視頻的同步

上面說了視頻幀、DTS、PTS 相關的概念。我們都知道在一個媒體流中,除了視頻以外,通常還包括音頻。音頻的播放,也有 DTS、PTS 的概念,但是音頻沒有類似視頻中 B 幀,不需要雙向預測,所以音頻幀的 DTS、PTS 順序是一致的。

音頻視頻混合在一起播放,就呈現了我們常常看到的廣義的視頻。在音視頻一起播放的時候,我們通常需要面臨一個問題:怎麼去同步它們,以免出現畫不對聲的情況。

要實現音視頻同步,通常需要選擇一個參考時鐘,參考時鐘上的時間是線性遞增的,編碼音視頻流時依據參考時鐘上的時間給每幀數據打上時間戳。在播放時,讀取數據幀上的時間戳,同時參考當前參考時鐘上的時間來安排播放。這裡的說的時間戳就是我們前面說的 PTS。實踐中,我們可以選擇:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時鐘。

參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很多時候多會被正則表達式搞的暈頭轉向,最近抽出時間對正則表達式進行了系統的學習,整理如下: 正則表達式的創建 兩種方法,一種是直接寫,由包含在斜杠之間的模式組成;另一種是調用RegExp對象的構造函數。 兩種方法的創建代碼如下: 可以看出,調用RegExp構造函數創建正則表達式時,第一個參數可以是字 ...
  • 許久沒有寫博客了,最近有個H5啟動APP原生頁面的需求,中間遇上一些坑,看了些網上的實現方案,特意來總結下 一、需要判斷客戶端的平臺以及是否在微信瀏覽器中訪問 1、客戶端判斷 在啟動APP時,Android和IOS系統處理的方式是不一樣的,Android這邊由於開放,可以在瀏覽器中通過<a>標簽以及 ...
  • 我們昨天說了關於Angular的選項卡,那今天就說一下Swiper的選項卡吧! 今天的選項卡是Zepto結合Swiper的選項卡,咱麽明天再說純純的Swiper的吧! 既然是關於Zepto和Swiper的選項卡,那就說明瞭!要有關於Swiper和Zepto的插件, 分別是這兩個: zepto.min ...
  • 這個對象,不是那個對象。續更第二篇。。 昨天說了對象的基本概念以及創建,今天來說一下它的其他方法: 1、訪問屬性的兩種方式:點語法、[]語法 點語法和 [ ]語法都可以訪問到對象的屬性,但是也存在區別: 1.點語法主要符合變數命名規則; 2.[ ]語法可以使用變數; 3.[ ]語法可以使用無效的js ...
  • 微信是目前最流行的社交軟體,每逢節假日,很多人都會在朋友圈分享自己的照片,有的人更是把照片做成了相冊,圖片的切換還伴隨有音樂,這個就是微信場景。 ...
  • 1) Jade Jade是一個有著完善API和驚艷特性的JavaScript模板引擎。使用空白與縮進敏感的代碼格式編寫HTML頁面。基於Node.js,運行在伺服器端。 2) Mustache Mustache是一個logic-less(無邏輯或輕邏輯)語法模板。可以用於組織HTML、配置文件、源代 ...
  • 需要加上parent.document,才能找到父頁面的元素 如: $("#tabs", parent.document).click(); ...
  • 學校暑期大作業讓用安卓寫一個app,有兩種方案(android stduio+sdk和eclipse+jdk+adt+sdk)折騰了幾天發現還是後者好用,但是安裝環境和下載真的是去了半條命,(不過由於eclipse是開源的,配置不對刪掉就行了,不用擔心卸載問題還是挺好用的)網上找的教程大部分都只說了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...