ffmpeg編解碼——時間基(time base)概念

文章目錄

  • FFmpeg 編解碼——時間基(Time Base)概念
    • 1. 時間基(Time Base)概念
      • 1.1 定義與作用
      • 1.2 表現形式
    • 2. 時間基在FFmpeg中的應用
      • 2.1 時間戳
      • 2.2 持續時間
    • 3. 理解FFmpeg中的時間基轉換
      • 3.1 `av_rescale_q` 函數
      • 3.2 `av_rescale_q_rnd` 函數
    • 4. 時間基相關操作的代碼示例
    • 5. 用時間基概念分析ffprobe查看視頻文件信息packet中的各字段
      • 1. 使用ffprobe查看視頻信息
      • 2. ffprobe輸出的字段解析
        • 2.1 `pts` 和 `dts`
        • 2.2 `duration`
        • 2.3 `time_base`
        • 2.4 `stream_index`
      • 3. 時間基在ffprobe中的應用
      • 4. 理解幀和數據包

FFmpeg 編解碼——時間基(Time Base)概念

FFmpeg是一個非常強大的開源多媒體處理工具庫。在處理視頻和音頻流時,理解其時間基(Time Base)概念至關重要。這篇文章將分析時間基在FFmpeg中的應用,并以實例代碼進行演示。

1. 時間基(Time Base)概念

1.1 定義與作用

時間基,即Time Base,是用于衡量時間的單位,在多媒體編程中被廣泛使用。對于FFmpeg,它主要用于描述幀率、持續時間和時間戳等概念。簡單地說,時間基是一種將數值時間戳轉化為真實時間(秒)的方式。

1.2 表現形式

時間基通常表現為一個分數,比如1/25,這表示每幀的持續時間為0.04秒(即1除以25)。在FFmpeg的數據結構中,AVStream->time_base字段就用來表示時間基。

2. 時間基在FFmpeg中的應用

2.1 時間戳

在FFmpeg中,時間戳是根據特定的時間基進行計算的。時間戳可以看作是幀在媒體流中的位置或播放時間。例如,如果時間基是1/50,那么時間戳20就代表了該幀位于媒體流的0.4秒處。

2.2 持續時間

持續時間也是根據時間基來計算的。例如,一個視頻片段有50幀,如果時間基是1/25,那么這個視頻片段的持續時間就是2秒(即50乘以1/25)。

3. 理解FFmpeg中的時間基轉換

FFmpeg為我們提供了方便的API進行時間基之間的轉換,主要有av_rescale_qav_rescale_q_rnd兩個函數。這兩個函數可以用于在不同時間基之間轉換時間戳。

3.1 av_rescale_q 函數

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)

該函數的作用是將時間戳從一個時間基轉換到另一個時間基。它會確保結果是最接近原值的整數。

3.2 av_rescale_q_rnd 函數

int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, enum AVRounding)

這個函數和av_rescale_q類似,但它允許用戶選擇四舍五入的方式。

4. 時間基相關操作的代碼示例

以下是一個使用FFmpeg API處理時間基的簡單示例:

AVFormatContext *fmt_ctx;
AVStream *stream;
int64_t timestamp;// 假設fmt_ctx和stream已經被正確初始化timestamp = av_rescale_q(stream->cur_dts, stream->time_base, AV_TIME_BASE_Q);

在這個示例中,av_rescale_q函數用于將當前解碼時間戳(DTS)從流的時間基轉換為全局時間基。

5. 用時間基概念分析ffprobe查看視頻文件信息packet中的各字段

ffprobe是一個非常實用的工具,它能夠提供媒體文件(如視頻和音頻)的詳細信息。

1. 使用ffprobe查看視頻信息

要查看視頻文件的信息,我們可以使用以下命令:

ffprobe -show_packets video.mp4

這條命令將顯示視頻文件中所有包的信息。

2. ffprobe輸出的字段解析

下面是ffprobe可能輸出的一些字段,以及它們的含義:

2.1 ptsdts

pts(Presentation Time Stamp)和dts(Decoding Time Stamp)表示每個數據包應該何時被展示和解碼。它們的值都是相對于時間基的。

2.2 duration

