FFmpeg 時間戳回繞處理:保障流媒體時間連續性的核心機制

FFmpeg 時間戳回繞處理:保障流媒體時間連續性的核心機制

一、回繞處理函數

/**  * Wrap a given time stamp, if there is an indication for an overflow  *  * @param st stream               // 傳入一個指向AVStream結構體的指針,代表流信息  * @param timestamp the time stamp to wrap // 傳入需要處理的時間戳  * @return resulting time stamp   // 返回處理后的時間戳  */  
static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)  
{  // 檢查pts_wrap_behavior是否設置為不忽略,且pts_wrap_reference有效,并且傳入的時間戳有效  if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&  st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {  // 如果pts_wrap_behavior設置為添加偏移量,并且時間戳小于參考時間戳  if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&  timestamp < st->pts_wrap_reference)  // 返回時間戳加上一個由pts_wrap_bits定義的偏移量(通常是2的pts_wrap_bits次方)  return timestamp + (1ULL << st->pts_wrap_bits);  // 如果pts_wrap_behavior設置為減去偏移量,并且時間戳大于或等于參考時間戳  else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&  timestamp >= st->pts_wrap_reference)  // 返回時間戳減去一個由pts_wrap_bits定義的偏移量  return timestamp - (1ULL << st->pts_wrap_bits);  }  // 如果不滿足上述條件,則直接返回原始時間戳,不進行任何處理  return timestamp;  
}

該函數wrap_timestamp用于處理可能發生溢出的時間戳。在流式媒體處理中,由于時間戳通常是使用固定位數的整數來表示的,當時間戳超過該整數類型能夠表示的最大值時,它可能會回繞(wrap around)到0或者負數,造成處理上的混亂。為了處理這種回繞情況,FFmpeg庫提供了這樣的機制。

  1. 函數首先檢查是否啟用了時間戳回繞處理(pts_wrap_behavior不為AV_PTS_WRAP_IGNORE),并且有一個有效的參考時間戳(pts_wrap_reference)以及傳入的時間戳是有效的。

  2. 如果滿足條件,則根據pts_wrap_behavior的值來決定是添加還是減去一個偏移量。偏移量的大小由pts_wrap_bits決定,通常是2的pts_wrap_bits次方。

  3. 如果pts_wrap_behavior設置為AV_PTS_WRAP_ADD_OFFSET,并且傳入的時間戳小于參考時間戳,說明時間戳即將回繞到0,此時需要加上一個偏移量來避免回繞。
    如果pts_wrap_behavior設置為AV_PTS_WRAP_SUB_OFFSET,并且傳入的時間戳大于或等于參考時間戳,說明時間戳還未回繞,此時需要減去一個偏移量來確保時間戳的連續性。
    如果上述條件都不滿足,則函數直接返回原始的時間戳,不進行任何處理。

通過這個函數,可以確保在處理流式媒體時,即使時間戳發生回繞,也能得到正確且連續的時間戳值。

二、讀取輸入流時的回繞處理

讀取輸入流時的回繞處理在函數 int ff_read_packet(AVFormatContext *s, AVPacket *pkt);中,代碼如下:

// 獲取指定流的信息,stream_index 是數據包(pkt)所在的流的索引  
st = s->streams[pkt->stream_index];  // 調用 update_wrap_reference 函數,根據返回結果和流的 pts_wrap_behavior 設置來決定是否需要對時間戳進行調整  
if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {  // 如果流的 pts_wrap_behavior 是 AV_PTS_WRAP_SUB_OFFSET(即減去偏移量),并且 update_wrap_reference 返回 true  // 那么需要修正首次出現的時間戳為負值  // 如果 first_dts 不是相對值,則調用 wrap_timestamp 函數修正它  // 這里的目的是確保時間戳不會因為回繞而導致錯誤的排序  if (!is_relative(st->first_dts))  st->first_dts = wrap_timestamp(st, st->first_dts);  // 如果 start_time 不是相對值,同樣調用 wrap_timestamp 函數修正它  // start_time 通常表示流的開始時間  if (!is_relative(st->start_time))  st->start_time = wrap_timestamp(st, st->start_time);  // 如果 cur_dts 不是相對值,也調用 wrap_timestamp 函數修正它  // cur_dts 表示當前解碼時間戳  if (!is_relative(st->cur_dts))  st->cur_dts = wrap_timestamp(st, st->cur_dts);  
}  // 對數據包(pkt)的 dts(解碼時間戳)調用 wrap_timestamp 函數進行修正  
pkt->dts = wrap_timestamp(st, pkt->dts);  // 對數據包(pkt)的 pts(顯示時間戳)調用 wrap_timestamp 函數進行修正  
pkt->pts = wrap_timestamp(st, pkt->pts);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82621.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【b站計算機拓荒者】【2025】微信小程序開發教程 - chapter3 項目實踐 -1 項目功能描述

