“深入淺出”系列之FFmpeg:(1)音視頻開發基礎

我的音視頻開發大部分內容是跟著雷霄驊大佬學習的,所以筆記也是跟雷老師的博客寫的。

一、音視頻相關的基礎知識

首先播放一個視頻文件的流程如下所示:

FFmpeg的作用就是將H.264格式的數據轉換成YUV格式的數據,然后SDL將YUV顯示到電腦屏幕上

SDL(Simple DirectMedia Layer)庫的作用就是封裝了復雜的視音頻底層交互工作,簡化了視音頻處理的難度。

開發環境配置:如果是在Linux環境下開發,可以使用gcc編譯器,并確保包含FFmpeg和SDL的頭文件和庫文件。在編譯時,需要鏈接FFmpeg和SDL的庫,例如使用-lavformat -lavcodec -lswscale -lavutil -lSDL2等編譯選項。

二、開發相關的基礎知識

1、引入FFmpeg和SDL

FFmpeg解碼函數簡介:

av_register_all():注冊所有組件

avformat_open_input():打開輸入視頻文件

avformat_find_stream_info():獲取視頻文件信息

avcodec_find_decoder():查找解碼器

av_read_frame():打開解碼器

avcodec_decode_video2():從輸入文件讀取一幀壓縮數據

avcodec_close():關閉解碼器

avformat_close_input():關閉輸入視頻文件?

FFmpeg解碼的流程圖如下所示:

SDL視頻顯示函數簡介:

SDL_Init():初始化SDL系統

SDL_CreateWindow():創建窗口SDL_Window

SDL_CreateRenderer():創建渲染器SDL_Renderer

SDL_CreateTexture():創建紋理SDL_Texture

SDL_UpdateTexture():設置紋理的數據

SDL_RenderCopy():將紋理的數據拷貝給渲染器

SDL_RenderPresent():顯示

SDL_Delay():工具函數,用于延時

SDL_Quit():退出SDL系統

?SDL顯示的流程如下所示:

2、初始化FFmpeg和SDL

初始化FFmpeg:使用av_register_all()函數(來注冊所有的編解碼器和格式。初始化其他FFmpeg組件,如解復用器、解碼器等。

初始化SDL:使用SDL_Init()函數初始化SDL,傳入相應的初始化標志,如SDL_INIT_VIDEO以初始化視頻子系統。

3、打開音視頻文件和初始化解碼器

打開輸入文件:使用avformat_open_input()函數打開音視頻文件。

使用avformat_find_stream_info()函數查找音視頻流的信息。

查找音視頻流:獲取音頻流和視頻流的索引,以便后續解碼。

初始化解碼器:使用avcodec_find_decoder()函數查找音頻解碼器和視頻解碼器。使用avcodec_open2()函數打開音頻解碼器和視頻解碼器。

4、創建SDL窗口和渲染器

創建窗口:使用SDL_CreateWindow()函數創建一個窗口,用于顯示視頻。

創建渲染器:使用SDL_CreateRenderer()函數在窗口中創建一個渲染器,用于繪制視頻圖像。

5、循環讀取和解碼音視頻幀

循環讀取幀:使用av_read_frame()函數循環讀取音頻幀和視頻幀。

解碼音頻幀:使用音頻解碼器對音頻幀進行解碼。將解碼后的音頻數據傳遞給SDL的音頻緩沖區,或者通過SDL的音頻回調函數進行處理。

解碼視頻幀:使用視頻解碼器對視頻幀進行解碼。將解碼后的圖像數據轉換為SDL可以處理的格式(如YUV轉RGB)。使用SDL的渲染函數(如SDL_RenderCopy())將圖像數據繪制到渲染器上。

6、更新和顯示音視頻

更新渲染目標:使用SDL_RenderPresent()函數更新渲染目標,將所有繪圖操作呈現到屏幕上。

處理音頻:SDL會自動處理音頻的播放和緩沖區更新,如果使用了音頻回調函數,則需要在回調函數中處理音頻數據的解碼和播放。

7、釋放資源和退出

釋放FFmpeg資源:關閉解碼器、關閉輸入文件等。

釋放SDL資源:銷毀渲染器、銷毀窗口等。

退出SDL:使用SDL_Quit()函數退出SDL。

通過以上步驟,你可以將FFmpeg和SDL集成在一起,實現一個基本的音視頻播放應用程序。當然,這只是一個簡單的示例,實際應用中可能還需要處理更多的細節,如音視頻同步、錯誤處理、資源管理等。

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

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

相關文章

【Linux】Linux開發:GDB調試器與Git版本控制工具指南

Linux相關知識點可以通過點擊以下鏈接進行學習一起加油!初識指令指令進階權限管理yum包管理與vim編輯器GCC/G編譯器make與Makefile自動化構建 在 Linux 開發中,GDB 調試器和 Git 版本控制工具是開發者必備的利器。GDB 幫助快速定位代碼問題,G…

【設計模式-2】23 種設計模式的分類和功能

在軟件工程領域,設計模式是解決常見設計問題的經典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人幫,GoF)在《設計模式:可復用面向對象軟件的基礎》一書中系統性地總結了…

