音視頻采集推流時間戳記錄方案

音視頻同步更多文章

深入理解音視頻pts,dts,time_base以及時間數學公式_視頻pts計算-CSDN博客

ffplay音視頻同步分析_ffplay 音視頻同步-CSDN博客

音視頻采集打時間戳設計

實時音視頻數據的采集和處理場景。具體來說:

采集階段:

  • 在音視頻數據采集過程中,需要為每一幀數據計算出時間戳。
  • 可以采用"起始時間=系統時間"的方式,計算第一幀的時間戳,后續幀按照固定的幀間隔累加得到。
  • 同時引入動態校正機制,檢測累計時間戳與系統時間的偏差,及時修正時間戳。

傳輸階段:

  • 將計算好的時間戳與音視頻數據一起傳輸到客戶端。

播放階段:

  • 客戶端接收到數據后,先將其緩存一段時間。
  • 然后根據附帶的時間戳信息,按照正確的時間順序進行播放。
  • 客戶端可以進一步利用時間戳信息來調整緩沖區,以適應網絡環境的變化。

這種時間戳設計方案的核心思路就是:

  1. 在采集端盡量保證時間戳的準確性和穩定性。后續講解如何設計穩定和準確的方案
  2. 將時間戳信息傳輸到客戶端,利用它來進行緩沖和時間校正。
  3. 通過客戶端和服務器端的協作,最終實現音視頻數據的平滑播放。

????????這是實時音視頻領域常用的一種時間戳管理策略,能夠很好地應對系統負載變化、小數誤差累積等問題。

方案推導

第一方案?直接系統時間模式


初始化 starttime = systime
frameTimeStamp = systime - start time
缺陷:涉及到音頻硬件采樣不穩定,操作系統調度和網絡傳輸的時間,導致ts準確度不夠問題且沒用糾正機制。


第二種方案?幀間隔模式


初始化 starttime = systime
frameTimeStamp = current systime - start time
Compute TimeStamp = last FrameTimeStamp + duration

優點:能輸出frame duration穩定的音視頻時間戳。
缺陷:

  • 系統負載過高時,實際幀采集間隔可能與理論設定不一致。這將導致計算出的時間戳與實際情況不符,影響播放效果。
  • 幀間隔涉及到無限小數時,會隨時間累積產生較大的誤差。例如預計30幀,通常按幀間隔33毫秒處理,但實際是33.3333333毫秒。累積3333幀(約111秒)就出現1秒的誤差。


第三種方案? 幀間隔+直接系統時間模式


初始化 starttime = systime? ? ? ? ? ? ? ? ????????????????????????????????????????//起始時間=系統時間
frameTimeStamp = current systime - start time? ? ? ?????????????????//第一幀時間戳= 系統時間–起始時間
Compute TimeStamp = last FrameTimeStamp + duration? ? ? ?//后續幀TimeStamp=上一幀時間戳+ 幀間隔

?T = current systime? -? starttime? ? ?//當前系統時間 – 起始時間?
if( |Compute TimeStamp - T | ?>= duraiton/2 ) ?Compute TimeStamp? = last FrameTimeStamp

//如果當前幀的計算時間戳(CurrentFrameTS)與系統時間差值(T)的絕對值大于等于一個半幀間隔,那么我們就應該將當前幀的時間戳直接設置為系統時間差值T。?


解決:動態糾正,在第二方案基礎上,解決了隨著播放幀數,時間戳落后或提前現象。落點值 =??T = current systime? -? starttime? ? ?//當前系統時間 – 起始時間。關鍵點是設置一個合理的校正閾值,這里我們使用了半幀間隔。

優點:能夠實時糾正時間戳,只要系統正常運轉,就能立即恢復正確的時間戳。

缺陷:幀間隔不均勻,能否正常播放依賴于終端解決方案。 比如,假如音頻一幀間隔為24毫秒,被采集的回調時間可能為20 毫秒,28毫秒,27毫秒,21毫秒。

終端解決這個問題,可以從以下幾個方面著手:

在客戶端使用自適應緩沖機制:

  • 根據實際采集幀率的波動情況,動態調整緩沖區大小,盡量平滑播放。

在服務器端進行幀率轉換:

  • 服務器可以對不同幀率的數據進行幀率轉換,輸出穩定的幀率。
  • 這樣可以屏蔽掉客戶端設備性能的影響。

使用更加先進的時間戳校正算法:

  • 例如利用機器學習等方法,預測并修正時間戳的偏差。

?

采集時間戳同步問題分析

