Android音視頻之初識FFmpeg(一個強大到只能跪服的音視頻框架)!

   相信每一個搞音視頻開發的都或多或少的接觸過FFmpeg或者聽說它的大名。它可以說是音視頻領域的第一開源框架,代碼極其龐大,能達到熟練使用就已經不易了!在Android這個平臺上如果要使用軟解的話,我相信它是一個不錯的選擇。同時它也被應用到各大視頻類的APP中,比如抖音什麼的。嘿嘿當你反編譯QQ或者微信你會發現它的倩影。下面直接上乾貨:

  訪問FFmpeg開源框架的官網FFmpeg 。

點擊 Download 下載最近的release版本進行編譯,筆者選擇的是 FFmepg 4.0 其實編譯 ffmepg分爲以下幾個步驟:

1.cd ffmegdir (進入ffmepg源碼所在的目錄文件夾下面)

2. ./configure (注意該命令下面有個小點)

3. make

4. make install

以上的4個命令,可能有些初學者不是很明白(很正常,make命令,這些如果不是搞C/C++ 嵌入式方面的人 根部不會遇到這個的),依次解釋下!cd 這個不用說了不管是在Window 、Mac OS 、還Linux 系統上都是進入某個文件夾的的意思。 ./configure是對所要編譯的源碼的配置。這操作會檢測一些系統環境,例如,ffplay的編譯是需要sdl(Simple DirectMedia Layer),它是一套用C語言寫成的開放源代碼的跨平臺多媒體開發庫。如果沒有sdl,那麼就無法編譯出ffplay.(編譯這個的時候筆者遇到過大坑,後面細說)。make命令是就是編譯源碼的命令,它會根據makefile文件進行編譯(這些文件源碼中已經含有)。編譯完成之後,在ffmpeg文件夾下面會生成幾個可執行文件ffplay(默認不生成),ffserver(默認不生成),ffmpeg,ffprobe文件夾等。實際上,至此我們已經完成了源碼的編譯。make install 的作用就是把這些命令和編譯好的lib安裝到你的系統裏面。實際上你不安裝也可以,在你之後用的時候,就顯示的指明執行文件的路徑,頭文件以及lib的位置就行,不過還是建議安裝一下,否則用起來還是比較費事的。 以上的4個命令可以說的非常的實用,尤其是以後編譯第三方庫(C/C++)的時候,這就是萬能的步驟,萬變不離其宗,哈哈!

前提準備 :(筆者是在Mac下編譯的)

1.Mac要有安裝Xcode ,恩,這個實用mac開發的程序員,我相信都已經安裝過了。沒有的話去APP Store安裝下載。

2.安裝brew  在終端上(複製黏貼)執行下面一跳命令即可:

ruby -e "$(curl --insecure -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果執行無效,請參考這篇文章解決  安裝Homebrew解放方案

3.安裝 sdl

brew install sdl2

4.安裝pkgconfig  (可選,關於這個,網上說要安裝,但是筆者沒有安裝一樣完美運行)

sudo port install pkgconfig

pkg-config 安裝方法

 

準備工作完成之後,我們開始編譯FFmpeg.

1.先看看FFmpeg 4.0中的源碼文件

其中 android_build.sh 是筆者後來添加上去的,後文會詳細講解。

按照上面的步驟進行:

發現編譯出錯,這是正常的現象,編譯第三方庫經常遇到習慣就好.首先你應該觀察爲什麼?不知道的時候就只有度娘再不行就只能谷爸了。

configure時增加--disable-x86asm. asm是彙編編譯器, 因爲ffmpeg中爲了提高效率用到了彙編指令。

 

--prefix=/Users/zhulei/Desktop/ffmpeg_out  指定輸出文件的路徑   --disable-x86asm 不使用asm彙編編譯器。

接下來使用 make 命令

make 命令敲完之後 就要經過漫長的等待了,因爲編譯這個挺消耗時間的!編譯過程中警告不用管,錯誤你就要查閱相應的資料解決了。

make 命令之後緊接着一個 make install 命令:

然後我們可以打開我們的ffmpeg_out文件夾看看. bing go 編譯出來了.

include 文件裏面是ffmpeg各個模塊要使用的頭文件  lib文件夾下面則是ffmpeg庫  share文件下面是ffmepg庫的使用樣例。bin目錄下面則是ffmpeg 的工具 。

可能有人沒有編譯出 ffplay 這個工具 這裏有2個重要的原因:

1.config.h 中的 #define CONFIG_FFPLAY 的值爲0 將其改爲1

2.sdl版本需要安裝sdl2 而不是sdl(第一代)

尤其是第二點 真是深坑啊。

make install 之後我們可以使用ffpaly當播放器 進行播放視頻了 比如在終端敲一個簡單的命令:

ffplay  視頻全路徑     

那麼到了這裏就完了麼。no 我們還有一個android_build.sh 腳本沒有講解 下面來看看吧:

#!/bin/bash  
#這裏修改爲你的ndk的路徑
NDK=/Users/zhulei/android-ndk-r13b

#注意android-23文件夾的版本號,替換好自己的版本號。下面的路徑同理 
SYSROOT=$NDK/platforms/android-23/arch-arm64/
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64

function build_one(){
 ./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-doc \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--target-os=android \
--arch=aarch64 \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}


CPU=arm64
PREFIX=/Users/zhulei/Desktop/ffmpeg/$CPU
#ADDI_CFLAGS="-marm"
build_one

爲什麼會有這個sh腳本 ,原因很簡單因爲我們編譯的代碼要在android上運行啊,使用mac編譯,沒有進行相應的配置的話,默認使用mac的gcc編譯器 這樣編譯出來的庫我們是沒有辦法使用的。所以我們需要使用ndk裏面的編譯器進行編譯。

--prefix  指定輸出路徑

--disable-shared 不編譯動態庫

--enable-static  編譯靜態庫

--disable-doc   不編譯文檔

--enable-cross-compile 可以進行交叉編譯

--cross-prefix 交叉編譯器的路徑 (它會自己到相應路徑下尋找)

--target-os=android    android平臺

--arch=aarch64  架構

--sysroot  指定了邏輯目錄。編譯過程中需要引用的庫,頭文件,如果要到/usr/include目錄下去找的情況下,則會在前面加上邏輯目錄

其餘的extra 是一些優化特色可用不用管,對於初學者而言。

我上面的腳本是編譯64位的arm庫  如果需要編譯32位的。需要修改 --arch  --cross-prefix  SYSROOT   TOOLCHAIN 這四個值,改成相應的ndk目錄下面對應的32未的即可!

 

 

額外小技巧工具:

我們的mac電腦上安裝了brew之後 以後安裝軟件就可方便了 。只要在終端 brew install 軟件名字 ,就會自動下載並安裝相應的軟件 ,似不似很方便,哈哈!

比如: brew install you-get

you-get 是一個很有用的下載視頻工具 。安裝好了 你可以使用簡單的命令行下載國內各大網站的視頻,而不需要通過他們的客戶端,是不是神器 ,很happy是吧,嘿嘿! you-get使用教程

輕鬆一刻:

看了這麼久的技術文章相信客官您一定很累了,那麼就讓我爲您獻上2個精彩視頻 讓你緩解緩解下疲勞哈。

精彩視頻1        精彩視頻2

打賞一下:            

            

 

各位看官,看着打賞點吧,一毛也是愛~~

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