天天看點

基于FFmpeg的經過Neon加速的可顯示轉碼進度的安卓視訊轉碼器相關介紹轉碼進度功能實作Neon加速測試附:

相關介紹

    之前因為項目需要做一個安卓視訊轉碼器,之後在網上搜了很多相關的資料,之後找到雷神的相關部落格,裡面有一篇部落格上就實作了安卓視訊轉碼器,是以就拿來用了,但是由于裡面有些功能沒符合項目需求,是以我在其基礎上進行了修改,主要添加了兩項功能:轉換過程中可顯示轉碼進度;視訊轉碼加速;下面就這兩項功能實作過程作具體描述,順便說句題外話,在這裡非常感謝雷神所做的貢獻。

轉碼進度功能實作

    在工程jni目錄ffmpeg.h中添加添加typedef struct FFMFCContext {

long progress;

long media_duration;

long media_cur_time;

} FFMFCContext;結構體用來儲存進度值,然後在jni下的ffmpeg_mod.c中的transcode_init函數中插入如下代碼,計算轉碼估計總用時。

基于FFmpeg的經過Neon加速的可顯示轉碼進度的安卓視訊轉碼器相關介紹轉碼進度功能實作Neon加速測試附:

    再在print_report函數下插入如下紅色代碼,最後ffmfcctx.progress中儲存的就是

基于FFmpeg的經過Neon加速的可顯示轉碼進度的安卓視訊轉碼器相關介紹轉碼進度功能實作Neon加速測試附:
基于FFmpeg的經過Neon加速的可顯示轉碼進度的安卓視訊轉碼器相關介紹轉碼進度功能實作Neon加速測試附:

    然後寫好相關jni調用接口函數将該參數在安卓進度條中顯示出來,具體見附件源代碼。

Neon加速

    neon加速功能的實作其實就是一個編譯ffmpeg庫的過程,對于neon技術有疑問的同學可以自行在網上查找,有很多相關介紹。

編譯環境說明

    相關軟體:Ubuntu 15.10 + android-ndk-r9d-linux-x86_64+ ffmpeg 2.6.9+libfaac-1.28 +libx264

    下載下傳位址:ffmpeg:https://ffmpeg.org/download.html

            Libfaac:http://www.audiocoding.com/downloads.html

              Libx264:http://www.videolan.org/developers/x264.html

編譯libx264

在linux下切換到libx264庫檔案目錄下建立一個bash批處理檔案内容如下,然後執行。

export NDK="/home/joechiang/android-ndk-r9d" 
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt  
export PLATFORM=$NDK/platforms/android-8/arch-arm  
export PREFIX=../android-lib  
./configure --prefix=$PREFIX --enable-static --enable-strip --enable-pic --disable-cli --host=arm-linux --cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- --sysroot=$PLATFORM --extra-cflags="-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon -D__ARM_ARCH_7__-D__ARM_ARCH_7A__" 
make
make install
           

其中NDK是指Android NDK軟體解壓所在目錄,PREFIX是編譯後目标檔案所在目錄,enable-static表示生成靜态庫,如果想打開neon功能必須有-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon。

編譯libfaac

在linux下切換到libfaac庫檔案目錄下建立一個bash批處理檔案内容如下,然後執行。

export NDK="/home/joechiang/android-ndk-r9d"  
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt  
export PLATFORM=$NDK/platforms/android-8/arch-arm  
CFLAGS="-fpic -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_7__ -Wno-psabi -march=armv7 -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP "  
#CFLAGS="-fpic -DANDROID -fpic -mthumb-interwork -D__ARM_ARCH_7__ -Wno-psabi -march=armv7-a -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa, -MMD -MP "  
CROSS_COMPILE=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-  
export CPPFLAGS="$CFLAGS"  
export CFLAGS="$CFLAGS"  
export CXXFLAGS="$CFLAGS"  
export CXX="${CROSS_COMPILE}g++ --sysroot=${PLATFORM}"  
export LDFLAGS="$LDFLAGS"  
export CC="${CROSS_COMPILE}gcc --sysroot=${PLATFORM}"  
export NM="${CROSS_COMPILE}nm"  
export STRIP="${CROSS_COMPILE}strip"  
export RANLIB="${CROSS_COMPILE}ranlib"  
export AR="${CROSS_COMPILE}ar"   
./configure --without-mp4v2 --host=arm-linux --enable-static 
make
make test
sudo make install  
cp -rf /usr/local/include/faac.h ../android-lib/include  
cp -rf /usr/local/include/faaccfg.h ../android-lib/include  
cp -rf /usr/local/lib/libfaac.a ../android-lib/lib
           

編譯ffmpeg

(1)下載下傳FFmpeg源代碼之後,首先需要對源代碼中的configure檔案進行修改。由于編譯出來的動态庫檔案名的版本号在.so之後(例如“libavcodec.so.5.100.1”),而android平台不能識别這樣檔案名,是以需要修改這種檔案名。在ffmpeg庫檔案下的configure檔案中找到下面幾行代碼:

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)'
           

(2)linux下切換到到ffmpeg所在目錄下建立一個bash批處理檔案将libx264和libfaac一起編譯到ffmpeg中

export NDK=/home/joechiang/android-ndk-r9d  
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt  
export PLATFORM=$NDK/platforms/android-8/arch-arm  
export PREFIX=../264fflib-fmeg2.6.9
 ./configure --target-os=linux --prefix=$PREFIX --arch=arm --cpu=armv7-a --enable-cross-compile --enable-runtime-cpudetect --arch=arm --cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc --cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- --disable-stripping --nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm --sysroot=$PLATFORM --enable-gpl --enable-shared --disable-static --enable-nonfree --enable-version3 --enable-small --disable-vda --disable-iconv --enable-libx264 --enable-libfaac --enable-encoder=libx264 --enable-encoder=libfaac --enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug --extra-cflags='-I ../android-lib/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a -mfpu=neon' --extra-ldflags='-L ../android-lib/lib'
make
make install
           

注意一下指令中../android-lib/就是libfaac和libx264編譯後生成檔案所在目錄。

    至此,整個編譯完畢,本文的編譯指令僅供參考,如需縮減或增加ffmpeg的相關功能還需修改編譯指令,編譯完後隻需将編譯好的.so檔案和頭檔案替換原工程中的相應.so和頭檔案,其餘地方不用修改。

測試

  在華為榮耀3C上将同一視訊轉碼成h264編碼格式加速前的時間:5min,加速後需要的時間:1min 43seconds,可見加速效果還是很明顯的。

附:

雷神部落格:http://blog.csdn.net/leixiaohua1020/article/details/47056365

實作後的工程源碼:http://download.csdn.net/detail/jiangzhuo18273176294/9822325

繼續閱讀