在使用幀間隔+直接系統模式基礎上,發送端時間戳記錄:

  • 記錄每一幀音視頻數據的pts時間戳和pts_duration幀間隔
  • 同時記錄相鄰幀之間的系統時間間隔 sys_duration
  • 這樣可以分析在采集階段,幀間隔的穩定性

分析發送端時間戳:

  • (1) ptsd(pts_duration)波動大,說明采集幀間隔不穩定,可能是由于系統負載波動等因素引起的
    • ???????幀間隔 pts_duration 波動很大,那么意味著每幀數據被實際采集的時間間隔是不穩定的。這通常是由于系統負載波動、硬件性能波動等因素引起的,導致采集過程不夠穩定。
  • (2) pts穩定,但sysd(sys_duration)波動大,說明在數據發送過程中,速率不夠穩定可能是網絡傳輸過程中出現了抖動.
    • ???????這里的 pts 時間戳是相對穩定的,意味著數據在采集端生成時間戳是比較準確的。但是,相鄰幀之間的系統時間間隔 sys_duration 卻出現了波動,說明在數據發送過程中,速率不夠穩定。這種情況通常是由于網絡傳輸過程中出現了抖動,導致實際發送速率不夠平滑。
  • (3) sysd和ptsd的值應該較為一致,如果兩者差異較大,說明在整個采集-傳輸過程中存在問題
  • ???????比如: [send]audio:1-pts:20ms-ptsd:24ms; sysd=23ms

接收端時間戳記錄:

  • 接收到的幀信息包含: 幀序號、pts時間戳、pts_duration幀間隔
  • 同樣記錄了相鄰幀的系統時間間隔 sys_duration

分析接收端時間戳:

  • (1) ptsd(pts_duration)波動大,說明采集幀間隔不穩定
  • (2) pts穩定,但sysd(sys_duration)波動大。說明在數據發送過程中,速率不夠穩定
  • 比如: [recv] audio:1-pts:20ms-ptsd:24ms; sysd=23ms 200ms

總結核心思路是:

  • 在發送端和接收端同時記錄時間戳信息,包括pts時間戳和系統時間
  • 通過對這些時間戳數據的分析,可以全面診斷出音視頻同步過程中的各種問題
    • ptsd異常 采集端的幀間隔不穩定
    • pts穩定下 sysd異常 推流端的數據傳輸速率不穩定,存在網絡傳輸過程中的抖動。

?

?學習資料分享

0voice · GitHub

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

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

相關文章

Spark Runtime Filter

Runtime Filter 參考鏈接: https://docs.google.com/document/d/16IEuyLeQlubQkH8YuVuXWKo2-grVIoDJqQpHZrE7q04/edit?tabt.0https://www.modb.pro/db/557718https://issues.apache.org/jira/browse/SPARK-32268https://github.com/apache/spark/pull/35789https…

從0入門自主空中機器人-1【課程介紹】

關于本課程: 本次課程是一套面向對自主空中機器人感興趣的學生、愛好者、相關從業人員的免費課程,包含了從硬件組裝、機載電腦環境設置、代碼部署、實機實驗等全套詳細流程,帶你從0開始,組裝屬于自己的自主無人機,并讓…

專業140+總分410+南京大學851信號與系統考研經驗南大電子信息通信集成電路,真題,大綱。參考書。

本人本科中等211,離保送本校差一點,考研前糾結本校還是追求更高目標,和家人聊了自己的想法,感謝父母對我的支持,堅定報考南大的目標,最終專業851信號與系統140,總分410順利被南京大學錄取&#…

【C++】初識C++之C語言加入光榮的進化(上)

寫在前面 本篇筆記作為C的開篇筆記,主要是講解C關鍵字(C98)連帶一點點(C11)的知識。掌握的C新語法新特性,當然C是兼容C的,我們學習C的那套在C中也是受用。 ps:點我跳轉下集 文章目錄 寫在前面一、命名空間域1.1、命名空間域的定義與使用1.2…

CGAL windows 安裝教程

1.下載源代碼 CGAL官網下載https://github.com/CGAL/cgal/releases 2.下載boost庫 BOOST官網下載https://www.boost.org/ 3.下載 GMP and MPFR 4.配置VS2022 頭文件: 庫路徑 做完以上步驟,可以使用CGAL了!

從0入門自主空中機器人-2-2【無人機硬件選型-PX4篇】

1. 常用資料以及官方網站 無人機飛控PX4用戶使用手冊(無人機基本設置、地面站使用教程、軟硬件搭建等):https://docs.px4.io/main/en/ PX4固件開源地址:https://github.com/PX4/PX4-Autopilot 飛控硬件、數傳模塊、GPS、分電板等…

