win10 WSL(Ubuntu)編譯ffmpeg for Android

前言

之前一直想做音視頻相關(guān)的東西,項目中用的東西也是別人封裝或著編譯好的so庫。感覺自己很low,所以就從源頭著手學(xué)習以下音視頻的相關(guān)東西。說到音視頻當然繞不開FFMpeg了,這兩天編譯了一下Android端使用的FFMpeg的so庫,期間遇到了一些問題,特此記錄一下。文章有點長請耐心觀看。

首先

什么是FFMpge?

  `FFmpeg`是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序。它包括了目前領(lǐng)先的音/視頻編碼庫
libavcodec。`FFmpeg`是在 `Linux`下開發(fā)出來的,但它可以在包括 `Windows` 在內(nèi)的大多數(shù)操作系統(tǒng)中編譯。這個項目是由
 `Fabrice Bellard` 發(fā)起的,現(xiàn)在由 `Michael Niedermayer` 主持。可以輕易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換,例如可以將
攝錄下的視頻avi等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站所采用的flv格式。

什么是win10WSL

`WSL`就是`win10`推出的新功能-子系統(tǒng),全稱WindowsSubsystemforLinux,和虛擬機一樣,可以安裝特定的`Linux`。

如何安裝WSL?

image.png
image.png
image.png
image.png

注意: 點擊獲取前需要登錄Microsoft賬號,要不不能獲取。另外,至于ubuntu如何設(shè)置這里就不討論了。各位可以自行嘗試,生命在于折騰。

編譯FFMpeg需要什么?

  • 1、FFMpeg
  • 2、NDK
  • 3、NDK的環(huán)境變量設(shè)置
    注意:我這里以FFMpeg4.0.2版本和NDKandroid-ndk-14b進行編譯的。盡量不要用最新的庫進行編譯,當然,如果你是大佬或者踩坑達人當我沒說。
image.png
image.png

注意:WSLwin10可以通過共享文件進行文件傳遞,也可以直接在ubuntu命令行下進行文件操作,我這里直接是下載到win10E盤的chromeDownLoad文件夾中,那么如何移動到我們的ubuntu特定路徑下呢?

首先在使用ls -all查看所有文件夾,并且在home路徑下創(chuàng)建ffmpeg文件夾,然后切換到win10的路徑下,命令如下

//查看所有文件
ls -all
//切換到home路徑下
cd /home
//創(chuàng)建ffmpeg文件夾
sudo mkdir ffmpeg
// 切換到根目錄下
cd ..
//切換到`mnt`路徑下,`mnt`就是`win10`的路徑
 cd mnt
//查看mnt下的所有盤
ls -all 
//切換到e盤
cd e
//切換到chromeDownLoad路徑下
cd chromeDownLoad
//移動ffmpeg-4.0.2.tar.gz到home/ffmpeg路徑下
suduo mv ffmpeg-4.0.2.tar.gz  /home/ffmpeg
//解壓ffmpeg-4.0.2.tar.gz文件
sudo tar -xzvf ffmpeg-4.0.2.tar.gz,如果出錯了請使用
sudo tar -xvf ffmpeg-4.0.2.tar.gz

到這里ffmpeg的材料就準備好了,那么,ndkNDK的環(huán)境變量呢?

// 在usr下創(chuàng)建ndk文件夾
sudo mkdir /usr/ndk
//切換到e盤chromeDownLoad路徑下
cd /mnt/e/chromeDownLoad
//移動ndk壓縮包到/usr/ndk中
sudo mv android-ndk-r14b-linux-x86-64.zip /usr/ndk
//解壓android-ndk-r14b-linux-x86-64.zip ,如果沒有安裝zip的話首先需要安裝zip
//安裝zip
sudo apt-get install zip
//解壓包
sudo unzip android-ndk-r14b-linux-x86-64.zip

