從零開始學習音視訊程式設計技術(七) FFMPEG Qt視訊播放器之SDL的使用
前面介紹了使用FFMPEG+Qt解碼視訊並顯示。
現在我們就著手給它加上聲音播放。
播放聲音有很多種方式:
以windows系統為例,可以使用如下方法播放音訊:
1.直接呼叫系統API的wavein、waveout等函式
2.使用directsound播放
這些方法都只能在windows上使用,且相當難用(至少我這麼覺得),這個對於新手來說要把它們用好並穩定執行比較難。
想想我們使用FFMPEG的經驗,理論上應該也有現成的庫用來播放音訊的,百度了下,基本上有下面幾個主流的音訊開源庫:
1:OpenAL:這個庫比較好,強大,跨平臺,不過這個庫的資料相對比較少。LGPL;
2:PortAudio:這個庫也很不錯,介面簡單,方便獲取 裝置,播放音訊。沒有看到硬體混音介面,或許多開幾個播放介面就可以實現。GPL,但是可以不開源自己的程式,其官方網站是這麼寫的,除非是我理解錯了。可以登入其官方網站檢視版權。
3:SDL:很有名的跨平臺庫,可惜音訊方面,目前不支援採集音訊裝置,不過SDL2.0中已經保留介面了,應該以後會實現,不知道要到那個版本了。
4:SDL_audioin:如果你留心,應該可以找到這個庫,應為SDL不支援硬體裝置音訊採集,這個可以獲取裝置聲音。雖然跨平臺,可是不支援 蘋果系統、iso當然也不支援,具體
其中OpenAL、ProtAudio和SDL這三個庫 我都有用過,覺得還是SDL比較好用,因此我們使用SDL來播放音訊。
使用SDL的好處:
1.網上資料多,學習起來方便
2.跨平臺,Windows、Linux、Android、IOS通吃,基本上這4個系統就夠我們用了。
意味著我們可以使用相同的程式碼在這些系統上直接執行。
3.庫體積相對比較小
SDL有一個缺點就是不能夠採集音訊,但是像安卓、IOS這樣的系統,在採集音訊的時候還是推薦直接用他們的API採集,因此我們完全可以容忍SDL不能採集音訊這個缺點。
並且FFMPEG是支援採集音訊的,必要的時候我們也可以直接使用FFMPEG採集。
SDL本身是一個多媒體庫,其最強大的地方不是在音訊上,而是在圖形圖形上。
那麼,為何我們前面不使用SDL顯示視訊呢?
在使用SDL的過程中,我發現,將SDL嵌入我們的窗體之後,窗體上方的控制元件樣式會失效(比如QSS樣式),這就意味著,放在窗體上方的按鈕或者其他控制元件不能夠透明。而我們的播放器當然需要在播放介面上放一個帶透明度的控制欄啦。而且目前也找不到好的解決方法,無奈之下,只好將影象顯示改成直接用繪圖的方法繪製在控制元件上。當然了,直接繪製的方法在效率上也不會差。因此就這麼幹了。
所以我們只是使用SDL用來播放音訊,也算是大材小用了,不過管他呢,好用才是硬道理! 省事才是王道!
本篇文章我們不急著在上次的例子上加入音訊,而是先講解下如何使用SDL。
現在我們就開始使用SDL吧:
下面的例子講解了如何使用FFMPEG+SDL播放一個音訊檔案。
一、首先下載SDL
我們現在都是在Windows系統下使用,因此直接下載編譯好的版本就行了。
基本上的庫Windows的版本都有提供已經編譯好的版本,SDL也是如此:
我們用的是mingw的編譯器,因此選擇下載mingw的版本。
同時我們我們前面配置的編譯器是32位的,因此要選擇32位的版本。
二、引用SDL
當然在這之前,你需要先新建一個Qt工程,怎麼新建就不說了,請參考前面的文章,懶得動手的話,請直接下載本文末尾的提供的工程吧。
不過學習的時候偷懶不是一個好習慣,而開發的時候偷懶就是強烈推薦的,比如儘量選用現成的東西來實現我們的功能,而不是啥都自己動手,比如這裡我們選擇SDL來播放音訊。
這裡我們要實現的是使用FFMPEG+SDL來播放音訊檔案,
為此也需要加入FFMPEG,FFMPEG的引用請參考這篇文章:
這個步驟就不上截圖了,引用SDL過程中如有疑問請參考前面引用FFMPEG的步驟。
SDL下載完成後,首先將LIB庫解壓出來。
一樣的方法,改名成SDL2,並只留下include和lib 這2個資料夾。
將SDL2拷貝到工程目錄下,在工程的pro檔案中加入:
1 2 3 4 5 6 7 8 9 10 11 12 |
INCLUDEPATH += $$PWD/ffmpeg/include \
$$PWD/SDL2/include \
LIBS += $$PWD/ffmpeg/lib/avcodec.lib \
$$PWD/ffmpeg/lib/avdevice.lib \
$$PWD/ffmpeg/lib/avfilter.lib \
$$PWD/ffmpeg/lib/avformat.lib \
$$PWD/ffmpeg/lib/avutil.lib \
$$PWD/ffmpeg/lib/postproc.lib \
$$PWD/ffmpeg/lib/swresample.lib \
$$PWD/ffmpeg/lib/swscale.lib \
$$PWD/SDL2/lib/x86/SDL2.lib
|
這裡是同時引用了FFMPEG和SDL的工程檔案。
三、編寫程式碼
加入SDL的標頭檔案之後,編譯的時候會提示main函式沒有定義
原因是 SDL_main.h中有如下一段話:
1 2 3 |
#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE)
#define main SDL_main
#endif
|
可以看出這裡已經定義了一個main了,因此我們寫的程式中的main便不能生效了,解決方法:
在我們自己寫的main函式的前面加上:
1 2 3 4 5 |
#undef main
int main( int argc, char * argv[])
{
...
}
|
FFMPEG讀取音訊檔案和解碼音訊的程式碼,不做介紹了,基本上和前面視訊的操作類似。
這裡需要注意的一點是:
SDL播放音訊是通過回撥函式的方式播放,且這個回撥函式是在新的執行緒中執行,此回撥函式固定時間激發一次,這個時間和要播放的音訊頻率有關係。
因此我們用FFMPEG讀到一幀音訊後,不是急著解碼,而是將資料存入一個佇列,等SDL回撥函式激發的時候,從這個佇列中取出資料,然後解碼 播放。
程式碼這裡不做介紹了,直接上完整的工程吧。
完整工程下載地址:
注:
本工程播放AAC檔案是正常的,AAC檔案已經放入工程中了。
但是在播放mp3的時候不正常,都是雜音,暫時不知道為什麼,可能是FFMPEG自帶的解碼器解碼mp3有問題,反正我們主要是講解SDL如何使用,因此不關心這個問題。
並且後期,音訊上我們基本都是使用AAC格式。所以就不發時間去研究這個了。
音視訊技術交流討論歡迎加 QQ群 121376426
相關推薦
從零開始學習音視訊程式設計技術(七) FFMPEG Qt視訊播放器之SDL的使用
前面介紹了使用FFMPEG+Qt解碼視訊並顯示。 現在我們就著手給它加上聲音播放。 播放聲音有很多種方式: 以windows系統為例,可以使用如下方法播放音訊: 1.直接呼叫系統API的wavein、waveout等函式 2.使用directsound播放
從零開始學習音視訊程式設計技術(八)FFMPEG Qt視訊播放器之音視訊同步
前面分別講解了: 現在我們就將視訊和音訊合併,並讓聲音和畫面同步。 加入音訊的部分就不做講解了,這裡主要講下聲音和視訊同步的步驟。 首先剛開始播放的時候通過av_gettime()獲取系統主時鐘,記錄下來。 以後便不斷呼叫av_gettime()獲取系統時鐘
從零開始學習比特幣開發(七)-P2P網路建立流程之生成地址對並連線到指定地址
本節繼續講解比特幣P2P網路建立流程,這節講解的執行緒為’ThreadOpenAddedConnections’,它的作用是生成地址對並連線到指定地址。 本文可以結合比特幣系統啟動的的第12步的講解來看,可以更加系統的瞭解比特幣系統啟動的過程。 P2P 網路的建立是在比特幣系統啟動的第
從零開始學習音視訊程式設計技術(四) FFMPEG的使用
零開始學習音視訊程式設計技術(四) FFMPEG的使用 音視訊開發中最常做的就是編解碼的操作了,以H.264為例:如果想要自己實現編碼h.264,需要對H.264非常的瞭解,首先需要檢視H.264的文件,這個文件好像說是三百多頁(本人並沒有看過)。 想到這
從零開始學習比特幣開發(四)--網路初始化,載入區塊鏈和錢包,匯入區塊啟動節點
寫在前面: 本篇文章接續 從零開始學習區塊鏈技術(三)-接入比特幣網路的關鍵步驟解析、建立比特幣錢包,以及重要rpc指令 從零開始學習區塊鏈技術(二)–如何接入比特幣網路以及其原理分析 以及從零開始學習區塊鏈技術(一)–從原始碼編譯比特幣 如果這篇文章看不明白,請務必先閱讀之前的文章
從零開始學習微信小程式(二)
wx.navigateTo()與wx.redirectTo()的區別 區別一 wx.navigateTo()表示的是從一個頁面跳轉到另一個頁面,會在另一個頁面中出現可返回之前頁面的按鈕,另一個頁面與之前頁面的關係為子頁面與父頁面的關係 wx.redirectTo()表示
從零開始學習比特幣開發(九)--P2P 網路建立之訊息處理中篇
P2P 網路的建立是在系統啟動的第 12 步,最後時刻呼叫 CConnman::Start 方法開始的。 恭喜你越來越接近比特幣的核心了,在上篇中,我們主要講解了比特幣的訊息處理執行緒,接下來,在下篇中,將以具體的比特幣訊息即比特幣協義分析為主。針對比特幣的協義
【高德地圖API】從零開始學高德JS API(七)——定位方式大揭祕
摘要:關於定位,分為GPS定位和網路定位2種。GPS定位,精度較高,可達到10米,但室內不可用,且超級費電。網路定位,分為wifi定位和基站定位,都是通過獲取wifi或者基站資訊,然後查詢對應的wifi或者基站位置資料庫,得到的定位地點。定位資料庫可以不斷完善不斷補充,所以,
從零開始學習音視訊程式設計技術(一) 視訊格式講解(學習筆記)
/* 該型別部落格為學習時載錄筆記,加上自己對一些不理解部分自己的理解。會涉及其他博主的博文的摘錄,會標註出處 */ ==========================================================================
從零開始學習音視訊程式設計技術(二) 音訊格式講解
1. 音訊簡介 前面我們說過視訊有一個每秒鐘採集多少張的概念,這就叫做視訊的幀率。 和視訊的幀率一樣的道理,聲音也有一個頻率,叫做取樣率。 人對頻率的識別範圍是 20HZ - 20000HZ, 如果每秒鐘能對聲音做 20000 個取樣, 回放
從零開始學習音視訊程式設計技術之初出茅廬
原文連結 近來,直播越來越火,因此很多人也想開始學習音視訊程式設計技術的相關知識。 因此本人決定將畢生所學有關音視訊方面的知識記錄於此供初學者學習之用。 本教程針對初學者,從零開始學習視訊程式設計技術,最終向大師級進發。學習完本教程,你將掌握基
系列部落格---從零開始學習音視訊程式設計技術
本文章所涉及的到內容均為轉發,看完一篇文章在此處貼上一個連結的方式生成,主要是以此來督促自己循序漸進的學習和積累,文獻內容其實並不高深,並且內容也不見得完全正確,因此有認為不妥的地方,我會盡量修改,當然是以ps方式提出。在學有縮成之後會開始自己原創的音視訊部落格。 內容從零開始,慢慢深入(在每篇
從零開始學習音視訊程式設計技術--編碼詳解
現在音視訊如此火爆,作為一枚專業的程式媛哪能不懂音視訊的開發呢,所以踏上了音視訊研究之路。對於ios來說音視訊編解碼主要有兩種編解碼框架FFmpeg和蘋果ios8以後開放的VideoToolBox,FFmpeg是基於CPU進行編解碼的,俗稱軟編碼,而VideoT
從零開始學習音視訊程式設計技術(一) 視訊格式講解
所謂視訊,其實就是將一張一張的圖片連續的放出來,就像放幻燈片一樣,由於人眼的惰性,因此只要圖片的數量足夠多,就會覺得是連續的動作。 所以,只需要將一張一張的圖片儲存下來,這樣就可以構成一個視訊了。 但是,由於目前網路和儲存空間的限制,直接儲存圖片顯然不可行。
從零開始學習音視訊程式設計技術(35) windows下編譯並除錯ffmpeg
前面介紹了Linux下編譯ffmpeg的方法,考慮到大部分時候測試ffmpeg功能都是使用的windows系統(至少我是這樣的),因此將戰場重新轉移到windows上。 前面寫了那麼多的程式碼,但都只是簡單的呼叫了ffmpeg的API,並不知道他內部是如何實現的。如果可
【轉】從零開始學習音視訊程式設計技術(二) 音訊格式講解
轉自:http://blog.yundiantech.com/?log=blog&id=5 1. 音訊簡介 前面我們說過視訊有一個每秒鐘採集多少張的概念,這就叫做視訊的幀率。 和視訊的幀率一樣的道理,聲音也有一個頻率,叫做取樣率。
【轉】從零開始學習音視訊程式設計技術(一) 視訊格式講解
轉自:http://blog.yundiantech.com/?log=blog&id=4 所謂視訊,其實就是將一張一張的圖片連續的放出來,就像放幻燈片一樣,由於人眼的惰性,因此只要圖片的數量足夠多,就會覺得是連續的動作。 所以,只需要將一張一張的圖片儲存下來
從零開始學習音視訊程式設計技術(34) Linux篇之編譯ffmpeg
水了這麼多篇,是時候開始幹正事了。Linux基礎知識已經掌握了,現在可以開始編譯ffmpeg了:一、下載ffmpeg首先下載ffmpeg的原始碼,ffmpeg所有版本原始碼下載地址:截至本文編寫時,ffmpeg最新版本是3.3,但我們還是一如既然的使用2.5.6.二、編譯f
從零開始學習音視頻編程技術(三) 開發環境搭建(Qt4.86手動設置環境,主要就是設置g++和qmake,比較透徹,附下載鏈接)
路徑 details 分享 baidu 末尾 是我 其中 找到 source 1.先下載安裝Qt 我們使用的版本是4.8。 可以自行百度下載也可以從下面的網盤地址下載: Qt庫和編譯器下載: 鏈接:http://pan.baidu.com/s/1hrUxLIG 密碼
從零開始學習比特幣開發(十一)-建立錢包
比特幣使用者最關心除了交易之外就是地址、錢包、私鑰了,交易、地址、錢包、私鑰這些不同概念之間具有內在的聯絡,要了解交易必須先要了解地址、錢包、私鑰這幾個概念,從本章開始,我們開始學習這一部分內容。 建立錢包整體流程 前面我們提到 RPC 的概念,RPC 是 re