每天40分玩轉Django:Django緩存

一、Django緩存概述 在高并發的Web應用中,緩存是提高性能的重要手段。通過緩存頻繁訪問的數據,可以顯著減少數據庫查詢和渲染模板的時間,從而加快響應速度,提升用戶體驗。Django提供了多層級的緩存方案,可以靈活地滿足不同場景下的緩存需求。 Django支持的緩存方式包括: 視圖…

GraphRAG 框架哪家強?選擇最適合你智能問答系統的框架

GraphRAG 框架哪家強?選擇最適合你智能問答系統的框架 點擊進入:GraphRAG系列文章-Nano-GraphRAG:打造輕量級醫療診斷助手 點擊進入:GraphRAG系列文章-突破傳統知識管理瓶頸:LlamaIndex GraphRAG 讓企業知識問答更智能…

Mac電腦python多版本環境安裝與切換

我當前是python3.9.6環境,需要使用3.9.8環境,通過brew安裝3.9.8版本,然后通過pyenv切換環境 步驟 1: 安裝 pyenv brew install pyenv brew install pyenv-virtualenv 步驟 2: 安裝 Python 3.9.8(使用 pyenv 安裝指定版本的 Pyth…

Redis--持久化策略(AOF與RDB)

持久化策略(AOF與RDB) 持久化Redis如何實現數據不丟失?RDB 快照是如何實現的呢?執行時機RDB原理執行快照時,數據能被修改嗎? AOF持久化是怎么實現的?AOF原理三種寫回策略AOF重寫機制 RDB和AOF合…

C高級:思維導圖Day2

目錄 總覽1 總覽2 總覽1 壓縮與解壓縮 打包與解包 軟連接與硬鏈接 ubuntu下關機與重啟指令 總覽2 結束

pwntools用法

pwntools 是一個Python庫, 用于編寫二進制漏洞利用(exploitation)腳本 功能: 遠程連接和本地連接: 支持通過TCP/UDP連接遠程服務或與本地進程進行交互。Shellcode和ROP鏈構造: 提供了便捷的工具來生成和利…

【每日學點鴻蒙知識】placement設置top、組件攜帶自定義參數、主動隱藏輸入框、Web設置字體、對話框設置全屏寬

1、popup組件placement設置top沒有生效? 可以用offset屬性將popup往下邊偏移一下 來規避 2、組件攜帶自定義參數的接口是哪個? 參考鏈接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-…

PyTorch快速入門教程【小土堆】之優化器

視頻地址優化器(一)_嗶哩嗶哩_bilibili import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR1…

數據庫篇:mysql內置函數

前言 sql 是程序開發員繞不開的一項技能,而mysql是當前最流行的數據庫,熟知其內置的一些函數,可以使我們平時的開發工作更加順暢和方便 時間日期函數 字符串函數 數學計算相關函數 條件判斷函數 加密和壓縮函數 聚合函數 格式或類型轉…

C# 中 Webclient和Httpclient

在C#中,WebClient和HttpClient,這兩個類都是用于發起HTTP請求的客戶端,它們在使用API上傳文件或數據時有不同的優缺點和應用場景。在C#中WebClient是一種較早的網絡客戶端,而HttpClient是后期提供的更現代的、功能更強大的HTTP客戶…

權限獲得第一步

權限獲得第一步 下載打開附件 給了一串加密的密文 一般都是用MD5加密,每一段分別解碼一下 第一段不行,試一下第二段 這里發現第二段可以解碼出來,這應該就是密碼了 flag{3617656}

HTML 輪播圖(Carousel)詳細講解

HTML 輪播圖(Carousel)詳細講解 輪播圖(Carousel)是一種常見的用戶界面組件,用于在同一位置展示多個圖像或內容,允許用戶通過滑動或自動播放的方式查看不同的內容。它通常用于展示產品、圖片、廣告等。 1…

25秋招面試總結

秋招從八月底開始,陸陸續續面試了不少,現在也是已經塵埃落定,在這里做一些總結一些我個人的面試經歷 騰訊 騰訊是我最早面試的一家,一開始撈我面試的是數字人民幣,安全方向的崗位,屬于騰訊金融科技這塊。…

一份關于 Ubuntu 系統下代理配置的故障排查筆記

Ubuntu 網絡代理配置與故障排查指南 在使用 Ubuntu 系統時,配置網絡代理可以幫助提升網絡訪問速度或突破網絡限制。然而,代理配置過程中可能會遇到各種問題。本文將詳細介紹如何在 Ubuntu 下配置網絡代理,并提供故障排查的步驟和解決方案。 …