1. 程式人生 > >ffmpeg android 平臺移植

ffmpeg android 平臺移植

之前曾寫過一篇《FFmpeg在Linux下安裝編譯過程》,今天有空就用Android Studio編譯FFmpeg庫並移植,並附上呼叫ffmpeg簡單示例,看下Agenda如下:

  • 下載FFmpeg 3.1.3
  • 下載NDK
  • 配置ndk環境
  • 編譯FFmpeg
  • 移植到Android平臺
  • 呼叫編譯的so示例

下載FFmpeg 3.1.3


這裡寫圖片描述

雙擊解壓如下,得到一個資料夾: 

這裡寫圖片描述 

下載NDK

  • 供參考下載地址見本文最下面,也可自行下載。
  • 雙擊解壓如下,同樣得到一個資料夾: 

    這裡寫圖片描述 

配置ndk環境

  • 啟動終端Terminal
  • 進入當前使用者的home目錄 
    • 輸入cd ~ 或 /Users/YourUserName 
  • 建立.bash_profile 
    • 輸入touch .bash_profile
  • 編輯.bash_profile檔案

    • 輸入open -e .bash_profile

    因為是為了配置NDK開發環境,輸入Android NDK下目錄,前面是android sdk的,可以不用動它,最終.bash_profile檔案如下:

    export PATH=$(PATH):/Users/hejunlin/android-sdks/platform-tools    
    export NDK_ROOT=/Users/hejunlin/Downloads/android-ndk-r10e                    
    export PATH=$PATH:$NDK_ROOT
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3
  • 儲存檔案,關閉.bash_profile
  • 更新剛配置的環境變數 
    輸入source .bash_profile
  • 看看剛剛設定的環境變數

離開了編輯器後,在終端輸入 $PATH 並且按enter鍵來確認是否編輯成功,此時應該會出現所有的環境變數(以:號相分隔) 


這裡寫圖片描述 

表明配置成功

接下來·開始進行測試ndk是否能正常編譯jni 
(1) 終端進入到 NDK下面的 samples 目錄下。 
(2) 輸入 cd hello-jni/ ,回車,然後執行 ndk-build 
出現以下介面代表配置成功。 


這裡寫圖片描述 

編譯FFmpeg

  • 在編譯前,在原始碼中,修改FFmpeg的configure
  • 下載FFmpeg原始碼之後,首先需要對原始碼中的configure檔案進行修改。由於編譯出來的動態庫檔名的版本號在.so之後(例如“libavcodec.so.5.100.1”),而android平臺不能識別這樣檔名,所以需要修改這種檔名。在configure檔案中找到下面幾行程式碼(在3209-3212行):
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)'  
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

替換為下面內容:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'  
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'  
SLIB_INSTALL_LINKS='$(SLIBNAME)'  
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

接下來開始寫shell指令碼

這裡有一個坑:我用記事本寫了個sh指令碼,一直報如下錯誤: 


這裡寫圖片描述 

這種情況應該有兩種原因:
  • 1.在WIN底下用文字編輯工具修改過引數變數,在儲存的時候沒注意編碼格式造成的, 
  • 2.也有可能是在VIM裡修改,第一行末尾按到ctrl+v  
    這裡避開這個彎,我找到FFmpeg下一個version.sh的shell指令碼,複製了一份 
    重新命名為build_android.sh。指令碼如下:
#!/bin/sh
NDK=/Users/hejunlin/Downloads/android-ndk-r10e
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

如果大家要編譯,記得改下前三行,對應自己機器上的環境 
接著開始執行這個shell指令碼,在終端輸入 ./ build_android.sh , 如圖: 


這裡寫圖片描述 

開始進行自動編譯: 

這裡寫圖片描述 

中間過程: 

這裡寫圖片描述 

喝杯咖啡時間,就編譯好了,結果如下: 

這裡寫圖片描述 

這時會發現 FFmpeg下多了一個資料夾android: 

這裡寫圖片描述 

開啟如下: 

這裡寫圖片描述 

這樣我們要的so就有了,當然,這只是基本的。

移植到Android平臺

接下來寫在Android studio寫一個示例,呼叫ffmpeg中方法 
建一個工程:在src/main下建一個jni目錄 


這裡寫圖片描述 

把前面編譯好的android目錄移植過來 

這裡寫圖片描述 

simplest_ffmpeg_helloworld.c程式碼如下: 

這裡寫圖片描述 

Android.mk檔案內容如下: 

這裡寫圖片描述 

本文出自逆流的魚yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331

開始編譯目標so,在Studio中的Terminal面板中:執行ndk-build 
(在此之前記得要在local.properties下配置ndk目錄) 


這裡寫圖片描述

會在libs下面生成一些so,也可以看到我們目標so: 

這裡寫圖片描述 

然後建立一個jniLibs資料夾,把這些so拷貝進去

呼叫編譯的so示例

接著寫MainActivity程式碼,如下: 


這裡寫圖片描述 

最終效果如圖: 


這裡寫圖片描述 

本文轉載自:http://blog.csdn.net/hejjunlin/article/details/52661331

[天天寫程式碼快變木頭人了,來關注我的微信公眾號“蹲坑兒旁騖”或者我的頭條號“蹲坑兒”,我們一起蹲坑兒、解悶兒、為生活添料!]


相關推薦

ffmpeg android 平臺移植

之前曾寫過一篇《FFmpeg在Linux下安裝編譯過程》,今天有空就用Android Studio編譯FFmpeg庫並移植,並附上呼叫ffmpeg簡單示例,看下Agenda如下: 下載FFmpeg 3.1.3下載NDK配置ndk環境編譯FFmpeg移植到Android平臺

