ffmpeg播放音視頻流程

文章目錄

    • 🎬 FFmpeg 解碼播放流程概覽(以音視頻文件為例)
      • 1?? 創建結構體
      • 2?? 打開音視頻文件
      • 3?? 查找解碼器并打開解碼器
      • 4?? 循環讀取數據包(Packet)
      • 5?? 解碼成幀(Frame)
      • 6?? 播放 / 顯示 / 播放音頻
      • 7?? 清理資源
    • ? 總結一句話流程:


🎬 FFmpeg 解碼播放流程概覽(以音視頻文件為例)

1?? 創建結構體

準備容器結構體,用于打開媒體文件并讀取信息

  • 創建 AVFormatContext

    AVFormatContext *fmt_ctx = NULL;
    
  • 【可選】使用 avformat_alloc_context 手動分配(很多時候由 avformat_open_input 自動完成)


2?? 打開音視頻文件

打開媒體文件并讀取格式頭部信息

  • 使用 avformat_open_input() 打開文件
  • 使用 avformat_find_stream_info() 讀取流信息(視頻流、音頻流)

3?? 查找解碼器并打開解碼器

  • 遍歷 fmt_ctx->streams[i],找到視頻流和音頻流的索引
  • 獲取 AVCodecParameters
  • 使用 avcodec_find_decoder() 找到對應的解碼器
  • 使用 avcodec_alloc_context3() 創建解碼器上下文 AVCodecContext
  • 使用 avcodec_parameters_to_context() 拷貝參數
  • 使用 avcodec_open2() 打開解碼器

4?? 循環讀取數據包(Packet)

將原始的壓縮音視頻數據讀取出來

  • 使用 av_read_frame() 讀取 AVPacket
  • 判斷 packet.stream_index 來區分是視頻包還是音頻包

5?? 解碼成幀(Frame)

將壓縮包解碼成原始幀

  • 使用 avcodec_send_packet()AVPacket 發送給解碼器
  • 使用 avcodec_receive_frame() 獲取解碼后的 AVFrame

6?? 播放 / 顯示 / 播放音頻

這一步跟平臺相關:

  • 視頻幀可以用 SDL、OpenGL、Qt 等顯示
  • 音頻幀可以送給音頻設備播放(如 SDL、PortAudio、ALSA)

7?? 清理資源

  • av_packet_unref()av_frame_unref() 用于復用
  • avcodec_free_context() 釋放解碼器上下文
  • avformat_close_input()avformat_free_context() 釋放格式上下文

? 總結一句話流程:

創建結構體 → 打開文件 → 查找流 → 找解碼器 → 解碼成幀 → 播放 → 釋放資源


在這里插入圖片描述

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

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

相關文章

在 Wireshark 中如何篩選數據包

1. 顯示過濾器(Display Filters) 顯示過濾器用于 在已捕獲的數據包中篩選,語法類似于編程語言中的條件表達式。 (1)基本過濾 表達式說明ip.addr 192.168.1.1顯示所有涉及 192.168.1.1 的 IP 包ip.src 192.168.1.1…

ES6 新增特性 箭頭函數

簡述: ECMAScript 6(簡稱ES6)是于2015年6月正式發布的JavaScript語言的標準,正式名為ECMAScript 2015(ES2015)。它的目標是使得JavaScript語言可以用來編寫復雜的大型應用程序,成為企業級開發語…

Python數據可視化-第7章-繪制3D圖表和統計地圖

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容,本章為第7章 繪制3D圖表和統計地圖 本章首先介紹了使用mplot3d工具包繪制3D圖表,然后介紹了使用animation模塊制作動畫&#…

【從零開始學習JVM | 第二篇】HotSpot虛擬機對象探秘

對象的創建 1.類加載檢查 虛擬機遇到一條new的指令,首先去檢查這個指令的參數能否在常量池中定位到這個類的符號引用,并且檢查這個符號引用代表的類是否已被加載過、解析和初始化過。如果沒有,那必須先執行類的加載過程。 2.分配內存 在類…

Oracle 表空間高水位收縮全攻略

1. 概述 本文檔是針對某個特定用戶表空間收縮的文檔,實際操作要結合生產庫具體情況。主要包括以下幾個流程: 收集當前數據庫相關信息降低數據庫表高水位線Resize 收縮數據文件 具體細節詳見以下章節。 2. 時間規劃 操作類型預估時間實際時間數據庫信…

Pytest多環境切換實戰:測試框架配置的最佳實踐!

你是否也遇到過這種情況:本地測試通過,一到測試環境就翻車?環境變量錯亂、接口地址混亂、數據源配置丟失……這些「環境切換」問題簡直像定時炸彈,隨時引爆你的測試流程! 測試人員每天都跟不同的環境打交道&#xff0…

藍橋杯賽前題

開始每個人能量為3 答題了&#xff0c;答題者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…

