我的音視頻開發大部分內容是跟著雷霄驊大佬學習的,所以筆記也是跟雷老師的博客寫的。
一、音視頻相關的基礎知識
首先播放一個視頻文件的流程如下所示:
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集成在一起,實現一個基本的音視頻播放應用程序。當然,這只是一個簡單的示例,實際應用中可能還需要處理更多的細節,如音視頻同步、錯誤處理、資源管理等。