FFMPEG研究: FFmpegAndroid平臺移植編譯

摘要:本文主要介紹將FFmpeg音視訊編解碼庫移植到Android平臺上的編譯和基本測試過程。 環境準備: Ubuntu12.04 TLS android-ndk-r9d-linux-x86_64.tar.bz2 adt-bundle-windows-x86_

FFmpegAndroid平臺移植及使用

參考部落格 http://blog.csdn.net/gobitan/article/details/22750719 原始碼下載:http://download.csdn.net/detail/h291850336/9166229 失敗多了就成功了..... 環境

FFmpegAndroid平臺移植—編譯篇

摘要:本文主要介紹將FFmpeg音視訊編解碼庫移植到Android平臺上的編譯和基本測試過程。 環境準備: Ubuntu12.04 TLS android-ndk-r9d-linux-x86_64.tar.bz2 ffmpeg3.0 第一步:下載 1.配置ubunt

Android平臺移植ffmpeg的一些筆記

首先: 是要編譯libjnivideo.so和libjniaudio.so 這兩個so因為不同的版本或者修改過的framework是不一樣的,所以需要在android原始碼中 編譯出自己的so。我的android 2.1原始碼是從官網下載回來的,沒有經過修改。 編譯主要

Cocos2d-x v3.0正式版嘗鮮體驗【2】 Android平臺移植

生成 ble ack nts 做的 導入 eclipse so文件 腳本 今天沒事又嘗試了下3.0正式版關於Android平臺的移植,把新建的項目移植了下。過程僅用了十分鐘左右,什麽概念?!好吧,事實上我想說,這個版本號真的移植非常輕松啊,只是還沒加上其它東西,只是就眼

Android平臺移植經驗小結

Android Studio使用經驗 快捷鍵 去某行 Ctrl+G 回到上一編輯位置 View | Toolbar duplicates當前行或選中塊 Ctrl+D 特性 Project頁面,便於檢視生成的

FFMEPG 平臺移植,介面簡化和外部模組接入 (四)ffmpeg android移植(ffmpeg 視訊編碼)

FFMPEG 視訊編碼最常見的H264,H265需要X264,X265外部模組支援,可以從我們開源平臺的FFMPEG編譯專案裡面獲取程式碼和配置進行一鍵式編譯:https://github.com/Car-eye-team/Car-eye-FFMPEG,我們下面的程式碼主要是為了簡化程式碼呼叫結構。只需要配置

Ubuntu下用NDK編譯移植FFmpeg 2.0(配置最新版x264)到Android平臺

將x264配置到ffmpeg中需要先編譯x264,生成靜態庫或動態庫。因為264的靜態庫本身不大(我編譯完成後是1.1M)且考慮到平臺移植問題,這裡選擇的是編譯生成靜態庫。 準備,新建工作空間 (1)建立總目錄FFmpeg-Android eg: mkdir workspace --> cd wor

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

Car-eye-FFMPEG專案是Car-eye 開源平臺的一個新專案,目的是在FFMPEG專案和其外部模組,如freetype,X264的基礎上建立一個多平臺編譯,介面呼叫簡單的工具集。本部落格是一個連載,首先從android開始寫吧。因為FFMPEG本身對android編譯

ubuntu移植libcurl到Android平臺

簡書排版 http://www.jianshu.com/p/332011ebd6e5 最近移植了很多C++平臺的庫,很多都是後臺開發的庫,因為NDK開發,以後很可能會使用,提前預研一下。 libcurl這個庫很有名,用的人比較多,下載原始碼,直接就可以編譯使用,以前在Windows平

ubuntu移植crypto++到Android平臺

簡書排版 http://www.jianshu.com/p/eaeeed899251 ubuntu移植crypto++到Android平臺 官方Wiki http://www.cryptopp.com/wiki/Android_(Command_Line) 這個移植比較簡單,

只能用Android studio做平臺移植了! 在Windows10下, 開發Android

  安裝好IDE後, 會一直顯示同步失敗, 看看如下步驟:   需要注意的是:  -> 安裝NDK      自帶的NDK就是辣雞!    自己去下一個15版本的 -> 按照系統提示一步一步安裝其他未安裝的元

Mac環境下Android Studio移植FFmpeg

準備: 1. Android Studio 2. FFmpeg-2.8.4   3. android-ndk-r10e 一、ndk編譯ffmpeg 1.下載ffmpeg和ndk ffmpeg下載地址:http://

android平臺下基於ffmpeg和ANativeWindow實現簡單的視訊播放器

音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

android平臺下基於ffmpeg採集Camera資料編碼成H.264推流到RTMP伺服器

音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

android平臺下基於ffmpeg對相機採集的NV21資料編碼為MP4視訊檔案

音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

Tensor on Android學習筆記(三) ----將Yolo移植android平臺

yolo v2移植到android已經有很多案例了專案地址在https://github.com/chentyjpm/DarknetDemoInAndroid不過原博主提供的apk是經過優化的,我自己編譯的還達不到原博主的效果,還需要再改善然後我們要做的就是將v3版本移植夠來

Android系統移植平臺開發(五)- 編譯Android原始碼

2.3編譯Android原始碼 Android原始碼體積非常龐大,由Dalvik虛擬機器、Linux核心、編譯系統、框架程式碼、Android定製C庫、測試套件、系統應用程式等部分組成,在編譯Android原始碼之前,必須要先掌握Android原始碼的組成。 2.3.1An

Android系統移植平臺開發(八)- HAL Stub框架分析

HAL stub的框架比較簡單,三個結構體、兩個常量、一個函式,簡稱321架構,它的定義在:@hardware/libhardware/include/hardware/hardware.h@hardware/libhardware/hardware.c/* 每一個硬體都通