使用C語言快速製作一個視頻播放器,使用這個開源庫就可以了

FFmpeg 的視音頻編解碼功能非常強大,幾乎囊括了現存所有的視音頻編碼標準,因此只要做視音頻開發,幾乎離不開它。例如,它可以用於做各種格式轉換,視音頻編解碼,Mplayer,ffplay,射手播放器,暴風影音,KMPlayer,QQ影音等視頻頻播放器的內核就是 FFmpeg。

使用C語言快速製作一個視頻播放器,使用這個開源庫就可以了

FFmpeg 是開源的,非常適合研究學習

FFmpeg 是開源的,由C語言開發,因此語法方面很簡單,非常適合研究學習。要學習和使用 FFmpeg,首先需要編譯和安裝它,本文將介紹如何在Ubuntu上編譯並安裝它。

使用 apt 命令安裝

大都數 Ubuntu 中都可使用 apt 命令安裝相應的程序,例如執行下面這條命令即可安裝 FFmpeg:

$ apt install ffmpeg

但是,這樣安裝的 FFmpeg 不太利於控制版本,其環境作用域也是用戶全局的,我個人不喜歡這樣。下文將介紹如何從官網下載源代碼編譯安裝到指定的目錄,而且有了源代碼,在之後的學習和使用中遇到問題,也方便排查。

下載

下載過程很簡單,使用 wget 命令即可,下面這條命令從官網下載了 FFmpeg 的 3.1.11 版本,-c選項讓 wget 具備斷點續傳的能力,避免中途意外中斷導致需要完全重新下載。

wget -c /ffmpeg-3.1.11.tar.xz

編譯安裝

下載完畢後,使用 tar 命令解壓,進入解壓後的目錄,建立 build 目錄,之後編譯和安裝的臨時中間過程都在 build 目錄中進行:

$ tar xf ffmpeg-3.1.11.tar.xz 
$ cd ffmpeg-3.1.11
$ mkdir build
$ cd build
$ ../configure --prefix= --enable-shared

通過 configure 可以生成編譯過程使用的 makefile,--prefix後可指定安裝目錄。

我不太喜歡將軟件安裝到系統目錄,避免其汙染系統環境,同時,將軟件安裝到指定目錄,也方便部署,和指定使用的軟件版本。

不過,在執行 ../configure 命令時,我遇到了下面這樣的錯誤:

yasm/nasm not found or too old. Use --disable-yasm for a crippled build.

其實原因很明顯,系統找不到yasm/nasm庫或者這兩個庫的版本太舊而已,而 FFmpeg 給出了相應的解決方法:在 configure 時指定--disable-yasm禁止yasm即可。但是我不想禁止,於是執行下面的命令:

$ sudo apt update
$ sudo apt install yasm

此時再執行../configure --prefix=...就可以生成 makefile 了,輸入 make -j 命令使用可用 cpu 參與編譯:

$ ../configure --prefix= --enable-shared
$ make -j

稍後片刻,即可編譯完畢,得到類似於下面這樣的輸出:

使用C語言快速製作一個視頻播放器,使用這個開源庫就可以了

FFmpeg編譯完畢

之後便可輸入

$ make install

將 FFmpeg 安裝到之前我們指定的目錄中:

使用C語言快速製作一個視頻播放器,使用這個開源庫就可以了

安裝後的FFmpeg

測試

進入安裝目錄的bin目錄,執行可執行程序ffmpeg:

$ cd /bin
$ ./ffmpeg

發現報錯,提示找不到相應的庫libavdevice.so.57:

./ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No such file or directory

出現這樣的錯誤原因很簡單——因為我們沒有把相應的 ffmpeg 庫安裝到系統目錄,自定義的目錄並不在系統搜索範圍內。事實上,使用 ldd 命令能夠找出ffmpeg程序需要鏈接的所有庫:

$ ldd ffmpeg 
linux-vdso.so.1 => (0x00007ffcc03ad000)
libavdevice.so.57 => not found
libavfilter.so.6 => not found
libavformat.so.57 => not found
libavcodec.so.57 => not found
libswresample.so.2 => not found
libswscale.so.4 => not found
libavutil.so.55 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4ac74cf000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4ac72b2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4ac6ee8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4ac77d8000)
使用C語言快速製作一個視頻播放器,使用這個開源庫就可以了

FFmpeg 的庫都是“not found”

可見,FFmpeg 的庫都是“not found”。要解決這樣的問題很簡單,只需將庫導入到相應的環境變量即可:

$ export LD_LIBRARY_PATH=<ffmpeg>/lib:$LD_LIBRARY_PATH/<ffmpeg>

再次執行./ffmpeg命令,發現正常了:

使用C語言快速製作一個視頻播放器,使用這個開源庫就可以了

正常執行ffmpeg命令

至此,在Ubuntu16.04 上從源碼編譯和安裝FFmepg-3.1.11就完成了。

使用C語言快速製作一個視頻播放器,使用這個開源庫就可以了

點個關注再走吧

歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。


分享到:


相關文章: