FFMPEG學(xué)習(xí)第一篇--android studio 2.3 Cmake 編譯并使用ffmpeg的動態(tài)so庫

最近萌生了學(xué)習(xí)視頻的想法判沟,遂在網(wǎng)上找了文章來看在孝,才知道曾經(jīng)有過雷神的存在。雷神的博客激勵著一波又一波走向音視頻編碼的程序員,看著他寫的博客浸须,心中對ffmpeg開源項目,不免升起一種難以割舍的情愫香璃。

網(wǎng)上關(guān)于FFMPEG的編譯so庫教程很多,最開始走了很多彎路舟误,導(dǎo)致編譯不成功葡秒,最后盡管編譯成功了,應(yīng)用到android studio上嵌溢,還是無法實現(xiàn)雷神的那個簡單的hello ffmpeg的項目眯牧。最后在這兩篇博客的啟發(fā)下,終于還是寫出來了赖草。最純粹的直播技術(shù)實戰(zhàn)01-FFmpeg的編譯與運行学少,以及最簡單的android studio 2.3 引用FFmpeg例子程序。前者是將ffmpeg編譯成了靜態(tài)庫秧骑,后者是通過將ffmpeng編譯成了動態(tài)庫版确,雖然在android studio的jni中引用的庫的方式不一樣,但是殊途同歸乎折。

一:mac環(huán)境下的ffmpeg的編譯

ffmpeng的編譯绒疗,一般是通過腳本來實現(xiàn)。當(dāng)我們從ffmpeg的官網(wǎng)上下載了最新的源碼之后骂澄,可以在源碼的根目錄下創(chuàng)建一個.sh的文件吓蘑。由于我將ffmpeg的源碼放在了這個位置/Users/xiaguangcheng/ffmpeg/ffmpeg/,因此我的腳本文件就是ffmpegbuild.sh:

#!/bin/bash
export TMPDIR=/Users/xiaguangcheng/ffmpeg/ffmpeg/ffmpegtemp
NDK=/Users/xiaguangcheng/android/android-sdk-macosx/ndk-bundle
SYSROOT=$NDK/platforms/android-18/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=arm
PREFIX=/Users/xiaguangcheng/ffmpeg/ffmpeg/android
ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-gpl \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--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
}
build_one

這里需要注意的幾點:

  • TMPDIR 對應(yīng)的ffmpegtemp是一個文件夾坟冲,需要自己手動創(chuàng)建士修,不然會有異常等你。
  • NDK的位置需要配置你自己的樱衷。
  • SYSROOT 和TOOLCHAIN同樣的道理。
  • PREFIX 是打包生成的so文件和.h頭文件的位置酒唉。
  • 在編譯之前需要將ffmpeg文件夾下的configure文件中的部分字段進(jìn)行修改矩桂,引用的那兩篇文章中都有詳細(xì)說明。

有時候編譯還需要yasm,因此可以先通過homebrew 安裝yasm

brew install yasm

配置完成之后侄榴,我們就可以cd到當(dāng)前ffmpeg的根目錄雹锣,通過運行

./ffmpegbuild.sh

的方式啟動這個編譯過程。

之后就可以生成這樣的一個文件夾:

image.png

二:通過android studio2.3 完成對ffmpeg so庫的調(diào)用

  • (一)獲取Cmake
    由于在android studio2.2之后癞蚕,官方就推薦我們使用Cmake來編譯原生庫蕊爵,因此我們首先應(yīng)該下載并安裝Cmake。這一點android stuido在SDK Tools中桦山,已經(jīng)為我們提供了方便獲得的渠道攒射,只要我們打勾下載就可以了。
image.png
  • (二)創(chuàng)建一個包含c++的項目
    在我們創(chuàng)建新項目的時候恒水,記得勾選include c++ support会放,不然里面的一些文件以及文件夾就需要我們手動創(chuàng)建,雖然這樣也可以钉凌。然后就是一路綠燈加速前進(jìn)了咧最。
image.png
  • (三)依賴ffmpeg 的so庫和頭文件
    我們把前面生成的ffmpeg的so和頭文件拷貝到項目中來,記得添加到對應(yīng)的文件夾中御雕。so放在自己手動創(chuàng)建的jniLibs/armeabi中矢沿。頭文件放在自己手動創(chuàng)建的ffmpeg3/include中。


    image.png
  • (四)配置CMakeLists.txt 文件酸纲。
    由于項目采用了CMake來管理C++原生代碼捣鲸,因此我們還需要來配置該文件。具體的CMake使用方法福青,可以參看 CMake的官方文檔摄狱。下面貼出本項目的配置。
cmake_minimum_required(VERSION 3.4.1)
set(lib_src_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})

add_library(native-lib  SHARED src/main/cpp/native-lib.cpp)
add_library(avcodec-57 SHARED IMPORTED)
add_library(avformat-57 SHARED IMPORTED)
add_library(avutil-55 SHARED IMPORTED)
add_library(swresample-2 SHARED IMPORTED)
add_library(swscale-4 SHARED IMPORTED)

