有了 Makefile、CMake 和 Shell 的基礎後,咱們就能夠本身動手編譯 FFmpeg 了。固然網上能找到別人已經有編譯好的庫文件,咱們之因此折騰這麼一大圈,仍是爲了本身之後能去裁剪編譯。以前在公司看老大一頓 shell 命令操做,以爲很是的高大上,以爲本身很菜,以爲應該要不少年才能達到這程度吧。本身用心學了才知道,其實也就一週的時間完徹底全足夠了。html
咱們先來作一些準備工做,準備一臺 Linux 雲主機或者一臺 Mac 電腦,下載 ndk ,下載 FFmpeglinux
Linux 環境(Ubuntu 14.04 ,x86_64)
NDK 版本(android-ndk-r16b)
FFmpeg 版本(ffmpeg-3.3.9)
複製代碼
關於版本的選擇問題,我在國內看了一圈,你們基本都是用的 2.x.x 的版本。高版本與低版本相比,通常性能和各個方面都會有一些改進,那咱們就用高版本?其實也不徹底是這樣,不少低版本的 api 會被廢棄掉,好比視頻解碼方法 avcodec_decode_video2 在 3.x.x 的版本後取而代之的是 avcodec_send_packet 和 avcodec_receive_frame 。所以若是你想去查一下 3.x.x 版本的 api 資料可能會發現比較少,或者開發過程當中遇到某些問題也會比較棘手。所以建議你們學習時儘可能使用較高的版本,開發時儘可能使用大衆的版本。android
下載完成後把下載好的 ndk 和 FFmpeg 用 xftp 推到 linux 雲主機上。把 ndk 解壓到 /lib/ndk 目錄下,而後配置 NDK_PATH 環境變量:shell
# 配置NDK路徑
export NDK_PATH=/lib/ndk/android-ndk-r16b
export PATH=$NDK_PATH:$PATH
複製代碼
FFmpeg 直接解壓到工做目錄下:ubuntu
ubuntu@VM-0-9-ubuntu:~/ffmpeg-3.3.9$ ls
arch.mak CREDITS ffserver.c LICENSE.md
Changelog doc ffserver_config.c MAINTAINERS
cmdutils.c ffmpeg.c ffserver_config.h Makefile
cmdutils_common_opts.h ffmpeg_cuvid.c INSTALL.md presets
cmdutils.h ffmpeg_dxva2.c libavcodec README.md
cmdutils_opencl.c ffmpeg_filter.c libavdevice RELEASE
common.mak ffmpeg.h libavfilter RELEASE_NOTES
compat ffmpeg_opt.c libavformat tests
configure ffmpeg_qsv.c libavresample tools
CONTRIBUTING.md ffmpeg_vaapi.c libavutil VERSION
COPYING.GPLv2 ffmpeg_vdpau.c libpostproc version.sh
COPYING.GPLv3 ffmpeg_videotoolbox.c library.mak
COPYING.LGPLv2.1 ffplay.c libswresample
COPYING.LGPLv3 ffprobe.c libswscale
複製代碼
咱們發現目錄下已經有寫好的 Makefile 編譯文件了,那是否是能夠直接編譯運行呢?使用 make 命令出現以下錯誤:api
Makefile:2: config.mak: No such file or directory
Makefile:67: /common.mak: No such file or directory
Makefile:114: /libavutil/Makefile: No such file or directory
Makefile:114: /library.mak: No such file or directory
Makefile:116: /doc/Makefile: No such file or directory
Makefile:206: /tests/Makefile: No such file or directory
make: *** No rule to make target '/tests/Makefile'. Stop.
複製代碼
這些文件怎麼來?在 configure 腳本文件裏面,固然剛開始你們基本看不懂,這也是爲何咱們要先學學 shell 腳本基礎的緣由。咱們只須要再寫一個 build.sh 腳原本執行 ./configure 腳本文件便可,至於須要傳遞哪些參數,怎麼裁剪 so 動態庫這裏先不詳細講,你們能夠用 ./configure --help 來查看,學到後面咱們天然而然就該知道怎麼裁剪了,剛開始就能很明白通常不太現實。固然咱們也能夠去 copy 了別人寫好的腳本文件,但有時腳本的一個空格不對,都有可能浪費咱們一週的時間。所以我仍是建議你們要能本身寫,之後咱們可能會遇到各式各樣的第三方庫,而編譯 FFmpeg 庫文件是我所遇到的很是簡單的一個。bash
#!/bin/bash
. /etc/profile
function build
{
echo "start build ffmpeg for $ARCH"
./configure --target-os=linux \
--prefix=$PREFIX --arch=$ARCH \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--cross-prefix=$CROSS_COMPILE \
--enable-cross-compile \
--sysroot=$SYSROOT \
--enable-small \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "build ffmpeg for $ARCH finished"
}
ARCH=arm
CPU=arm
PREFIX=$(pwd)/android/$ARCH
TOOLCHAIN=$NDK_PATH/android-toolchains/arm-19
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
ADDI_CFLAGS="-marm"
SYSROOT=$TOOLCHAIN/sysroot
build
複製代碼
ubuntu@VM-0-9-ubuntu:~/ffmpeg-3.3.9/android/arm/lib$ ls
libavcodec.so libavformat.so libswresample.so
libavcodec.so.57 libavformat.so.57 libswresample.so.2
libavcodec.so.57.89.100 libavformat.so.57.71.100 libswresample.so.2.7.100
libavdevice.so libavutil.so libswscale.so
libavdevice.so.57 libavutil.so.55 libswscale.so.4
libavdevice.so.57.6.100 libavutil.so.55.58.100 libswscale.so.4.6.100
libavfilter.so libpostproc.so pkgconfig
libavfilter.so.6 libpostproc.so.54
libavfilter.so.6.82.100 libpostproc.so.54.5.100
複製代碼
若是你們不出意外會獲得以上文件,咱們發現編譯出來是 linux 的命名方式,所以咱們須要在 configure 中改一下生成文件名的格式:ide
# 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 和頭文件 copy 整合到 Android 工程下,就能夠開始作視頻的開發了,至於怎麼整合到 AS ,能夠參考 《CMake 語法 - 詳解 CMakeLists.txt》 一文。關於視音頻編解碼,視音頻同步播放,直播推拉流等等,會在接下來的文章中,給你們陸陸續續的介紹。 視頻連接:pan.baidu.com/s/17CiYcqTj… 視頻密碼:hq2dpost