視頻播放中時鐘的概念及音視頻同步概念


author: hjjdebug
date: 2025年 07月 05日 星期六 18:20:45 CST
descrip: 視頻播放中時鐘的概念及音視頻同步概念


文章目錄

  • 1.前言: 視頻播放:
    • 1. 固定延時時間
    • 2. 根據frame的duration來延時.
    • 3. 根據frame的PTS 來播放
      • 3.1. 時鐘是什么?
      • 3.2. 時鐘的用途.
  • 2.音視頻同步:

1.前言: 視頻播放:

一幀一幀的把畫面渲染出來就構成了視頻播放.
從上一幀到這一幀的時間間隔是多少呢?

1. 固定延時時間

我們可以通過幀率計算每一幀的延時時間
每一幀和每一幀之間延時固定長度來播放.
架構大概是這樣的.

double duration=(double)1/framerate;
for(;;)
{getframe(ctx,frame);delay(duration);display(frame);
}

這樣每個畫面看起來是連續的,但是播放時間卻是不準確的.

2. 根據frame的duration來延時.

每個frame 都有duration屬性值,視頻一般是3600個時間單位,40ms時間,也有例外.
架構大概是這樣的.

for(;;)
{getframe(ctx,frame);delay(frame.duration);display(frame);
}

缺點. 只考慮了每一幀和每一幀之間理論上的時間間隔,
但是獲取到該幀也是要花時間的,
播放時間還是不準確.沒有按frame 的時間戳來播放.

3. 根據frame的PTS 來播放

讓每一次播放時間與PTS 時間戳對齊. PTS 讓我們啥時候播放,我們就啥時候播放.
當拿到一個frame時,根據frame.pts,判斷需要等待多少時間后再播放
架構大概是這樣的.

for(;;)
{getframe(ctx,frame);double duration=compute_target_delay(video_clock,frame.pts); //這個duration 是動態的.根據pts計算的.delay(duration);display(frame);
}

那根據pts 計算duration的過程是怎樣的呢?
關鍵就是這個時鐘video_clock. 它必需要知道某個時間點對應的PTS值是多少,
這樣給一個新的pts, 就能夠計算出期望的時間點.
拿期望的時間點減掉當前時間戳,就能得到延時時間duration
所以計算過程是這樣的.

typedef struct _Clock
{long pts_ref;        //參考pts時間double sys_time_ref;     //對應該pts的系統時間
}Clockdouble compute_target_delay(Clock *clk, long pts)
{long delta_pts = pts - clk->pts_ref;double time = delta_pts * AVRational(1,90000); //時間戳pts一般是90Kdouble expect_time=sys_time_ref+time;double current_time=av_gettime_relative()/1000000.0;double delay=expect_time-current_time; //期望播出時間減去當前時間就是應該delay的時間.return delay;
}

是的,也許你發現了問題,參考時間和參考pts又如何獲得呢?
這個簡單,你可以在獲取第一幀數據時,設定pts為pts_ref, 那時的系統時間為sys_time_ref.
而且在播放過程中,當你發現不正常時,隨時設置參考幀pts及對應的參考時間.
這叫時鐘同步,可能對應某個set_clock函數, 下面給個示例.

程序代碼:

for(;;)
{getframe(ctx,frame);double duration=compute_target_delay(vid_clk,frame.pts); //這個duration 是動態的.根據pts計算的.if(duration > 0){delay(duration)}else if(duration < -0.1) //超前有點離譜,我們矯正一下時鐘{set_clock(vid_clk,frame.pts); //設置時鐘同步點}display(frame);
}
//時鐘同步
void set_clock(Clock *vid_clk,long pts)
{vid_clk. pts_ref = pts;vid_clk.sys_time_ref = av_gettime_relative()/1000000.0;
}

3.1. 時鐘是什么?

時鐘就是某個frame的PTS, 對應著播放的系統時鐘時間是多少.
這是時鐘的主要概念.
有個這個基礎,我們可以以后根據frame的pts, 計算出它期望的播出時間.
在此基礎上再衍生出其它成員只是為了完善其它的功能而已.
1.1 時鐘對時:
把PTS與系統時間關聯上叫時鐘對時, 通過調用 set_clock(Clock *clk,LONG pts) 來完成

3.2. 時鐘的用途.

