1. 程式人生 > >學徒淺析Android開發——windows64下FFmpeg編譯問題彙總

學徒淺析Android開發——windows64下FFmpeg編譯問題彙總

最近在編譯FFmpeg的過程中著實遇到了一堆問題,FFmpeg其實更適合在LINUX環境下進行開發和封裝,因為它所依賴的編譯工具和功能擴充套件外掛在LINUX環境下更容易配置。而自己是在windows64環境下進行的編譯工作,著實給自己找了不少事幹。下面分享下自己在windows64環境下FFmpeg封裝過程中遇到的編譯失敗問題,以供交流。

先說明一下我的編譯環境配置

系統環境:windows7 64bit

編譯前期配置:

     mingwwindows環境下的linux編譯器(64bit)。

     msys:一個小型的GNU環境,包括基本的bashmake等等。與Cygwin

大致相當。

     FFmpeg_source(使用了最新的原始碼3.4.1果然是最新的沒好貨,有適配問題)

通常順利的場景

在執行完./configure ... 操作後,會看到如下成功頁面:


在執行完 make 命令後,會看到如下成功頁面:


在執行完make install 後,從根目錄輸入ffplay命令,會看到如下意味成功的提示:


以上是理性情況,但是在實際編譯過程中卻遇到了如下幾種編譯問題:

(1)提示 ffmpeg mktemp:command not found

(2)提示 ffmpeg pkg-config: command not found ...

  對應方案:

pkg-config在執行make命令時會用來構建相應的.a檔案等,所以必須要配置pkg-config環境,否則會編譯失敗。分別下載:

(3)提示 i386:architecture is incompatible with i386:x86-64

  對應方案:這是因為編譯64ffmpeg時,必須在./configure中宣告 --arch=x86_64 否則會導致在編譯時呼叫32位編譯器編譯。

(4)提示 ffmpeg yasm not found, use --disable-yasm

  對應方案:FFmpeg出於編譯效率的考慮,增加了彙編指令,如果電腦未配置彙編指令集(yasm/nasm)

,則會導致編譯失敗

(5)提示 [install-libavdevice-static] Error 127

  對應方案:這個異常時說明你配置的輸出路徑(--prefix=)有問題,可能存在舊檔案,導致無法建立新檔案,重新設定./configure --prefix的引數值即可。

(6)提示 libavcodec/libx264.c: In function X264_frame:

       libavcodec/libx264.c:282:9: error: x264_bit_depthundeclared (first use in this function); did you mean x264_picture_t?

             if (x264_bit_depth > 8)

                 ^~~~~~~~~~~~~~

                 x264_picture_t

  對應方案:如果你在FFmpeg(3.4.1)上整合x264,便會在make時遇到這個問題,該問題屬於ffmpeg自身的相容問題,最新版本的x264已經廢棄了x264_bit_depth引數。

  而對應的ffmpeg並沒有適配該部分,這個問題FFmpeg是在17年年底才發起票號處理的,但是已經在git上針對libavcodec/libx264.c做出了修正。

  遇到這個問題,要麼使用舊版的ffmpeg,要麼去ffmpeggit地址上更新libx264.c

(7)提示 no member named wrapper_name  = x264

  對應方案:這個錯誤指向的是FFmpeglibavcodec/libx264.c出現了無效的引用,遮蔽該引用即可,不會影響到後續功能。

(8)提示 unable to rename "avfiler-6.dll或其他檔案" reason :File exists

  對應方案:在執行make install命令時,出現該錯誤提示,可以無視,繼續重複執行make install,差不多5次後就會提示安裝完畢。

  這個現象跟mingw有關,畢竟是在windows環境模擬LINUX環境。

(9)提示 ffmpeg/compat/strtod.o error 或相似的錯誤

  對應方案:這種錯誤說明你沒有執行make clean命令或者說執行make clean後,清除指令沒有執行完全,仍然有殘留的舊檔案,舊檔案會影響當前的編譯,

  可以在執行完make clean後,手動檢查下compat目錄下是否存在compat\msvcrt\snprintf.dcompat\msvcrt\snprintf.ocompat\strtod.dcompat\strtod.o這四個檔案,若有刪除即可。

(10)編譯成功後的FFmpeg檔案播放視訊沒有聲音。

     x86_64-w64-mingw32下的lib的所有檔案複製到%mingw%\lib

     x86_64-w64-mingw32下的include的所有檔案複製到%mingw%include

     x86_64-w64-mingw32下的bin的所有檔案複製到%mingw%\bin

     %mingw%是你PCmingw的安裝目錄,再重新執行make clean -> make -> make install

(11)windows環境下,整合SDL後呼叫ffmplay xxx.mp4播放依然沒有聲音。

  對應方案:這個現象跟windows環境有關係,在StackOverflow上有人給出了方案,具體的異常原因不清楚。傳送門:原文表示設定一個環境變數SDL_AUDIODRIVER=directsound或者winmm即可,即在ffmplay xxx.mp4之前,先呼叫set SDL_AUDIODRIVER=directsound命令即可實現音訊播放。 

   目前遇到的編譯問題就是這些,FFmpeg最新版本確實存在著相容問題,如果整合x265等,也許會出現其他問題,所以我們在構建.so檔案時最好用舊版FFmpeg進行編譯或者時刻關注中對上報異常的修改,以便及時更新到原生代碼中,