谷粒商城-高級篇完結-Sleuth+Zipkin 服務鏈路追蹤

1、基本概念和整合 1.1、為什么用 微服務架構是一個分布式架構,它按業務劃分服務單元,一個分布式系統往往有很多個服務單元。由于服務單元數量眾多,業務的復雜性,如果出現了錯誤和異常,很難去定位 。主要體現在&#…

小米智能啞鈴上市,代理 IP 視角下的智能健身新篇

在智能科技與健康生活深度融合的時代,小米以其敏銳的市場洞察力和強大的創新能力,不斷拓展智能生態版圖。米家智能啞鈴的發布,無疑是其在智能健身領域的又一重要舉措。而當我們從代理 IP 的獨特視角來審視這一產品,會發現其中蘊含…

基于Python的音樂播放器 畢業設計-附源碼73733

摘 要 本項目基于Python開發了一款簡單而功能強大的音樂播放器。通過該音樂播放器,用戶可以輕松管理自己的音樂庫,播放喜愛的音樂,并享受音樂帶來的愉悅體驗。 首先,我們使用Python語言結合相關庫開發了這款音樂播放器。利用Tkin…

實際開發中,常見pdf|word|excel等文件的預覽和下載

實際開發中,常見pdf|word|excel等文件的預覽和下載 背景相關類型數據之間的轉換1、File轉Blob2、File轉ArrayBuffer3、Blob轉ArrayBuffer4、Blob轉File5、ArrayBuffer轉Blob6、ArrayBuffer轉File 根據Blob/File類型生成可預覽的Base64地址基于Blob類型的各種文件的下載各種類型…

微信小程序中的 storage(本地存儲)和內存是兩個完全不同的存儲區域

這是一個非常關鍵且容易混淆的概念 既然 this.globalData.appId appId 是將 appId 存儲在內存中,為什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存儲)中沒有 appId,并且您提出了一個非常重要的疑問:stor…

【C++數據結構——查找】二叉排序樹(頭歌實踐教學平臺習題)【合集】

目錄😋 任務描述 相關知識 1. 二叉排序樹的基本概念 2. 二叉排序樹節點結構體定義 3. 創建二叉排序樹 4. 判斷是否為二叉排序樹 5. 遞歸查找關鍵字為 6 的結點并輸出查找路徑 6. 刪除二叉排序樹中的節點 測試說明 通關代碼 測試結果 任務描述 本關任務&a…

計算機網絡(第8版)第3章課后習題--透明傳輸

【3-11】 試分別討論以下各種情況在什么條件下是透明傳輸,在什么條件下不是透明傳 輸。(提示:請弄清什么是“透明傳輸”,然后考慮能否滿足其條件。) (1)普通的電話通信。 (2)互聯網提供的電子郵件服務。 解 答 : 透明傳輸是指在數據傳輸…

