FFMEPG 平臺移植,接口簡化和外部模塊接入 (一)ffmpeg android移植(ndk 編譯)

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

相關文章
相關標籤/搜索