給定一個frame, 可以拿到它的pts, 通過與時鐘比較,可以知道它應該在什么時間播放.
從而也知道,它此時應該等待多少時間才可以播放.

2.音視頻同步:

音頻和視頻解碼/渲染是獨立線程,它們各有自己的時間戳PTS, 因而可以對應不同的時鐘.
即音頻對應音頻時鐘. audclk
視頻對應視頻時鐘. vidclk
如果我們拿音頻時鐘去調教視頻播放,這就實現了音視頻同步,具體是怎樣操作的呢?
視頻時鐘與主時鐘本身可能就有偏差,這個需要考慮在內.
diff = get_clock(&is->vidclk) - get_master_clock(is); //這里的master_clock 可能是音頻時鐘,視頻時鐘或外部時鐘
我們現在在談視頻同步到音頻,當然這里要把主時鐘理解為音頻時鐘.
根據視頻計算的delay值,用音頻進一步矯正,需要一種算法,可能是簡單的delay+diff,
也可能在極端條件下進行過激調整2delay+diff, delay+2diff 等等, 可以觀察一下哪種效果更好.
這就是編程靈活的地方了. 算法以簡潔,使用,有效為基礎.

有了這些概念,我們再來讀ffplay6, 就好很多了.

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

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

相關文章

Python基礎之字符串操作全解析

在 Python 中&#xff0c;字符串是最常用的數據類型之一&#xff0c;掌握字符串的各種操作對于日常編程至關重要。本文將詳細介紹 Python 字符串的類型特性、編碼轉換、常用運算符及方法&#xff0c;幫助你全面掌握字符串處理技巧。 一、字符串的基本類型 Python 中的字符串屬…

【爬蟲】逆向爬蟲初體驗之爬取音樂

尋找數據 打開F12中的網絡頁面&#xff0c;播放音樂后&#xff0c;篩選媒體&#xff0c;會發現當前這首歌曲音頻鏈接地址&#xff0c;打開后&#xff0c;點擊“標頭”就能能看到請求URL 截取“.mp3”前面的一部分進行搜索&#xff0c;搜索出來了很多數據包&#xff0c;但都是…

CppCon 2018 學習:Fancy Pointers for Fun and Profit

“Fancy Pointers for Fun and Profit” 這個標題聽起來像是在討論**“高級指針用法”**&#xff0c;尤其是在C里&#xff0c;如何利用智能指針、定制指針類型&#xff0c;或者其他高級指針技巧來寫更安全、更高效、更優雅的代碼。 可能的理解和內容方向&#xff1a; 1. 什么是…

思辨場域丨數字信號技術重塑農林牧漁:從“靠天吃飯”到“靠數吃飯”

凌晨三點&#xff0c;山東萊蕪的養豬戶老李被手機震動驚醒。屏幕顯示&#xff1a;3號豬舍&#xff0c;母豬即將分娩。他輕點屏幕啟動遠程監控&#xff0c;翻身繼續入睡——而在幾年前&#xff0c;這樣的夜晚他只能在豬圈里守著。 清晨的茶園里&#xff0c;興業縣的茶農王大姐掏…

文心大模型及百度大模型內容安全平臺齊獲信通院大模型安全認證

近日&#xff0c;文心大模型與百度大模型內容安全平臺——紅線大模型雙雙榮獲中國信息通信研究院泰爾認證中心頒發的“大規模預訓練模型&#xff08;文本生成功能&#xff09;安全認證證書”&#xff0c;且二者的認證級別皆“增強級”的最高級別。 大規模預訓練模型&#xff08…

香港服務器查詢緩存禁用-性能優化關鍵技術解析

在香港服務器運維過程中&#xff0c;查詢緩存禁用是提升數據庫性能的關鍵操作。本文將深入解析禁用查詢緩存的原理、操作步驟、適用場景及注意事項&#xff0c;幫助管理員優化MySQL服務器配置&#xff0c;解決高并發環境下的性能瓶頸問題。香港服務器查詢緩存禁用-性能優化關鍵…

深度學習圖像分類數據集—七種動物識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;七種動物識別分類&#xff1a;[Chinese_Merganser, panda, Sika_Deer, …

ubuntu22桌面版中文輸入法 fcitx5

