1. 程式人生 > 程式設計 >Live-client-3-faac編譯

Live-client-3-faac編譯

本文Android Studio編譯部分參考自:AndroidStudio編譯faac的so動態庫

在音視訊開發中,常常需要將原生音訊PCM資料轉為AAC、MP3、AC3等音訊格式,然後再將音訊資料放入到視訊編碼中進行處理,或者將PCM轉為音訊格式後,再進行音訊調音、優化等處理。不論最後音訊呈現的形式是怎麼樣的,最初處理的還是原生音訊PCM資料。

一、音訊格式

(一)PCM

PCM(pulse code modulation,脈碼調製錄音),所謂的PCM錄音就是將聲音等模擬訊號變成符號化的脈衝列,再予以記錄。PCM訊號是由[1]、[0]等符號構成的數字訊號,而未經過任何編碼和壓縮處理,與模擬訊號相比,不易受傳送系統的雜波及失真的影響。動態範圍廣,可以得到音質相當好的影響效果。

(二)MP3

MP3是一種音訊壓縮技術,全稱是動態影響專家壓縮技術標準音訊層面3(Moving Picture Experts Group Audio Layer 3),簡稱MP3。**利用MP3技術,可以將音樂以1:10甚至1:12的壓縮率,壓縮成容量較小的檔案,而重放的音質與最初的不壓縮音訊相比沒有明顯的下降。**MP3利用人耳對高頻聲音訊號不敏感的特性,將時域波形訊號換為頻域訊號,並將劃分成多個頻段,對不同的頻段使用不同的壓縮率,如對高頻訊號採用較大壓縮率,或者直接忽略;對低頻訊號使用較小的壓縮率,保證訊號不失真。這樣就達到較高的壓縮率。

(三)AC3

AC3(Audio Coding Version 3),是Dolby實驗室所發展 的有損音訊編碼格式,AC3被廣泛應用於5.1聲道。AC3普及程度很高,以384-448kb/s的位元速率應用於鐳射唱片和DVD,也以640kb/s的位元速率廣泛應用於電影院。

(三)AAC

AAC是高階編碼(Advanced Audio Coding)的縮寫,一種專為聲音資料設計的檔案壓縮格式。最初基於MPEG-2的音訊編碼技術,後來MPEG-4出現,AAC又重新集成了新技術,稱為MPEG-4 AAC。與MP3相比,AAC採用了全新的演演算法進行編碼,在感覺聲音質量沒有明顯減低的前提下,檔案格式更加小巧。缺點在於:AAC屬於有損編碼,與其他編碼格式有實質上的區別。

AAC有如下規格,以適應不用的場合需要:

  1. MPEG-2 AAC LC: 低複雜度規格(low complexity),比較簡單,沒有增益控制,但是提高了編碼效率。
  2. MPEG-2 AAC Main:主規格
  3. MPEG-2 AAC SSR:可變取樣率規格(Scaleable Sample Rate)
  4. MPEG-4 AAC LC:低複雜度規格(low complexity),手機中常見的Mp4檔案的音訊部分就使用該規格的音訊檔案
  5. MPEG-4 AAC Main:主規格,包含了除增益控制之外的全部功能,其音質最好
  6. MPEG-4 AAC SSR:可變取樣率規格(Scaleable Sample Rate)
  7. MPEG-4 AAC LTP:長時其的預測規格(Long Term Predicition)
  8. MPEG-4 AAC LD:低延遲規格(Low Delay)
  9. MPEG-4 AAC HE:高效率規格(High Efficieney),這種規格適用於低位元速率編碼,有Nero ACC編碼器支援。

總的來說,AAC規格,主要分為MPEG2、MPEG4兩代,每代中又有主規格、可變取樣率規格、低複雜度及效率類規格。

二、FAAC

FAAC和FAAD2分別是開源的MPEG-2和MPEG-4 AAC音訊編碼和解碼器。FAAC的主要目的是將原聲PCM音訊資料編碼成AAC格式的音訊資料;而FAAD2則相反,是將AAC格式的音訊資料解碼成原生PCM音訊資料。

(一)FAAC編譯

想要在Android系統中使用FAAC編碼,就需要將FAAC這個庫編譯成動態庫(.so)。編譯FAAC需要NDK的環境,可以在Linux下進行通過Shell指令碼編譯,也可以通過Android Studio進行編譯。

官網下載原始碼包,這裡下載的是faac-1.29.9.2.tar.gz版本

1、Android Studio編譯

  1. 建立一個支援NDK的Android專案,然後將所有原始碼匯入到JNI目錄中,並將config.h.in檔案的配置名修改為config.h,否則會報錯。
    JNI.png
  2. 然後在Jni目錄中建立Android.mk和Application.mk檔案
  • Android.mk
LOCAL_PATH := $(call my-dir)
FAAC_TOP := $(LOCAL_PATH)
include $(CLEAR_VARS)
include $(FAAC_TOP)/libfaac/Android.mk
複製程式碼
  • Application.mk:標註要構建的動態庫的型別,all表示全平臺
APP_ABI := all`
複製程式碼
  1. 在libfaac目錄中建立Android.mk檔案,表明編譯時需要用到哪些原始碼和依賴工具。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libfaac
LOCAL_SRC_FILES:=       \
        aacquant.c      \
        backpred.c      \
        bitstream.c     \
        channels.c      \
        fft.c           \
        filtbank.c      \
        frame.c         \
        huffman.c       \
        ltp.c           \
        midside.c       \
        psychkni.c      \
        tns.c           \
        util.c          \

LOCAL_C_INCLUDES :=     \
    $(LOCAL_PATH)       \
    $(FAAC_TOP)         \
    $(FAAC_TOP)/include
LOCAL_CFLAGS:= -DHAVE_CONFIG_H
include $(BUILD_SHARED_LIBRARY)
複製程式碼
  1. 在module的build.gradle中加入ndkBuild的配置
    sourceSets { main { jni.srcDirs = ['src/main/jni/'] } }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
複製程式碼
  1. 最後一步,rebuild Project後,就會生成全平臺的libfaac.so檔案
    圖片.png

2、Linux編譯

  1. 同樣下載原始碼包,然後進行解壓
tar -zxvf faac-1.29.9.2.tar.gz
複製程式碼
  1. 建立一個build_faac.sh檔案,並通過Vim寫入如下內容:ndk路徑、編譯平臺、編譯依賴、生成目標地址等。
#!/bin/bash
CPU=arm
NDK=/usr/ndk/android-ndk-r14b
export PLATFORM=$NDK/platforms/android-9/arch-arm
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
export PREFIX="$(pwd)/android/arm"
export CROSS_COMPILE=$PREBUILT/arm-linux-androideabi- 

export CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300"

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 --program-prefix=$PREFIX --without-mp4v2 --host=arm-linux

make
cp ./libfaac/.libs/*.a $PREFIX/lib
cp ./libfaac/.libs/*.so $PREFIX/lib
cp ./include/*.h $PREFIX/include
複製程式碼
  1. 給build_faac.sh新增執行許可權,然後執行
chmod +x build_faac.sh
./build_faac.sh
複製程式碼
  1. 執行完畢後,就會在android/arm/lib中找到libfaac.so動態庫檔案。注意此動態庫只支援armv7-a的架構,如果需要支援arm64-v8a、x86、x86_64等架構,就需要對編譯指令碼中PREBUILT、CFLAGS等進行相應的修改,再進行編譯。

FAAC的編譯就到此結束了,至於他的使用會在後續文章中和其他開源庫的使用一同講訴。