1 項目功能描述 # 智慧社區-小程序-1 歡迎頁-加載后端&#xff1a;動態變化-2 首頁-輪播圖&#xff1a;動態-公共欄&#xff1a;動態-信息采集&#xff0c;社區活動&#xff0c;人臉檢測&#xff0c;語音識別&#xff0c;心率檢測&#xff0c;積分商城-3 信息采集頁面-采集人數…

5.27 day 30

知識點回顧&#xff1a; 導入官方庫的三種手段導入自定義庫/模塊的方式導入庫/模塊的核心邏輯&#xff1a;找到根目錄&#xff08;python解釋器的目錄和終端的目錄不一致&#xff09; 作業&#xff1a;自己新建幾個不同路徑文件嘗試下如何導入 一、導入官方庫 我們復盤下學習py…

【GitHub Pages】部署指南

vue項目 編輯你的 vite.config.ts 文件&#xff0c;加上 base 路徑&#xff0c;設置為你的 GitHub 倉庫名 import { defineConfig } from vite import vue from vitejs/plugin-vue// 假設你的倉庫是 https://github.com/your-username/my-vue-app export default defineConfi…

遠程控制技術全面解析:找到適合你的最佳方案

背景&#xff1a;遠程控制為何成為企業核心需求&#xff1f; 隨著企業數字化轉型的推進&#xff0c;遠程控制技術已成為異地辦公和運維的關鍵工具。無論是跨國企業需要高效管理全球設備&#xff0c;還是中小型企業追求經濟高效的解決方案&#xff0c;選擇合適的遠程控制技術&a…

觸覺智能RK3506星閃開發板規格書 型號IDO-EVB3506-V1

產品概述 觸覺智能RK3506星閃開發板&#xff0c;型號IDO-EVB3506-V1采用 Rockchip RK3506&#xff08;三核 Cortex-A7單核Cortex-M0, 主頻最高1.5GHz&#xff09;設計的評估開發板&#xff0c;專為家電顯控、顯示HMI、手持終端、工業IOT網關、工業控制、PLC等領域而設計。內置…

九級融智臺階與五大要素協同的量子化解析

九級融智臺階與五大要素協同的量子化解析 摘要&#xff1a;本文構建了一個量子力學框架下的九級融智模型&#xff0c;將企業創新過程映射為量子能級躍遷。研究發現五大要素協同態決定系統躍遷概率&#xff08;P∣?Ψ_m∣H_協同∣Ψ_n?∣^2&#xff09;&#xff0c;當要素協同…

Kotlin學習34-data數據類1

定義如下&#xff1a;與普通類對比學習 //普通類 class NormalClass(val name: String, val age: Int, val sex: Char) //數據類 data class DataClass(val name: String, val age: Int, val sex: Char)對應找到java反編譯的代碼路徑&#xff1a;Tool-->Kotlin-->Show K…

博圖SCL基礎知識-表達式及賦值運算

S7-1200 從 V2.2 版本開始支持 SCL 語言。 語言元素 SCL 除了包含 PLC 的典型元素&#xff08;例如&#xff0c;輸入、輸出、定時器或存儲器位&#xff09;外&#xff0c;還包含高級編程語言表達式、賦值運算和運算符。 程序控制語句 SCL 提供了簡便的指令進行程序控制。例…

海思3519V200ARM Linux 下移植 Qt5.8.0

一、移植背景及意義 海思3519V200是一款基于ARM架構的嵌入式芯片,廣泛應用于智能安防、工業控制等領域。在這些應用場景中,對設備的圖形用戶界面(GUI)有著越來越高的要求。Qt5.8.0作為一個功能強大、跨平臺的GUI開發框架,能夠幫助開發者快速開發出美觀、高效的用戶界面。…

msql的樂觀鎖和冪等性問題解決方案

