国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目

這篇具有很好參考價值的文章主要介紹了Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

最近在學習android NDK開發(fā)相關(guān)內(nèi)容,借ffmpeg練練手。ffmpeg是做音視頻方面功能的基礎(chǔ),后面會隨著個人的學習更新一系列ffmpeg博客,防止自己遺忘。
這個系列博客主要目的是基于ffmpeg通過NDK開發(fā)的方式完成一個基本的視頻播放器。

本篇博客主要實現(xiàn)了 ffmpeg編譯 以及 引入 android 項目成功調(diào)用 靜態(tài)庫方法顯示版本號。

必備基礎(chǔ)

  1. c、c++基礎(chǔ)語法;Cmake基礎(chǔ)(常用配置、常量);
  2. NDK JNI基礎(chǔ)(熟悉java/kotlin 、c++ 互調(diào));
  3. kotlin基礎(chǔ)(android 項目全部使用kotlin編寫);
  4. linux常用命令、shell腳本基礎(chǔ)語法;

準備工作

編譯ffmpeg時使用Linux或者Mac都可以;如果是Mac需要安裝gcc,使用gcc -v輸出版本號即為成功。

ffmpeg(4.0.2)
ffmpeg全版本下載地址:
http://www.ffmpeg.org/releases/

NDK(android-ndk-r17c)
NDK歷史版本下載地址:
https://developer.android.google.cn/ndk/downloads/older_releases

ffmpeg下載完成后解壓縮;進入ffmpeg解壓后到目錄

cd ./ffmpeg-4.0.2

ffmpeg編譯時有很多命令參數(shù),查看命令參數(shù)命令:

./configure --help

編寫ffmpeg編譯腳本

為了方便直接在 ffmpeg-4.0.2 目錄里新建shell腳本

vim ./ffmpeg-4.0.2/build_ffmpeg_4.0.2.sh

輸入以下內(nèi)容;
注意:每一行腳本都有對應的注釋,需要仔細查看,直接復制可能會編譯失敗,NDK工具包的相關(guān)路徑要改成自己的。
NDK_SRC 和 NDK_GCC 的目錄可能不同?。?!
NDK_GCC 的 arm-linux-androideabi-4.9 目錄根據(jù)不同的平臺路徑不同 本次實現(xiàn)僅實現(xiàn)了armeabi-v7a平臺?。。?/mark>

#!/bin/bash

# NDK工具包目錄
NDK_SRC=/Users/tttell/tools/android-ndk-r17c

# 此變量執(zhí)行ndk中的交叉編譯gcc所在目錄
NDK_GCC=$NDK_SRC/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

# 傳遞給gcc的參數(shù) [從Android Project的 externalNativeBuild/xxx/build.ninja 中復制到參數(shù) 可以減少警告信息]
FLAGS="-isystem $NDK_SRC/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"

# 導入必需的頭文件 [NDK 工具包的目錄]
INCLUDES=" -isystem $NDK_SRC/sources/android/support/include"

# 編譯后輸出的目錄 [根據(jù)自己情況自定義目錄]
PREFIX=./bulid_ffmpeg_lib

./configure \
--prefix=$PREFIX \
--enable-static \
--enable-small \
--enable-cross-compile \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_SRC/sysroot/" \
--sysroot=$NDK_SRC/platforms/android-21/arch-arm \
--arch=arm \
--target-os=android

make clean

make install

# 參數(shù)注釋
# --enable-static 				# 編譯靜態(tài)庫
# --enable-small 				# 體積優(yōu)化
# --enable-cross-compile 		# 開啟交叉編譯
# --disable-programs 			# 不編譯ffmpeg命令行工具 [如果需要可以編譯]
# --disable-avdevice 			# 不編譯avdevice模塊 [--help 提示中表示該模塊不支持Android平臺]
# --disable-encoders 			# 不編譯編碼器 [本系列僅實現(xiàn)播放功能 所以不需要編碼]
# --disable-muxers  			# 不編譯封裝器 [本系列僅實現(xiàn)播放功能 所以不需要封裝]
# --disable-filters 			# 不編譯所有濾鏡
# --cross-prefix 				# 指定使用NDK工具包中的gcc相關(guān)編譯器
# --extra-cflags 				# gcc的參數(shù)
# --sysroot 					# 平臺標準庫 [具體根據(jù)android項目的平臺、最低支持版本而定 本次實現(xiàn)僅編譯了armeabi-v7a 最低支持sdk21	]
# --arch           				# 平臺
# --target-os 					# 平臺