duration字段表示數據包的持續時間,同樣是相對于時間基的。

2.3 time_base

time_base字段就是我們前面討論的時間基,它為上述時間戳和持續時間提供了參考。

2.4 stream_index

stream_index字段表示當前數據包屬于哪個流。例如,對于多語言電影,可能有多個音頻流。

3. 時間基在ffprobe中的應用

時間基在ffprobe輸出中起著至關重要的作用。通過將ptsdtsduration乘以時間基,我們可以得到實際的展示、解碼和持續時間。

例如,如果一個數據包的pts是18000,time_base是1/90000(這是很常見的視頻時間基),那么該數據包應在0.2秒處被展示。

pts (in seconds) = pts * time_base = 18000 * 1/90000 = 0.2

4. 理解幀和數據包

在FFmpeg中,數據包(packet)和幀(frame)是兩個不同的概念。一幀通常對應于一個完整的圖像,而一個數據包可能包含多個幀,或者一個幀的一部分

這意味著我們不能僅根據數據包的數量來計算視頻的總時長。正確的做法是將每個數據包的duration相加,然后乘以time_base

total_duration (in seconds) = sum(duration for each packet) * time_base

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

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

相關文章

Shell數組函數:數組——數組和循環(四)

使用數組統計&#xff0c;用戶shell的類型和數量 一、腳本編輯 [root192 ~]# vim shell.sh #!/bin/bash declare -A shells while read ii dotypeecho $ii | awk -F: {print $7}let shells[$type] done < /etc/passwdfor i in ${!shells[]} doecho "$i: ${shells[$i]…

多任務學習(Multi-Task Learning)和遷移學習(Transfer Learning)的詳細解釋以及區別(系列1)

文章目錄 前言一、多任務學習&#xff08;Multi-Task Learning&#xff09;是什么&#xff1f;二、多任務學習&#xff08;Multi-Task Learning&#xff09;對數據的要求三、遷移學習是什么&#xff1f;四&#xff0c;遷移學習對數據的要求五&#xff0c;多任務學習與遷移學習的…

DevOps - Spug 自動化運維平臺

關于Spug Spug&#xff1a;麻雀&#xff0c;麻雀雖小&#xff0c;五臟俱全。 Spug是面向中小型企業設計的輕量級無Agent的自動化運維平臺&#xff0c;整合了主機管理、主機批量執行、主機在線終端、文件在線上傳下載、應用發布部署、在線任務計劃、配置中心、監控、報警等一系…

利用jdbc對數據庫進行增刪改查

步驟/過程&#xff1a; 1&#xff0c;導入驅動包 2&#xff0c;加載驅動包 3&#xff0c;輸入信息&#xff0c;進行數據庫連接 4&#xff0c;創建 statement對象 5&#xff0c;執行sql語句 6&#xff0c;如果是查詢操作&#xff0c;利用ResultSet處理數據&#xf…

智能優化算法應用:基于鯨魚算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于鯨魚算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于鯨魚算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.鯨魚算法4.實驗參數設定5.算法結果6.參考文獻7.MA…

Python-pdf工具自制(合并、拆分、刪除)

pdf工具&#xff0c;之前寫的合并工具有點麻煩&#xff0c;使用PyQt5庫重寫合并拆分和刪除指定頁面的程序 實現如圖&#xff1a; 代碼&#xff1a; import sysimport osfrom PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDia…

java 好碼

1【強制】不要在 foreach 循環里進行元素的 remove/add 操作。 remove 元素請使用 Iterator方式&#xff0c;如果并發操作&#xff0c;需要對 Iterator 對象加鎖。 正例&#xff1a; List<String> list new ArrayList<>(); list.add("1");list.add(…

unity 2d 入門 飛翔小鳥 Cinemachine 記錄分數(十二)

1、創建文本 右鍵->create->ui->leagcy->text 2、設置字體 3、設置默認值和數字 4、當切換分辨率&#xff0c;分數不見問題 拖拽這里調整 調整到如下圖 5、編寫得分腳本 using System.Collections; using System.Collections.Generic; using UnityEngine; …

Docker網絡架構介紹