目錄 1、介紹 2、樂觀鎖 2.1、核心思想 2.2、實現方式 1. 使用 version 字段&#xff08;推薦&#xff09; 2. 使用 timestamp 字段 2.3、如何處理沖突 2.4、樂觀鎖局限性 3、冪等性 3.1、什么是冪等性 3.2、樂觀鎖與冪等性的關系 1. 樂觀鎖如何輔助冪等性&#xf…

成都鼎訊--通信信號模擬設備?

在現代電磁通信領域&#xff0c;精準模擬復雜多變的信號環境&#xff0c;是提升通信裝備性能與人員作戰能力的核心命題。成都鼎訊以技術創新為驅動&#xff0c;憑借深厚的研發實力&#xff0c;重磅推出通信信號模擬設備&#xff0c;以前所未有的強大功能與卓越性能&#xff0c;…

C# Windows Forms應用程序-003

目錄 項目結構 命名空間和類定義 主要控件 GroupBox 控件 Label 控件 TextBox 控件 Button 控件 OpenFileDialog 控件 方法說明 構造函數 Form1() Dispose(bool disposing) Main() InitializeComponent() button1_Click(object sender, System.EventArgs e) but…

【C/C++】死鎖的四大條件與預防策略詳解

文章目錄 死鎖的四大條件與預防策略詳解一、死鎖的產生條件&#xff08;四個必要條件&#xff09;二、代碼示例三、死鎖的預防手段&#xff08;以 C/C 為例&#xff09;1. 破壞“循環等待” —— 統一加鎖順序&#xff08;推薦&#xff09;2. 使用 std::lock 一次性加多個鎖3. …

Rust編程環境安裝

文章目錄 Rust編程環境安裝一、安裝準備二、安裝步驟對于Linux/macOS用戶對于Windows用戶 三、驗證安裝四、環境配置檢查五、工具鏈管理六、附加功能七、常見問題處理八、編輯器支持九、其他 Rust編程環境安裝 一、安裝準備 1. 支持系統&#xff1a;Windows/Linux/macOS 2. 所…

OpenHarmony平臺驅動使用(五),HDMI

OpenHarmony平臺驅動使用&#xff08;五&#xff09; HDMI 概述 功能簡介 HDMI&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;即高清多媒體接口&#xff0c;主要用于DVD、機頂盒等音視頻Source到TV、顯示器等Sink設備的傳輸。 HDMI以主從方式工…

【Git】Commit Hash vs Change-Id

文章目錄 1、Commit 號2、Change-Id 號3、區別與聯系4、實際場景示例5、為什么需要兩者&#xff1f;6、總結附錄——Gerrit 在 Git 和代碼審查工具&#xff08;如 Gerrit&#xff09;中&#xff0c;Commit 號&#xff08;Commit Hash&#xff09; 和 Change-Id 號 是兩個不同的…

leetcode hot100刷題日記——21.不同路徑

和20題一樣的思路link 題解&#xff1a; class Solution { public:int dfs(int i,int j,vector<vector<int>>&memo){//超過了邊界&#xff0c;return 0if(i<0||j<0){return 0;}//從&#xff08;0&#xff0c;0&#xff09;到&#xff08;0&#xff0c;0…

day2 MySQL表數據操作

一&#xff1a;數據操作 注&#xff1a;在編寫MySQL代碼時可以不用區分大小寫 1.查看表結構 desc 表名; -- 查看表中的字段類型&#xff0c;長度&#xff0c;約束。 2.字段的增加 AFTER table 表名 add 字段名 數據類型; -- 默認末尾添加 after table 表名 add 字段名 …

GitAny - 無需登入的 GitHub 最新倉庫檢索工具

地址&#xff1a;https://github.com/MartinxMax/gitany GitAny - 無需登入的 GitHub 專案搜尋工具 GitAny 是一款基於 Python 的工具&#xff0c;允許你在無需登入的情況下搜尋當天最新的 GitHub 專案。它支援模糊搜尋、條件篩選以及倉庫資料的視覺化分析。 安裝依賴 $ pip…

格恩朗金屬管浮子流量計 高精度測量的不二之選?

在流量測量的復雜領域&#xff0c;精度就是生命線&#xff0c;直接關乎生產的穩定性、產品的質量以及資源的合理利用。大連格恩朗品牌的金屬管浮子流量計&#xff0c;憑借其卓越的精度表現&#xff0c;成為各行業在流量測量時的最佳之選。? 格恩朗金屬管浮子流量計運用經典的可…