開始執(zhí)行腳本

sh ./ffmpeg-4.0.2/build_ffmpeg_4.0.2.sh

腳本運行時,要關(guān)注日志輸出,如果出現(xiàn)error日志就及時停止吧 肯定會失敗的 不用等到之行結(jié)束;編譯過程可能會出現(xiàn)各種錯誤,具體錯誤可能跟環(huán)境也有關(guān)系,根據(jù)提示信息去搜索對應解決辦法修改即可。

如果編譯失敗,輸出目錄中應該是空的,需要查看下終端的輸出日志排查錯誤;
編譯成功則會在你指定的輸出目錄下出現(xiàn)以下文件:
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目
include 目錄是待會需要導入到Android Project中的頭文件;
lib 目錄中就是成功編譯出的靜態(tài)庫文件;
share 目錄中的examples是一些例子 都是c語言的例子;

Android 項目集成

新建項目

Android Studio 版本 我這應該是最新的
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目
新建一個支持Native的項目
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目
然后一直下一步就可以了。

打開項目后需要在SDKManager中下載NDK和Cmake:
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目
NDK 不用全部下載,我是為了調(diào)試不同版本全部下載了 下載21左右的就可以。
Cmake 下載的是最新版本的。

接著修改 app 目錄的 build.gradle 文件:

android {

...

	defaultConfig {
		externalNativeBuild {
    		cmake {
        		abiFilters "armeabi-v7a"
    		}
		}
		ndk {
    		abiFilters("armeabi-v7a")
		}
	}
	
	# 為了開發(fā)方便不寫findviewbyId 我開啟了 databinding
	dataBinding {
        enabled = true
    }
...

}

下載完成后同步一下項目,運行下測試下 如果頁面成功顯示了 Hello from C++ 即為成功;

導入ffmpeg

將編譯好的 ffmpeg 頭文件目錄 include 復制到 android project 的 cpp 目錄下:
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目
接著開始導入靜態(tài)庫,在 cpp 目錄下新建 libs 目錄;因為上一步驟中編譯的是 armeabi-v7a 的 ffmpeg 所以在libs下新建 armeabi-v7a 目錄(實際開發(fā)中會打多個平臺的庫文件,如:x86_64需要新建x86_64的目錄)。將靜態(tài)庫文件復制到 armeabi-v7a 目錄中:
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目
導入工作完成后 開始編寫 CMakeLists.txt :

cmake_minimum_required(VERSION 3.18.1)

project("studyffmepg")

# 導入 include目錄的 庫文件
# CMAKE_SOURCE_DIR 是常量 代表CMake文件所在目錄
include_directories(${CMAKE_SOURCE_DIR}/include)

# 批量導入源文件 定義一個 SOURCE 變量
# 這樣寫在cpp目錄下新建c++文件時不用再一個個寫導入了
file(GLOB SOURCE *.cpp *.c)

# 添加動態(tài)庫
add_library(
        studyffmepg # 生成庫的名字
        SHARED      # SHARED 動態(tài)庫 STATIC 靜態(tài)庫
        ${SOURCE}   # 源文件 上面定義的變量 表示全部打包進去
)

# 在NDK工具包中尋找 log 庫
find_library(
        log-lib
        log
)

# 導入FFmpeg的庫文件
# CMAKE_CXX_FLAGS 類似于 windows 環(huán)境變量中的 path;設(shè)置目錄后會去目錄下自動尋找?guī)煳募?/span>
# -L 代表追加目錄
# CMAKE_ANDROID_ARCH_ABI 表示運行的平臺(如:armeabi-v7a) 因為在 app:build.gradle中指定了平臺所以這里可以讀取到運行的平臺
# 注意我這里的 -L 后的路徑 /libs 對應上一步驟新建的目錄 如果你的目錄不同切記修改 否則會找不到依賴庫
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}")

