Car-eye-FFMPEG項目是Car-eye 開源平臺的一個新項目,目的是在FFMPEG項目和其外部模塊,如freetype,X264的基礎上創建一個多平臺編譯,接口調用簡單的工具集。python
本博客是一個連載,首先從android開始寫吧。由於FFMPEG自己對android編譯的支持就不是特別好。linux
本文開發環境是ubuntuandroid
分步來作:git
1. 創建NDK編譯環境,請參考外面的博客講ndk安裝到ubuntu下,在此很少囉嗦,注意須要將本例子程序用到的環境變量設置好,如在/etc/profile 最後加上 export ANDROID_NDK=/home/NDK/android-ndk-r10e 同時讓其當即生效。github
2. 下載FFMPEG,X264,freetype,png等等目錄結構保持跟FFMPEG平行,同時在這裏指出的是,別用過於新的版本正則表達式
通常最新版本NDK很難編譯。筆者用的是版本是n3.3.7. 根據我編譯的經歷4.0很難編譯經過ubuntu
下載後bash
目錄結構大體以下:架構
3. 安裝一些工具工具
在咱們的腳本和編譯的時候須要用到如正則表達式,autoconfig等
apt-get --quiet --yes install build-essential git autoconf libtool pkg-config gperf gettext yasm python-lxml
4. 編譯腳本
設計一個好的腳本過重要。不然編譯會變得十分困難。
腳本須要考慮一下一些問題:環境變量,如NDK編譯器件位置,庫放的位置,源碼編譯順序,編譯參數設置等
參考老外的設計,首先設計一個整體環境變量的腳本:
#!/bin/bash
SUPPORTED_ARCHITECTURES=(armeabi-v7a x86)
ANDROID_NDK_ROOT_PATH=${ANDROID_NDK}
if [[ -z "$ANDROID_NDK_ROOT_PATH" ]]; then
echo "You need to set ANDROID_NDK environment variable, please check instructions"
exit
fi
ANDROID_API_VERSION=21
NDK_TOOLCHAIN_ABI_VERSION=4.9
NUMBER_OF_CORES=$(nproc)
HOST_UNAME=$(uname -m)
TARGET_OS=linux
CFLAGS='-Os -fpic -marm'
LDFLAGS=''
FFMPEG_PKG_CONFIG="$(pwd)/ffmpeg-pkg-config"
上面的腳本設置了編譯器的位置,版本,參數,pkg-config腳本。由於android自己就不支持外部編譯,若是加入freetype的時候可能會報錯。這個就須要配置pkg-config用來讓ffmpeg的configure 找到本身的庫,若是依然找不到,請在編譯參數裏面直接將庫和頭文件的參數指定,並適當修改ffmpeg的configure。
總編譯調用腳本:
#!/bin/bash
. settings.sh
BASEDIR=$(pwd)
TOOLCHAIN_PREFIX=${BASEDIR}/toolchain-android
# Applying required patches
patch -p0 -N --dry-run --silent -f fontconfig/src/fcxml.c < android_donot_use_lconv.patch 1>/dev/null
if [ $? -eq 0 ]; then
patch -p0 -f fontconfig/src/fcxml.c < android_donot_use_lconv.patch
fi
for i in "${SUPPORTED_ARCHITECTURES[@]}"
do
rm -rf ${TOOLCHAIN_PREFIX}
# $1 = architecture
# $2 = base directory
# $3 = pass 1 if you want to export default compiler environment variables
#./x264_build.sh $i $BASEDIR 0 || exit 1
./libpng_build.sh $i $BASEDIR 1 || exit 1
./freetype_build.sh $i $BASEDIR 1 || exit 1
./expat_build.sh $i $BASEDIR 1 || exit 1
#./fribidi_build.sh $i $BASEDIR 1 || exit 1
#./fontconfig_build.sh $i $BASEDIR 1 || exit 1
#./libass_build.sh $i $BASEDIR 1 || exit 1
./ffmpeg_build.sh $i $BASEDIR 0 || exit 1
done
rm -rf ${TOOLCHAIN_PREFIX}
注意順序,在編譯ffmpeg以前先把外部模塊編譯好SUPPORTED_ARCHITECTURES 是CPU的架構,通常是ARM和X86等架構
最後是FFMPEG的整體編譯(其餘的外部編譯都基本調用模塊內部的configure配置一些參數)
#!/bin/bash
. abi_settings.sh $1 $2 $3
pushd ffmpeg
case $1 in
armeabi-v7a | armeabi-v7a-neon)
CPU='cortex-a8'
;;
x86)
CPU='i686'
;;
esac
make clean
./configure \
--cross-prefix="$CROSS_PREFIX" \
--sysroot="$NDK_SYSROOT" \
--enable-libfreetype \
--disable-avdevice \
--enable-pic \
--disable-ffserver \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-symver \
--disable-doc \
--disable-static \
--enable-shared \
--target-os=linux \
--arch="$NDK_ABI" \
--enable-cross-compile \
--pkg-config="${2}/ffmpeg-pkg-config" \
--prefix="${2}/build/${1}" \
--extra-cflags="-I${TOOLCHAIN_PREFIX}/include -I${TOOLCHAIN_PREFIX}/include/freetype2 " \
--extra-ldflags="-L${TOOLCHAIN_PREFIX}/lib " \
--extra-libs="-lpng " \
--extra-cxxflags="$CXX_FLAGS" || exit 1
make && make install || exit 1
編譯執行 android_build.sh 完成編譯。全部相關代碼下載請以car-eye 開源github網址爲準
https://github.com/Car-eye-team
car-eye開源官方網址:www.car-eye.cn
car-eye 流媒體平臺網址:www.liveoss.com
car-eye 技術官方郵箱: support@car-eye.cn
car-eye技術交流QQ羣: 590411159
CopyRight© car-eye 開源團隊 2018