Shell 腳本 - 本身動手編譯 FFmpeg

有了 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

相關文章
相關標籤/搜索