set_target_properties(avcodec-57 PROPERTIES IMPORTED_LOCATION
${lib_src_DIR}/libavcodec-57.so)
set_target_properties(avformat-57 PROPERTIES IMPORTED_LOCATION
${lib_src_DIR}/libavformat-57.so)
set_target_properties(avutil-55 PROPERTIES IMPORTED_LOCATION
${lib_src_DIR}/libavutil-55.so)
set_target_properties(swresample-2 PROPERTIES IMPORTED_LOCATION
${lib_src_DIR}/libswresample-2.so)
set_target_properties(swscale-4 PROPERTIES IMPORTED_LOCATION
${lib_src_DIR}/libswscale-4.so)

include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/ffmpeg3/include)

find_library(log-lib log )
target_link_libraries(  native-lib ${log-lib} avcodec-57
avformat-57
avutil-55
swresample-2
swscale-4)
  • (五)app的gradle文件配置
    如果是通過studio生成的c++原生庫无午,那么會在module的build.gradle中自動配置好Cmake的路徑媒役。
externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

我們需要做的就是再添加一些參數(shù)

defaultConfig {
     
        externalNativeBuild {
            cmake {
                cppFlags ""
                arguments '-DANDROID_TOOLCHAIN=clang','-DANDROID_STL=gnustl_static'
            }
        }

        ndk{
            abiFilters 'armeabi'
        }
    }
  • (六)編寫 C++代碼
    項目創(chuàng)建的時候自動為我們配置了一個簡單的stringFromJNI的方法,我們就在native-lib.cpp文件中宪迟,手動改寫這個方法來獲取ffmpeg中的一些配置信息酣衷。
#include <jni.h>
#include <string>
extern "C"{
#include "libavcodec/avcodec.h"
};
extern "C"
JNIEXPORT jstring JNICALL
Java_com_fengfutong_cmakedemo_MainActivity_stringFromJNI(JNIEnv *env,
                                                       jobject /* this */)
{
    char info[10000] = {0};
    sprintf(info, "%s\n", avcodec_configuration());
    return env->NewStringUTF(info);
}

三:運行app

image.png

當(dāng)你的手機出現(xiàn)這個頁面,也就到了我們第一篇說再見的時候了次泽。祝君好運穿仪,下期再會。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末意荤,一起剝皮案震驚了整個濱河市啊片,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玖像,老刑警劉巖紫谷,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡笤昨,警方通過查閱死者的電腦和手機祖驱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞒窒,“玉大人捺僻,你說我怎么就攤上這事〕绮茫” “怎么了匕坯?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寇壳。 經(jīng)常有香客問我醒颖,道長,這世上最難降的妖魔是什么壳炎? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任泞歉,我火速辦了婚禮,結(jié)果婚禮上匿辩,老公的妹妹穿的比我還像新娘腰耙。我一直安慰自己,他們只是感情好铲球,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布挺庞。 她就那樣靜靜地躺著,像睡著了一般稼病。 火紅的嫁衣襯著肌膚如雪选侨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天然走,我揣著相機與錄音援制,去河邊找鬼。 笑死芍瑞,一個胖子當(dāng)著我的面吹牛晨仑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拆檬,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洪己,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竟贯?” 一聲冷哼從身側(cè)響起答捕,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屑那,沒想到半個月后拱镐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晌缘,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年痢站,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片选酗。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡阵难,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芒填,到底是詐尸還是另有隱情呜叫,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布殿衰,位于F島的核電站朱庆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闷祥。R本人自食惡果不足惜娱颊,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凯砍。 院中可真熱鬧箱硕,春花似錦、人聲如沸悟衩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽座泳。三九已至惠昔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挑势,已是汗流浹背镇防。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薛耻,地道東北人营罢。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像饼齿,于是被迫代替她去往敵國和親饲漾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,164評論 25 707
  • 文章摘要1、 c证鸥、c++項目的創(chuàng)建2僚楞、添加C勤晚、C++項目依賴庫4、配置Gradle泉褐,編譯lib so庫 英文文獻(xiàn) ...
    Android那些事兒閱讀 12,664評論 0 54
  • 圍繞一個圓心赐写, 拉出一條半徑, 畫一個圓膜赃, 就成了我們的一方小天地挺邀。 然而, 相對這大千世界而言跳座, 我們的圈子小的...
    小思小海閱讀 198評論 0 0
  • 明天就要過小年了端铛,可是卻一點年味都沒有,閑來無事看了幾集《舌尖上的中國》疲眷,便一發(fā)不可收拾地想要繼續(xù)看下去禾蚕,我感嘆原...
    iotboy閱讀 272評論 1 1
  • 善良天真的鯉魚僅僅因鸕鶿和天鵝换淆、鴛鴦都是同類,就認(rèn)為對方是朋友美侦,幾乎喪命产舞。可見菠剩,在現(xiàn)實生活中易猫,我們不能被事物的外表...
    劉俊廷閱讀 217評論 0 0