天天看點

FFmpeg(3.3.2)移植Android平台

我的視訊課程(基礎):《(NDK)FFmpeg打造Android萬能音頻播放器》

我的視訊課程(進階):《(NDK)FFmpeg打造Android視訊播放器》

我的視訊課程(編碼直播推流):《Android視訊編碼和直播推流》

我的視訊課程(C++ OpenGL):《Android C++ OpenGL教程》

        Update:話不多說,先看一下後面內建SDL2後的音頻播放器(SDK),可以用于FM類型的播放器使用哦~

Git位址:https://github.com/wanliyang1990/FFmpeg-Android

FFmpeg(3.3.2)移植Android平台

正文(視訊教程):

随着直播行業的火熱,移動端的各種直播(播放)軟體多如牛毛,早年我也基于ijkplayer寫了一個播放器(wlivetv:https://github.com/wanliyang1990/WliveTV),裡面播放子產品用的就是ijkplayer編譯成Android平台的,自己隻是給它添加了一層衣服而已,沒有核心技術。時隔兩年,随着自己接觸的多了,也開始慢慢的接到到ffmpeg這個音視訊元老級人物,經過一段時間的研究也還是有點成效,相信很多跟我一樣的人想自己倒騰一下ffmpeg,無奈第一步編譯都過不了關,就被它狠心的拒之門外了。因為開源讓世界美好,so 我就來給你們把這攔路虎牽一邊去散步了,留下敞開的大門,任由大家馳騁。說到ffmpeg,就要提到已經離世的雷神了(部落格:http://blog.csdn.net/leixiaohua1020),他的部落格介紹了很多ffmpeg的相關知識,雖然大多數是windows平台的,但對于我們了解怎麼使用還是很有幫助的,感謝雷神,願天堂沒有代碼!

        ffmpeg的一個好搭檔就是SDL了,Android下編譯SDL可見我的另一篇部落格:Android編譯SDL2和demo展示(2.0.5) ,SDL可用于ffmpeg播放音頻和顯示視訊,裡面對線程的處理挺友善的,後面我會寫一系列ffmpeg和SDL的部落格,現在還在研究階段ing。好了,開始我們今天的ffmpeg入門旅程吧。

一:這裡我用的是Windows+Vm+ubuntu來編譯的ffmpeg,其中Windows上面安裝vm,在vm中安裝ubuntu以及xshell,xftp我就不介紹了,這裡當成大家的基本功了(注:Ubuntu中需要安裝ssh服務才能連接配接xshell,安裝指令:sudo apt-get install openssh-server)。

二:下載下傳現在最想版本ffmpeg(3.3.2)到本地:http://ffmpeg.org/download.html#releases

FFmpeg(3.3.2)移植Android平台

建立虛拟機安裝ubuntu系統,然後啟動我們的ubuntu系統(我的版本是17.04)

FFmpeg(3.3.2)移植Android平台

系統啟動就可以了,然後用xshell連接配接到系統中,後面的操作都在在xshell中完成的(附:剛開始搭建xshell連接配接服務時,還是要進入系統安裝相應的軟體,百度都能解決,我就是這樣的),登入系統并改成root使用者:

FFmpeg(3.3.2)移植Android平台

三:配置ndk環境

下載下傳ndk10e(下載下傳:https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip),然後用xftp上傳到ubuntu系統中

FFmpeg(3.3.2)移植Android平台

在目錄:/usr/dev/ndk(根據自己喜好來)中建立ndk目錄,并上傳下載下傳好的NDK到此目錄下,用指令解壓:unzip xxx.zip,解壓後如下:

xshell效果圖:

FFmpeg(3.3.2)移植Android平台

xftp效果圖:

FFmpeg(3.3.2)移植Android平台

然後配置NDK環境

用指令:

vim ~/.bashrc    

打開環境變量配置檔案

輸入:

#ndk

export NDK_HOME=/usr/dev/ndk/android-ndk-r10e

export PATH=$NDK_HOME:$PATH

FFmpeg(3.3.2)移植Android平台

輸入完後,重新整理系統變量:

source ~/.bashrc

輸入

ndk-build

檢查是否成功:

FFmpeg(3.3.2)移植Android平台

這樣NDK就配置成功了,可以開始ffmpeg的編譯了(以上部分對shell不熟悉的,也可以直接在ubuntu使用者界面裡面設定,隻要能配置成功就可以了)。

三:

1):在dev目錄下建立ffmpeg目錄:mkdir ffmpeg,并上傳下載下傳好的ffmpeg到ffmpeg目錄下:

FFmpeg(3.3.2)移植Android平台

2):執行指令解壓ffmpeg:

tar -zxvf ffmpeg-3.3.2.tar.gz

得到解壓後的ffmpeg-3.3.2,因為會編譯生成許多檔案,是以我們這裡給ffmpeg-3.3-2設定權限:

chmod -R 777 ffmpeg-3.3.2

3):然後進入ffmpeg-3.3.2中:

FFmpeg(3.3.2)移植Android平台

4):然後更改檔案configure裡面的第3305行内容:

#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
           

才能然生成的動态庫是已.so結尾的,因為Android裡面隻認識.so結尾的庫

FFmpeg(3.3.2)移植Android平台

可以把configure檔案導出到本地計算機上用編輯器來更改,我這裡就是。

5):給configure賦予可執行權限

chmod -u+x configure 或者直接 chmod 777 configure

然後執行configure來檢查系統生成編譯所需的配置檔案xxxx.h,xxxx.mk等檔案

./configure

FFmpeg(3.3.2)移植Android平台

提示我們要用屏蔽yasm才能執行,是以加上參數後的編譯指令是:

./configure --disable-yasm

如圖:

FFmpeg(3.3.2)移植Android平台

表明系統檢查配置已經完成,接下來就是編寫編譯腳本了:

6)編譯腳本build_android.sh

#!/bin/bash
make clean
export NDK=/usr/dev/ndk/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"

./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
           

其中NDK目錄替換為自己的NDK目錄就行,這裡面把全部功能都編譯了的,--disable-xxx是不要某功能,--enable-xxx是需要某功能然後cpu平台之一arm平台的(注意:裡面反斜杠 \ 後面不能後空格等字元,不然也會導緻編譯不成功)後面我會把編譯腳本和demo上傳到GitHub上面,可以去下載下傳來更改,最保險。

把編寫好的腳本build_android.sh上傳到ffmpeg3.3.2根目錄下:

FFmpeg(3.3.2)移植Android平台
FFmpeg(3.3.2)移植Android平台

7、然後賦予build_android.sh的可執行權限

chmod 777 android_build.sh

四、編譯ffmpeg,執行指令

./build_android.sh

這個過程大概二十分鐘左右,可以稍微休息一下了,沒有咖啡,喝杯白開水吧,哈哈:

經過漫長的等待,喝了幾杯白開水了,終于編譯好了:

FFmpeg(3.3.2)移植Android平台
FFmpeg(3.3.2)移植Android平台
FFmpeg(3.3.2)移植Android平台

在ffmpeg3.3.2目錄中生成了android目錄

FFmpeg(3.3.2)移植Android平台

最後通過xftp把android檔案夾導出到本地計算機目錄下:

FFmpeg(3.3.2)移植Android平台

至此ffmpeg編譯成android平台完成,部落格内容有點多了,例子将在下一篇部落格裡面介紹。

先上一張例子運作後的圖檔,檢視FFmpeg裡的編解碼器:

FFmpeg(3.3.2)移植Android平台

編譯腳本和Demo(eclipse):GitHub位址:https://github.com/wanliyang1990/FFmpeg-Android