本文主要介紹了Docker容器的單機網絡架構與集群網絡架構&#xff0c;輔以演示&#xff0c;并簡單介紹了網絡管理中的命令。 前文&#xff1a; Docker的安裝與簡單操作命令-CSDN博客 docker網絡原理介紹 與ovs類似&#xff0c;docker容器采用veth-pair linux bridge (虛擬交…

mysql語句練習

1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數 SELECT student.*,s1.s_score,s2.s_score FROM student,score s1,score s2 WHERE student.s_ids1.s_id AND student.s_ids2.s_id AND s1.c_id01 AND s2.c_id02 AND s1.s_score>s2.s_score 2、…

0007Java程序設計-ssm基于微信小程序的在線考試系統

文章目錄 **摘要**目 錄系統實現開發環境 編程技術交流、源碼分享、模板分享、網課分享 企鵝&#x1f427;裙&#xff1a;776871563 摘要 網絡技術的快速發展給各行各業帶來了很大的突破&#xff0c;也給各行各業提供了一種新的管理技術&#xff0c;基于微信小程序的在線考試…

Linux下apisix離線安裝教程

Linux下apisix離線安裝教程 一、首先需要安裝etcd&#xff1a;二、通過rpm離線安裝apisix三、啟動apisix四、安裝apisix-dashboard1、安裝2、更改dashboard登錄賬號名和密碼3、運行 一、首先需要安裝etcd&#xff1a; 解壓縮etcd后執行以下命令&#xff1a; tar -xvf etcd-v3.…

C#注冊表技術及操作

目錄 一、注冊表基礎 1.Registry和RegistryKey類 &#xff08;1&#xff09;Registry類 &#xff08;2&#xff09;RegistryKey類 二、在C#中操作注冊表 1.讀取注冊表中的信息 &#xff08;1&#xff09;OpenSubKey()方法 &#xff08;2&#xff09;GetSubKeyNames()…

內外聯動——記建行江門鶴山支行營業部堵截一起新型騙局

建設銀行廣東省江門市分行&#xff08;以下簡稱“江門建行”&#xff09;認真貫徹落實黨中央、國務院決策部署&#xff0c;緊緊圍繞當地市委工作部署和上級行要求&#xff0c;扛牢國有大行責任&#xff0c;堅守金融工作的政治性、人民性&#xff0c;以深化新金融行動助力江門全…

javascript實現List列表數據結構

書籍推薦 有幸拜讀《數據結構與算法Javascript描述》這本書&#xff0c;先強烈安利一波&#xff01;非常感謝作者大大給我們前端領域帶來這本書。 全書從javascript的角度出發&#xff0c;簡單明了的分析了數據結構在javascript領域的實現過程與實際的應用案例&#xff0c;且…

postgres 登錄及常用命令

登陸 輸入以下命令&#xff0c;嘗試登錄psql: psql -U postgres 報告以下錯誤&#xff1a; psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres" 換成下面…

Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

報錯&#xff1a; OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performan…

差異計算基礎知識 - 了解期末業務操作、WIP 和差異

原文地址&#xff1a;Basics of variance calculation-Understanding Period End activities, WIP and Variances | SAP Blogs 大家好&#xff0c; 這是我在成本核算方面的第六份文件&#xff0c;旨在解釋期末的差異計算和相關活動。 我將引導您完成期末活動和差異計算。在本文…

MySQL char 尾隨空格丟失與右側空格填充

今天看《高性能MySQL(第四版)》,講char,varchar時說“當存儲CHAR值時&#xff0c;MySQL刪除所有尾隨空格。如果需要進行比較&#xff0c;值會用空格填充。”感覺這兩句話有沖突啊&#xff0c;便研究了下。 對于具體的問題&#xff0c;當然官方文檔是最好的&#xff0c;The CHAR…

【性能測試】Jmeter 配置元件(一):計數器

Jmeter 配置元件&#xff08;一&#xff09;&#xff1a;計數器 在 Jmeter 中&#xff0c;通過函數 ${__counter(,)} 可以實現每次加 1 1 1 的計數效果。但如果步長不為 1 1 1&#xff0c;則要利用到我們的計數器。 函數作用${__counter(,)}計數器&#xff0c;每次加 1${__d…