Linux(17)——使用 DNF 安裝和更新軟件包

目錄 一、使用 DNF 管理軟件包: 1、 DNF 查找軟件: 2、DNF 安裝軟件: 3、DNF 刪除軟件: 二、使用 DNF 管理軟件包組: 1、DNF 顯示組信息: 2、DNF 安裝組: 三、使用 DNF 查看事務歷史記錄…

基于32單片機的智能語音家居

一、主要功能介紹 以STM32F103C8T6單片機為控制核心,設計一款智能遠程家電控制系統,該系統能實現如下功能: 1、可通過語音命令控制照明燈、空調、加熱器、窗戶及窗簾的開關; 2、可通過手機顯示和控制照明燈、空調、窗戶及窗簾的開…

Qt 5.14.2 學習記錄 —— ? 新項目

文章目錄 1、創建2、查看代碼 ---- main.cpp3、查看代碼 ---- widgt.h4、查看代碼 ---- widgt.cpp和widget.ui5、查看代碼 ---- Empty.pro6、運行產生的中間文件 1、創建 左上角的文件,新建文件或項目。如果要寫一個GUI程序,應當選擇Application&#x…

linux wsl配置 redis遠程連接

? 1. 修改 Redis 配置文件 在 WSL 的 Redis 配置文件中,找到 redis.conf 或 /etc/redis/redis.conf 文件,編輯以下配置項: ?? 更新 bind 配置項 將 bind 127.0.0.1 ::1 修改為: bind 0.0.0.0這樣,Redis 將監聽所…

Transformer從零詳細解讀——DASOU講AI

1. 從全局角度概括Transformer transformer的任務是什么? 進一步細化 進一步細化,注意:每個encoder結構相同,參數不同;decoder同理 原論文中的圖如下: 2.Encoder 2.1 輸入部分 (1&#xff09…

ARM發布Armv9.5架構:邁向更強性能與靈活性的新時代

2024年11月30日,ARM正式發布了其最新的Armv9.5架構,這是Arm技術發展的又一重要里程碑。從表中信息來看,Armv9.5架構的發布標志著該公司的架構系列在性能、靈活性和可擴展性方面取得了進一步突破。本次發布不僅是技術上的提升,更是…

【Python運維】使用Python與Docker進行高效的容器化應用管理

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著容器化技術的廣泛應用,Docker已成為現代軟件開發與運維中不可或缺的工具。Docker容器提供了一種輕量級、可移植的方式來部署和管理應用…

分布式系統架構6:鏈路追蹤

這是小卷對分布式系統架構學習的第6篇文章,關于鏈路追蹤,之前寫過traceId的相關內容:https://juejin.cn/post/7135611432808218661,不過之前寫的太淺了,且不成系統,只是簡單的理解,今天來捋一下…

Ubuntu 20.04安裝gcc

一、安裝GCC 1.更新包列表 user596785154:~$ sudo apt update2.安裝gcc user596785154:~$ sudo apt install gcc3.驗證安裝 user596785154:~$ gcc --version二 編譯C文件 1.新建workspace文件夾 user596785154:~$ mkdir workspace2.進入workspace文件夾 user596785154:~…

問題:Flask應用中的用戶會話(Session)管理失效

我來分享一個常見的PythonWeb開發問題: 問題:Flask應用中的用戶會話(Session)管理失效 這是一個在Flask開發中經常遇到的問題。當用戶登錄后,有時會話會意外失效,導致用戶需要重復登錄。 解決方案: 1. 首先&#x…

ansible-性能優化

一. 簡述: 搞過運維自動化工具的人,肯定會發現很多運維伙伴們經常用saltstack和ansible做比較,單從執行效率上來說,ansible確實比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息隊列[暫沒深入了解]),但其實…