VSCode優雅的使用debug

原始用法&#xff1a;(這里不使用) 配置launch.json&#xff0c;里面傳入參數然后debug&#xff0c;這里我們通常需要傳入的參數比較多&#xff0c;而且經常修改參數&#xff0c;直接去修改launch.json會比較麻煩&#xff0c;所以使用sh腳本比較方便。 {// Use IntelliSense to…

oracle常見問題處理集錦

oracle常見問題處理集錦 oracle常見問題處理集錦ORA-03001:未實施的功能ORA:28000 the count is locked oracle常見問題處理集錦 ORA-03001:未實施的功能 問題 ORA-03001:未實施的功能 在datagrip中修改表名稱&#xff0c;使用的語法是&#xff1a; rename old_name to new_n…

項目日志配置模板示例

1.新增application.properties配置 logging.configclasspath:logback-spring.xml spring.profiles.activedev 將項目部署到服務器時需要將dev修改為test后再進行打包部署 2.新增logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <…

2025年第十八屆“認證杯”數學中國數學建模網絡挑戰賽【BC題】完整版+代碼+結果

# 問題一&#xff1a;隨機森林回歸from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 問題二&#xff1a;LSTM時間序列預測from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…

C語言實現TcpDump

一、 在 C 語言中實現 TCP 抓包功能&#xff0c;通常可以使用 libpcap 庫。libpcap 是一個廣泛使用的網絡抓包庫&#xff0c;它提供了捕獲網絡數據包的接口。 libpcap 是一個廣泛使用的 C 語言庫&#xff0c;用于捕獲和過濾網絡數據包。它提供了一個通用接口&#xff0c;用于訪…

Spark-Core編程

sortByKey算子&#xff1a;對(K, V)型RDD按key排序&#xff0c;K需實現Ordered接口&#xff0c;可指定升序或降序及分區數。 join算子&#xff1a;連接兩個(K, V)和(K, W)型RDD&#xff0c;返回(K, (V, W))型RDD 。 leftOuterJoin算子&#xff1a;類似SQL左外連接&#xff0c;返…

閱讀MySQL實戰45講第9天

目錄 一、你的 SQL 語句為什么變“慢” 二、什么情況會引發數據庫的 flush 過程&#xff1f; 三、分析上面四種場景對性能的影響 四、InnoDB 刷臟頁的控制策略 五、原作者小結&#xff1a; 引言&#xff1a; 一條 SQL 語句&#xff0c;正常執行的時候特別快&#xff0c;但是有時…

cin,cin.get(),getchar(),getline(),cin.get line()異同點

文章目錄 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等價于cin.operator>>()&#xff0c;即調用成員函數operator>>()進行讀取數據。 &#xff08;2&#xff09;當cin>>從緩沖區中讀取數據時&…

VMware虛擬機Ubuntu磁盤擴容

VMware中操作&#xff1a; 選擇要擴容的虛擬機&#xff0c;點擊編輯虛擬機設置 打開后點擊磁盤——>點擊擴展&#xff08;注意&#xff1a;如果想要擴容的話需要刪除快照&#xff09; 調整到你想要的容量 點擊上圖的擴展——>確定 然后我們進到虛擬機里面 首先&#…

卷積神經網絡(CNN)可視化網站匯總

深度學習 文章目錄 深度學習前言CNN ExplainerDeep Learning PlaygroundConvNetJSUnderstanding CNN with Interactive Visualizations3Blue1Brown Neural Networks YouTube PlaylistDistill.pubTensorFlow CNN Visualization (TensorBoard)NN-SVGOpenAI Microscope 前言 匯總…

實習技能記錄【3】-----Git操作

1. Git是什么 Git 是一個分布式版本控制系統 (Distributed Version Control System, DVCS)。 它的核心目標是跟蹤文件的變化&#xff0c;讓你能夠隨時記錄、回溯、協作和管理你的項目。 2. 介紹 2.1 Git 工作區、暫存區、本地倉庫介紹 區域名稱英文名說明相關命令工作區Wor…

藍橋杯單片機刷題——按鍵設置當前采集距離為距離參數

設計要求 驅動超聲波傳感器&#xff0c;啟動距離測量功能,并將其結果顯示到數碼管上。 按鍵“S5”定義為參數按鍵&#xff0c;按下S5按鍵&#xff0c;設備自動將當前采集的距離數據作為距離參數&#xff1b; 若測量的距離數據超過距離參數&#xff0c;指示燈L1點亮&#xff…

KV Cache大模型推理加速功能

KV Cache KV Cache是大模型標配的推理加速功能&#xff0c;也是推理過程中&#xff0c;顯存資源巨大開銷的元兇之一。在模型推理時&#xff0c;KV Cache在顯存占用量可達30%以上。 目前大部分針對KV Cache的優化工作&#xff0c;主要集中在工程上。比如著名的VLLM&#xff0c…