Android Mac編譯FFmpeg殿遂,并使用

Android Mac編譯FFmpeg命咐,并使用

FFmpeg 全稱(First Forward MPEG)篡九,是一款領(lǐng)先的開源多媒體框架,采用 LGPL 或 GPL 許可證醋奠,除了具有音視頻編解碼功能外榛臼,還有視頻格式轉(zhuǎn)換、視頻抓圖窜司、視頻水印沛善、推流等功能。 FFmpeg 在 Linux 平臺(tái)下開發(fā)塞祈,但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行金刁,包括 Windows 、Mac OS X 等织咧。

FFmpeg官網(wǎng)

FFmpeg它主要含有以下幾個(gè)核心庫:

  • 1胀葱、libavcodec-提供了更加全面的編解碼實(shí)現(xiàn)的合集
  • 2漠秋、libavformat-提供了更加全面的音視頻容器格式的封裝和解析以及所支持的協(xié)議
  • 3笙蒙、libavutil-提供了一些公共函數(shù)
  • 4、libavfilter-提供音視頻的過濾器庆锦,如視頻加水印捅位、音頻變聲等
  • 5、libavdevice-提供支持眾多設(shè)備數(shù)據(jù)的輸入與輸出搂抒,如讀取攝像頭數(shù)據(jù)艇搀、屏幕錄制
  • 6、libswresample,libavresample-提供音頻的重采樣工具
  • 7求晶、libswscale-提供對視頻圖像進(jìn)行色彩轉(zhuǎn)換焰雕、縮放以及像素格式轉(zhuǎn)換,如圖像的YUV轉(zhuǎn)換
  • 8芳杏、libpostproc-多媒體后處理器

以及包含以下幾個(gè)工具:

  • 1矩屁、ffmpeg-一個(gè)流媒體的編解碼辟宗、格式轉(zhuǎn)換以及多媒體流的內(nèi)容處理工具
  • 2、ffplay-一個(gè)使用FFmpeg編解碼的播放器
  • 3吝秕、ffprobe-一個(gè)多媒體分析工具4泊脐、ffserver-一個(gè)流多媒體服務(wù)器

一、下載源碼

到官網(wǎng)中下載對應(yīng)源碼烁峭。如:ffmpeg-4.1.tar.bz2

二容客、下載NDK

為什么下載:Google搜到的一句話Android Studio 自帶的 NDK 缺少部分 .h 文件,不確定是否跟 Android Studio 的 版本或者 NDK 版本有關(guān)约郁,也不確定是否所有人都這樣缩挑。但為了簡單,還是下載吧(下載下來的的這個(gè) NDK 只為了編譯 FFmpeg鬓梅,不影響之前的 NDK)

  • 1.下載源碼NDK调煎,我的版本android-ndk-r17c,如果用r18會(huì)編譯不出來(ffmpeg對應(yīng)4.1的時(shí)候)己肮。
  • 2.把下載的源碼放到~/Library 文件夾中

三士袄、配置NDK環(huán)境變量

  • 1.在命令行中輸入vim ~/.bash_profile

  • 2.添加NDK環(huán)境

    #NDK_ROOT換成自己NDK路徑
    export NDK_ROOT=/Users/kaixun002/Library/Android_NDK/android-ndk-r17c
    export PATH=${PATH}:${NDK_ROOT}
    
  • 3.保存退出,并運(yùn)行source ~/.bash_profile

四谎僻、修改configure文件

用vim打開娄柳,用命令行/查找SLIBNAME_WITH_MAJOR以快速定位

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