不要去 ubuntu software 下載 fcitx5 快捷鍵用不了 直接 sudo apt install fcitx5 \ fcitx5-chinese-addons \ fcitx5-frontend-gtk4 fcitx5-frontend-gtk3 fcitx5-frontend-gtk2 \ fcitx5-frontend-qt5不要在fcitx5里面設置快捷鍵&#xff0c;有些應用可能無法生效 在設置里全…

推客系統小程序終極指南:從0到1構建自動裂變增長引擎,實現業績10倍增長!

&#x1f4cc; 前言&#xff1a;為什么傳統營銷越來越難做&#xff1f;在流量紅利消失的今天&#xff0c;企業普遍面臨三大增長困境&#xff1a;獲客成本飆升&#xff1a;電商、教育等行業單客成本突破500元&#xff0c;ROI持續走低用戶粘性差&#xff1a;90%的活動用戶只參與一…

【數據結構】排序算法:歸并與堆

歸并排序&#xff1a;分治策略的經典實現 算法原理 歸并排序采用分治法策略&#xff0c;包含三個關鍵步驟&#xff1a; 分解&#xff1a;遞歸地將數組分成兩半 解決&#xff1a;對子數組進行排序 合并&#xff1a;將兩個有序子數組合并為一個有序數組 C語言實現 #includ…

機器學習-CatBoost

參考書籍&#xff1a;《機器學習-公式推導和代碼實現》 官方文檔提供的原生接口代碼參考書籍的P187&#xff5e;P188 簡介 全稱是Categorical Boosting&#xff0c;由俄羅斯搜索引擎巨頭Yandex于2017年提出。突出的優勢是在于可以高效地處理數據中的類別特征 ML中對類別特征…

MPLS 多協議標簽交換

前言&#xff1a; 多協議標簽交換MPLS&#xff08;Multiprotocol Label Switching&#xff09;是一種IP&#xff08;Internet Protocol&#xff09;骨干網技術。MPLS在無連接的IP網絡上引入面向連接的標簽交換概念&#xff0c;將第三層路由技術和第二層交換技術相結合&#xf…

CTF Web PHP弱類型比較與布爾值判斷

題目源碼與注釋 <?php show_source("index.php"); // 顯示自身源碼&#xff0c;方便分析 include("flag.php"); // 包含flag變量 $a $_GET[a]; // 獲取GET參數a&#xff0c;抑制報錯// 關鍵判斷 if($a 0 and $a){echo $flag; …

AntV G6動態連線

完整代碼如下 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AntV G6 動態連線</titl…

puppeteerSharp html轉pdf

部屬到linux 上報錯&#xff1a; Failed to launch browser! /wwwroots/xxx/Chrome/Linux-138.0.7204.92/chrome-linux64/chrome: error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory 問題服務包缺少依賴&…

springBoot接口層時間參數JSON序列化問題,兼容處理

背景&#xff1a;解決前端傳入時間參數格式不固定場景&#xff0c;避免接收參數報錯時間格式不能序列化。一、概述在 Java 后端開發中&#xff0c;處理 JSON 數據時&#xff0c;經常需要對日期時間字段進行反序列化。Java 中常用的日期時間類型是 java.time.LocalDateTime&…

List、Set、Map三者之間的關系

1、數據結構與核心特性接口數據結構順序性唯一性鍵值對null 元素List動態數組/鏈表有序&#xff08;插入順序&#xff09;允許重復否允許多個 nullSet哈希表 / 紅黑樹無序&#xff08;HashSet&#xff09;有序&#xff08;LinkedHashSet/TreeSet&#xff09;不允許重復否僅 Has…

進程控制----進程終止

一、進程終止的核心場景正常終止&#xff08;代碼完整運行完畢&#xff09;成功&#xff1a;進程執行到main函數結束或調用exit()&#xff0c;返回退出碼 0&#xff08;約定為執行成功&#xff09;。失敗&#xff1a;代碼執行完畢但結果異常&#xff0c;返回非零退出碼&#xf…

Milvus docker-compose 部署

文章目錄 前言Milvus docker-compose 部署1. 下載2. 修改配置3. 啟動4. 測試 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在白嫖的…

EveryThing搜索具體路徑下文件中的內容

1.打開EveryThing 2.點擊搜索&#xff0c;選擇高級搜索 3.選擇需要搜索的文件的路徑以及文件中需要包含的內容 4.之后就可以搜索到對應的目標文件