配置NDK環(huán)境變量,需要在vim中操作,剛開始使用可能不太習慣,靜下心來慢慢操作就好。

  • 1、在命令行中輸入sudo vim ~/.bashrc

  • 2、打開vim之后點擊i鍵進行編輯來設(shè)置環(huán)境變量(如果你的路徑和我的一致那么直接使用下面環(huán)境變量即可)

    export NDKROOT=/usr/ndk/android-ndk-r14b
    export PATH=$NDKROOT:$PATH
    
  • 3、點擊Esc鍵退出編輯模式,輸入:wq保存退出

  • 4、source ~/.bashrc更新環(huán)境變量,如果沒有權(quán)限就加上sudo

到此環(huán)境變量NDK還有ffmpeg包都準備好了

其次

配置FFMpeg的配置文件

  • 1、切換到FFMpeg文件路徑下

    cd /home/ffmpeg/ffmpeg-4.0.2
    
  • 2、打開configure文件夾

    sudo vim configure
    
  • 3、看到好長一大串是不是會頭暈眼花?別著急,直接輸入: ? build setting就會到我們需要改的地方的,然后點擊i鍵進行修改

    image.png

    image.png

  • 4、修改
    將下面的

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

這一步的主要目的是生成Android能夠使用的 名稱-版本.so文件的格式,不然的話生成的是Linux上使用庫,Android不能用。

  • 5、編寫Android編譯的腳本

在解壓后的文件夾ffmpeg-4.0.2中,新建build_android.sh文件(使用的shell命令sudo touch build_android.sh
輸入命令sudo vim build_android.sh,點擊Enter打開文件,在文件中粘貼下面內(nèi)容:

export SYSROOT=$NDK/platforms/android-14/arch-arm/
#編譯使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
# 這個是輸出的路徑
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
    --prefix=$PREFIX --arch=arm \
    --disable-doc \
    --enable-shared \
    --disable-static \
    --disable-x86asm \
    --disable-symver \
    --enable-gpl \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

注意:粘貼完成后,點擊Esc鍵然后輸入:wq然后開始編譯。

  • 6、開始編譯,在命令行輸入sudo chmod a+x build_android.sh,然后再輸入sudo ./build_android.sh開始編譯。這里你可能會編譯不成功,提示的是沒有安裝make所以首先需要安裝make在命令行下輸入sudo apt-get install make即可,然后等待安裝完成。
  • 7、經(jīng)過漫長的等待后會再ffmpeg-4.0.2的路徑下會生成一個android文件夾里面就是編譯成功的so庫
image.png
image.png

最后

再說一點Android端如何生成頭文件?

  • 1、創(chuàng)建VideoConfig

    public class VideoConfig {

      static {
          System.loadLibrary("avcodec-58");
          System.loadLibrary("avfilter-7");
          System.loadLibrary("avformat-58");
          System.loadLibrary("avutil-56");
          System.loadLibrary("postproc-55");
          System.loadLibrary("swresample-3");
          System.loadLibrary("swscale-5");
          System.loadLibrary("yffmpeg");
      }
    
      public native String avformatinfo();
    
      public native String avcodecinfo();
    
      public native String avfilterinfo();
    
      public native String configurationinfo();
    

    }

  • 2、點擊build===>Rebuild Project會生成一個build文件

image.png
image.png
  • 3、生成頭文件(javakotlin的生成路徑是有區(qū)別的),命令如下:

    javah -classpath "生成的路徑" 全類名
    

注意:如果命令使用錯了會找不到類名,并且當你百度的時候你會欲哭無淚的。既然已經(jīng)知道重要了,那么如何生成呢?看下面

如果你創(chuàng)建的是java文件,那么命令如下

javah -classpath     "F:\AndroidJetPack\CustomNode\videolibrary\build\intermediates\javac\debug\classes" 

com.yk.silence.videolibrary.VideoConfig

其中F:\AndroidJetPack\CustomNode\videolibrary\build\intermediates\javac\debug\classes就是你的路徑。

image.png

如果你創(chuàng)建的是kotlin文件,那么命令如下

javah -classpath "F:\AndroidJetPack\CustomNode\videolibrary\build\tmp\kotlin-classes\debug" 
com.yk.silence.videolibrary.VideoConfig
image.png

感謝

編譯FFmpeg for Android

題外話

如果你有不明白的地方或者對ffmpeg感興趣可以進水群(493180098)探討啊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容