五、配置build_android.sh

  • 1.進(jìn)入下載的ffmpeg包下cd ~/Downloads/ffmpeg-4.1

  • 2.創(chuàng)建一個(gè)空文件build_android.sh

  • 3.編輯這個(gè)文件vim build_android.sh 拷貝的網(wǎng)上的

    • 單平臺(tái)腳本
    #!/bin/bash
    
    ADDI_CFLAGS="-marm"
    API=19
    PLATFORM=arm-linux-androideabi
    CPU=x86_64 # 'armeabi-v7a' 'x86_64'
    NDK=/Users/kaixun002/Library/Android_NDK/android-ndk-r17c # 修改成自己本地的ndk路徑艘绍。
    SYSROOT=$NDK/platforms/android-$API/arch-arm/
    ISYSROOT=$NDK/sysroot
    ASM=$ISYSROOT/usr/include/$PLATFORM
    TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64
    OUTPUT=$(pwd)/android/$CPU #自己指定一個(gè)輸出目錄赤拒,用來放生成的文件的。
    function build
    {
    echo "開始編譯ffmpeg"
    
    ./configure \
    --prefix=$OUTPUT \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=android \
    --arch=armeabi-v7a \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
    --extra-ldflags="-marm" \
    $ADDITIONAL_CONFIGURE_FLAG
      make clean
      # 這里是定義用幾個(gè)CPU編譯诱鞠,我用4個(gè)挎挖,一般在5分鐘之內(nèi)編譯完成
      make -j4
      make install
    
    echo "編譯結(jié)束!"
    }
    
    build
    
    • 多架構(gòu)的腳本來自多架構(gòu)腳本航夺,需要添加NDK位置

      #!/bin/sh
      
      PREFIX=android-build
      HOST_PLATFORM=linux-x86_64
      
      COMMON_OPTIONS="\
          --target-os=android \
          --disable-static \
          --enable-shared \
          --enable-small \
          --disable-programs \
          --disable-ffmpeg \
          --disable-ffplay \
          --disable-ffprobe \
          --disable-doc \
          --disable-symver \
          --disable-asm \
          --enable-decoder=vorbis \
          --enable-decoder=opus \
          --enable-decoder=flac 
          "
      
      build_all(){
          for version in armeabi-v7a arm64-v8a x86 x86_64; do
              echo "======== > Start build $version"
              case ${version} in
              armeabi-v7a )
                  ARCH="arm"
                  CPU="armv7-a"
                  CROSS_PREFIX="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/$HOST_PLATFORM/bin/arm-linux-androideabi-"
                  SYSROOT="$NDK_HOME/platforms/android-21/arch-arm/"
                  EXTRA_CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=softfp -mvectorize-with-neon-quad"
                  EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
              ;;
              arm64-v8a )
                  ARCH="aarch64"
                  CPU="armv8-a"
                  CROSS_PREFIX="$NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/$HOST_PLATFORM/bin/aarch64-linux-android-"
                  SYSROOT="$NDK_HOME/platforms/android-21/arch-arm64/"
                  EXTRA_CFLAGS=""
                  EXTRA_LDFLAGS=""
              ;;
              x86 )
                  ARCH="x86"
                  CPU="i686"
                  CROSS_PREFIX="$NDK_HOME/toolchains/x86-4.9/prebuilt/$HOST_PLATFORM/bin/i686-linux-android-"
                  SYSROOT="$NDK_HOME/platforms/android-21/arch-x86/"
                  EXTRA_CFLAGS=""
                  EXTRA_LDFLAGS=""
              ;;
              x86_64 )
                  ARCH="x86_64"
                  CPU="x86_64"
                  CROSS_PREFIX="$NDK_HOME/toolchains/x86_64-4.9/prebuilt/$HOST_PLATFORM/bin/x86_64-linux-android-"
                  SYSROOT="$NDK_HOME/platforms/android-21/arch-x86_64/"
                  EXTRA_CFLAGS=""
                  EXTRA_LDFLAGS=""
              ;;
              esac
      
              echo "-------- > Start clean workspace"
              make clean
      
              echo "-------- > Start config makefile"
              configuration="\
                  --prefix=${PREFIX} \
                  --libdir=${PREFIX}/libs/${version}
                  --incdir=${PREFIX}/includes/${version} \
                  --pkgconfigdir=${PREFIX}/pkgconfig/${version} \
                  --arch=${ARCH} \
                  --cpu=${CPU} \
                  --cross-prefix=${CROSS_PREFIX} \
                  --sysroot=${SYSROOT} \
                  --extra-ldexeflags=-pie \
                  ${COMMON_OPTIONS}
                  "
      
              echo "-------- > Start config makefile with ${configuration}"
              ./configure ${configuration}
      
              echo "-------- > Start make ${version} with -j8"
              make j8
      
              echo "-------- > Start install ${version}"
              make install
              echo "++++++++ > make and install ${version} complete."
      
          done
      }
      
      echo "-------- Start --------"
      build_all
      echo "-------- End --------"
      
  • ls -l build_android.sh這個(gè)命令查看到當(dāng)前文件沒有可執(zhí)行權(quán)限蕉朵,添加權(quán)限chmod a+x build_android.sh

  • 運(yùn)行當(dāng)前文件./build_android.sh

  • 編譯編譯成功后,生成三個(gè)文件夾分別為include(頭文件)阳掐、lib(.so動(dòng)態(tài)庫)始衅、share

六、集成(未完成)

由于項(xiàng)目時(shí)間原因缭保,先集成ffmpeg-android-java

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汛闸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艺骂,更是在濱河造成了極大的恐慌诸老,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钳恕,死亡現(xiàn)場離奇詭異别伏,居然都是意外死亡吮廉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門畸肆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宦芦,“玉大人,你說我怎么就攤上這事轴脐〉鞅埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵大咱,是天一觀的道長恬涧。 經(jīng)常有香客問我,道長碴巾,這世上最難降的妖魔是什么溯捆? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮厦瓢,結(jié)果婚禮上提揍,老公的妹妹穿的比我還像新娘。我一直安慰自己煮仇,他們只是感情好劳跃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浙垫,像睡著了一般刨仑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夹姥,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天杉武,我揣著相機(jī)與錄音,去河邊找鬼辙售。 笑死轻抱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圾亏。 我是一名探鬼主播十拣,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼封拧,長吁一口氣:“原來是場噩夢啊……” “哼志鹃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泽西,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤曹铃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捧杉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陕见,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秘血,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了评甜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灰粮。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忍坷,靈堂內(nèi)的尸體忽然破棺而出粘舟,到底是詐尸還是另有隱情,我是刑警寧澤佩研,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布柑肴,位于F島的核電站,受9級特大地震影響旬薯,放射性物質(zhì)發(fā)生泄漏晰骑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一绊序、第九天 我趴在偏房一處隱蔽的房頂上張望硕舆。 院中可真熱鬧,春花似錦骤公、人聲如沸岗宣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耗式。三九已至,卻和暖如春趁猴,著一層夾襖步出監(jiān)牢的瞬間刊咳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工儡司, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娱挨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓捕犬,卻偏偏與公主長得像跷坝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子碉碉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容