Linux 下的 FFmpeg 安裝編譯環境配置總結

1. 安裝編譯

官網下載地址:http://ffmpeg.org/
官網安裝指導 : http://trac.ffmpeg.org/wiki/CompilationGuide(並選擇對應平臺)

在安裝編譯的時候可以根據需要安裝並編譯其他依賴的庫,FFmpeg 依賴的庫很多,在編譯安裝的時候需要耐心與細心,否則很容易出問題。

2. 安裝編譯過程中出現的問題

  • 問題1 - YASM 編譯 x86 目錄下的文件時報錯

YASM libavcodec/x86/hevc_idct.o
libavcodec/x86/hevc_idct.asm:88: error: instruction expected after label
libavcodec/x86/hevc_idct.asm:89: error: instruction expected after label
libavcodec/x86/hevc_idct.asm:89: error: redefinition of vpbroadcastw.loop'
libavcodec/x86/hevc_idct.asm:88: error:
vpbroadcastw.loop’ previously defined here
libavcodec/x86/hevc_idct.asm:104: error: instruction expected after label
libavcodec/x86/hevc_idct.asm:104: error: redefinition of vpbroadcastw.loop'
libavcodec/x86/hevc_idct.asm:88: error:
vpbroadcastw.loop’ previously defined here
libavcodec/x86/hevc_idct.asm:105: error: instruction expected after label
libavcodec/x86/hevc_idct.asm:105: error: redefinition of vpbroadcastw.loop'
libavcodec/x86/hevc_idct.asm:88: error:
vpbroadcastw.loop’ previously defined here
libavcodec/x86/hevc_idct.asm:120: error: instruction expected after label
libavcodec/x86/hevc_idct.asm:120: error: redefinition of vpbroadcastw.loop'
libavcodec/x86/hevc_idct.asm:88: error:
vpbroadcastw.loop’ previously defined here
libavcodec/x86/hevc_idct.asm:121: error: instruction expected after label
libavcodec/x86/hevc_idct.asm:121: error: redefinition of vpbroadcastw.loop'
libavcodec/x86/hevc_idct.asm:88: error:
vpbroadcastw.loop’ previously defined here
make: * [libavcodec/x86/hevc_idct.o] 錯誤 1


在編譯彙編代碼文件時,報出如上錯誤。
還記得在按照官網的編譯安裝指導過程中最開始的準備工作中,需要安裝 Yasm。

Yasm
An assembler for x86 optimizations used by x264 and FFmpeg. Highly recommended or your resulting build may be very slow.
(中文意思:Yasm 是一個 x264 和 FFmpeg 使用的x86平臺優化的彙編器,強烈建議安裝使用否則將導致編譯非常的緩慢)

If your repository provides yasm version ≥ 1.2.0 then you can install that instead of compiling:

sudo apt-get install yasm

Otherwise you can compile:

cd ~/ffmpeg_sources
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install

以上提到了 x86, 而編譯出錯的路徑中也包含了 x86, 說明它們之間是有關聯的,
其實出現以上錯誤,是沒有完全按照官網指導來進行操作,在最後 make 的時候官網是如下調用的:

PATH="$HOME/bin:$PATH" make

而出現錯誤的調用是:

make

它們的區別在於 make 前指定了安裝新版本的 Yasm 程序的目錄,使得 make 會到指定的目錄去調用 Yasm。

3. 編譯項目工程出現的問題

  • 問題1 - 編譯時庫文件中報出大量的 undefined reference to 錯誤
//usr/local/lib/libavcodec.a(atrac3plusdec.o): In function `atrac3p_decode_frame':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:358: undefined reference to `av_log'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:353: undefined reference to `avpriv_report_missing_feature'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:346: undefined reference to `av_log'
//usr/local/lib/libavcodec.a(atrac3plusdec.o): In function `atrac3p_decode_close':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:72: undefined reference to `av_freep'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:73: undefined reference to `av_freep'
//usr/local/lib/libavcodec.a(atrac3plusdec.o): In function `atrac3p_decode_init':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:153: undefined reference to `av_log'
//usr/local/lib/libavcodec.a(atrac3plusdec.o): In function `set_channel_params':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:139: undefined reference to `av_log'
//usr/local/lib/libavcodec.a(atrac3plusdec.o): In function `av_mallocz_array':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/./libavutil/mem.h:233: undefined reference to `av_mallocz'
//usr/local/lib/libavcodec.a(atrac3plusdec.o): In function `atrac3p_decode_init':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/atrac3plusdec.c:174: undefined reference to `avpriv_float_dsp_alloc'
//usr/local/lib/libavcodec.a(aura.o): In function `aura_decode_frame':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/aura.c:54: undefined reference to `av_log'
//usr/local/lib/libavcodec.a(avrndec.o): In function `decode_frame':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:116: undefined reference to `av_pix_fmt_get_chroma_sub_sample'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:134: undefined reference to `av_log'
//usr/local/lib/libavcodec.a(avrndec.o): In function `end':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:95: undefined reference to `av_freep'
//usr/local/lib/libavcodec.a(avrndec.o): In function `init':
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:44: undefined reference to `av_log'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:52: undefined reference to `av_log'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:58: undefined reference to `av_dict_set'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:67: undefined reference to `av_log'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:69: undefined reference to `av_dict_free'
/home/ffmpeg/ffmpeg_source/ffmpeg-git/libavcodec/avrndec.c:74: undefined reference to `av_image_check_size'

出現以上錯誤,基本上是鏈接庫文件時出了問題,而且鏈接庫文件時需要按照一定的順序來鏈接,上層庫需要放在底層庫的左邊,比如 libavcodec 庫調用了 libavutil 庫中的 av_log() 函數, 那麼鏈接時 libavcodec 庫需要放在 libavutil 庫的左邊,這樣鏈接時才能正常,可以參考如下鏈接順序:

-lavdevice -lavfilter -lavformat -lavcodec -lavutil

另外在編譯時還會報出其他一些 undefined reference to 錯誤,基本上都是沒有鏈接指定的庫導致的,Google 或者 Baidu 搜索一下就知道需要鏈接的是什麼庫了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章