target_link_libraries(
        studyffmepg
        ${log-lib}
        # ffmpeg的靜態(tài)庫有依賴關(guān)系 使用 -Wl,--start-group -Wl,--end-group 方式寫 可以忽略順序 否則容易出錯
        -Wl,--start-group
        libavcodec.a libavfilter.a libavformat.a libavutil.a libswresample.a libswscale.a
        -Wl,--end-group
)

完成之后同步一下。

集成測試

修改 native-lib.cpp 文件,輸出一下 ffmpeg 的版本號

#include <jni.h>
#include <string>

using namespace std;

extern "C" {
#include <libavutil/avutil.h>
}

extern "C" JNIEXPORT jstring JNICALL
Java_top_sunhy_studyffmepg_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject jobj
) {
    //std::string hello = "Hello from C++";
    string s = "集成成功!FFmpeg Version:";
    s.append(av_version_info());

    return env->NewStringUTF(s.c_str());
}

完成后運行一下,出現(xiàn)版本號即為成功:
Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目文章來源地址http://www.zghlxwxcb.cn/news/detail-402317.html

到了這里,關(guān)于Android ffmpeg入門(1)—— 使用NDK交叉編譯ffmpeg集成到Android項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • FFmpeg開發(fā)筆記(八)Linux交叉編譯Android的FFmpeg庫

    ? 《FFmpeg開發(fā)實戰(zhàn):從零基礎(chǔ)到短視頻上線》一書的“12.1.2 ?交叉編譯Android需要的so庫”介紹了如何在Windows環(huán)境交叉編譯Android所需FFmpeg的so庫,接下來介紹如何在Linux環(huán)境交叉編譯Android所需FFmpeg的so庫。 登錄Linux服務(wù)器(比如華為云的歐拉系統(tǒng)),依次執(zhí)行下面的命令。 重

    2024年03月24日
    瀏覽(18)
  • FFmpeg開發(fā)筆記(十六)Linux交叉編譯Android的OpenSSL庫

    ? 《FFmpeg開發(fā)實戰(zhàn):從零基礎(chǔ)到短視頻上線》一書的例程主要測試本地的音視頻文件,當然為了安全起見,很多網(wǎng)絡(luò)視頻都采用了https地址。FFmpeg若要訪問https視頻,就必須集成第三方的openssl庫,但編譯FFmpeg時卻默認關(guān)閉了openssl。為了讓App能夠播放采用https的在線視頻,需要

    2024年04月22日
    瀏覽(26)
  • FFmpeg開發(fā)筆記(九)Linux交叉編譯Android的x265庫

    ? 《FFmpeg開發(fā)實戰(zhàn):從零基礎(chǔ)到短視頻上線》一書的“12.1.2 ?交叉編譯Android需要的so庫”介紹了如何在Windows環(huán)境交叉編譯Android所需FFmpeg的so庫,前文又介紹了如何在Linux環(huán)境交叉編譯Android所需FFmpeg的so庫,接下來介紹如何在Linux環(huán)境交叉編譯Android所需x265的so庫。 執(zhí)行以下命

    2024年04月08日
    瀏覽(21)
  • FFMPEG使用DrawText濾鏡添加字幕,包含ndk編譯freetype

    FFMPEG使用DrawText濾鏡添加字幕,包含ndk編譯freetype

    ? ? ? ? ffmpeg使用drawtext濾鏡需要在編譯的時候使能drawtext,要想成功使能必須要先集成編譯freetype庫,并通知到ffmpeg(交叉編譯沒有安裝到系統(tǒng)庫路徑)。 ? ? ? ? 也有看到有的文章說需要集成fribidi,筆者也交叉編譯了,但是最終沒有用到,可能是ffmpeg版本的原因。 freety

    2024年01月17日
    瀏覽(26)
  • (NDK編譯)詳解使用Android.mk編譯的C/C++程序過程

    (NDK編譯)詳解使用Android.mk編譯的C/C++程序過程

    想要在 Android設(shè)備 上運行 C/C++程序 可執(zhí)行文件,可采用一個方法就是使用 NDK編譯 ,很多時候要比 gcc編譯 更適合,這里我采用的是 imx6q開發(fā)板 上面裝載了自己編寫的Android6.0.1鏡像,在 Ubuntu64位 系統(tǒng)上采用NDK編譯。 目錄 1.準備文件 2.編寫Android.mk 注意 完整Android.mk代碼 3.NDK編

    2024年02月05日
    瀏覽(32)
  • NDK編譯ffmpeg包含硬件加速vulkan和mediacodec

    NDK編譯ffmpeg包含硬件加速vulkan和mediacodec

    NDK編譯ffmpeg包含硬件加速vulkan和mediacodec flyfish ffmpeg:ffmpeg-6.0 NDK:android-ndk-r25c 硬件加速:vulkan 和 mediacodec target CPU:armv8-a host:Ubuntu 22.04 因為這里要編譯硬件加速版本的ffmpeg-6.0,所以需要把vulkan中include下的兩個文件夾 vk_video 和 vulkan 拷貝到 android-ndk-r25c/toolchains/llvm/prebuil

    2024年02月12日
    瀏覽(35)
  • Android-音視頻學習系列-(二)-交叉編譯動態(tài)庫、靜態(tài)庫的入門學習

    Android-音視頻學習系列-(二)-交叉編譯動態(tài)庫、靜態(tài)庫的入門學習

    gcc -S test.i -o test.s//-S 的作用是編譯結(jié)束生成匯編文件。 匯編階段 匯編階段把 .S 文件翻譯成二進制機器指令文件 .o ,這個階段接收.c ,.i ,.s 的文件都沒有問題。 下面我們通過以下命令生成二進制機器指令文件 .o 文件: gcc -c test.s -o test.o 鏈接階段 鏈接階段,鏈接的是函數(shù)庫。

    2024年04月09日
    瀏覽(26)
  • Android中集成FFmpeg及NDK基礎(chǔ)知識

    Android中集成FFmpeg及NDK基礎(chǔ)知識

    在日常App開發(fā)中,難免有些功能是需要借助NDK來完成的,比如現(xiàn)在常見的音視頻處理等,今天就以ffmpeg入手,來學習下Android NDK開發(fā)的套路. 很多人并不清除JNI和NDK的概念,經(jīng)常搞混這兩樣東西,先來看看它們各自的定義吧. 很多人并不清除JNI和NDK的概念,經(jīng)常搞混這兩樣東西,先來看看

    2024年01月17日
    瀏覽(24)
  • Android集成OpenCV(NDK)

    Android集成OpenCV(NDK)

    1.下載OpenCv的動態(tài)庫(.so) OpenCv官網(wǎng),這邊下載的是4.6.0 2.解壓opencv-4.6.0-android-sdk.zip 復制目錄 opencv-4.6.0-android-sdkOpenCV-android-sdksdknativejni 的 include 文件夾,和 opencv-4.6.0-android-sdkOpenCV-android-sdksdknativelibsarmeabi-v7a 目錄對應的cpu架構(gòu)類型.項目沒有對應目錄,手動創(chuàng)建一下. 3.配置

    2024年02月06日
    瀏覽(22)
  • Cmake學習記錄(九)--使用Cmake交叉編譯Android .so庫

    Cmake學習記錄(九)--使用Cmake交叉編譯Android .so庫

    注意:本教程沒有關(guān)于JNI接口的寫法,只是把C代碼編譯成適合android平臺的so庫,想查看完整代碼可以參考文末的第9條參考鏈接 目前Android編譯.so的話使用Android Studio比較簡單,但是有時候時候Android Studio的話還需要創(chuàng)建一個Android的項目,這里記錄下脫離Android Studio單純使用Cma

    2024年02月12日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包