ffmpeg for android編譯全過程與遇到的問題

編譯前準備

編譯環境:Ubuntu16,可自行下載VMWare最新版并百度永久許可證或在服務器上安裝Ubuntu

ffmpeg源碼:ffmpeg4.2.2

NDK下載:Android NDK r21e

有條件的最好還是在Liunx平臺下編譯吧,Windows平臺下編譯坑更多,文章末尾有Github源碼可自取

開始編譯

1.解壓NDK,執行?unzip android-ndk-r21e-liunx-x86_64.zip

如果提示沒有unzip,執行此命令安裝?sudo apt-get install unzip

2.解壓ffmepg,tar -xvjf ffmpeg-4.2.2.tar.bz2

3.進入ffmpeg4.2.2目錄,修改根目錄下的 configure 文件

搜索?LIB_INSTALL_EXTRA_CMD
?

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

此步驟主要是將so命名為Android通用的so名稱

4.在ffmpeg下創建文件android_build.sh腳本文件,此腳本文件用于配置、執行編譯,根據需求進行配置,網上的配置均有不同,以實際需要為準,將以下代碼copy到android_build.sh腳本文件中,執行?sudo sh android_build.sh
?

#!/bin/bash
API=21
#arm64  x86 x86_64 <----> aarch64  i686  x86_64
ARCH=arm64
ARCH2=aarch64    
PREFIX=../out-ffmpeg/$ARCH
#此處路徑替換為當前NDK路徑
TOOLCHAIN=/home/jiang/ffmpeg/android-ndk-r21e-linux-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64build()
{#配置各個文件開關及NDK路徑等./configure \--prefix=$PREFIX \--disable-static \--enable-shared \--enable-small \--enable-gpl \--disable-doc \--disable-programs \--disable-avdevice \--enable-cross-compile \--target-os=android \--arch=$ARCH \--cc=$TOOLCHAIN/bin/$ARCH2-linux-android$API-clang \--cross-prefix=$TOOLCHAIN/bin/$ARCH2-linux-android-#清除上次編譯make cleanmake -j4make install
}
#開始編譯
build

android_build.sh腳本文件自取

注:如果編譯過程中出現錯誤(一般是在開頭會有紅色報錯),部分需要安裝其他庫,具體可查閱

5.編譯后會在ffmpeg4.2.2同級目錄下生成out-ffmpeg文件,將out-ffmpeg導出到項目中

Android Studio配置

1.新建一個C++項目

  • 將編譯完成后的include頭文件導入到cpp文件中
  • 將編譯完成后的lib庫文件導入到libs中

2.配置build.gradle文件

defaultConfig下增加

externalNativeBuild {cmake {cppFlags '-frtti -fexceptions'abiFilters "arm64-v8a","armeabi-v7a"}}

abiFilters是指定當前項目所支持的CPU架構,一般來說有arm64-v8a(arm64位)、armeabi-v7a(arm32位)足夠,大部分手機都是這兩種架構之一,要完全兼容可能會導致APP體積增大

注意:如果你的Gradler版本足夠高(大約>5.6.4),無須配置以下項,否則有可能報錯
?

sourceSets {main {jniLibs.srcDirs = ["libs"]}
}    

【免費分享】音視頻學習資料包、大廠面試題、技術視頻和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點擊788280672加群免費領取~

3.配置CMake

由于android早已支持CMake,所以舊的android.mk配置此處不增加

#聲明cmake版本號
cmake_minimum_required(VERSION 3.10.2)#此處導入頭文件目錄
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)#將so庫文件路徑賦值ffmpeg_lib_dir,方便操作
set(ffmpeg_lib_dir ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${ANDROID_ABI})#項目名稱
project("newffmpeg")add_library( newffmpegSHAREDnative-lib.cpp)#初始化log庫
find_library( log-liblog)#江指定的源文件生成鏈接文件
add_library( avutilSHAREDIMPORTED )set_target_properties( avutilPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavutil.so )add_library( swresampleSHAREDIMPORTED )
set_target_properties( swresamplePROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libswresample.so )add_library( avcodecSHAREDIMPORTED )
set_target_properties( avcodecPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavcodec.so )add_library( avfilterSHAREDIMPORTED)
set_target_properties( avfilterPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavfilter.so )add_library( swscaleSHAREDIMPORTED)
set_target_properties( swscalePROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libswscale.so )add_library( avformatSHAREDIMPORTED)
set_target_properties( avformatPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavformat.so )add_library( postprocSHAREDIMPORTED)
set_target_properties( postprocPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libpostproc.so )#將目標文件與庫文件進行鏈接
target_link_libraries( # Specifies the target library.newffmpegavutilswresampleavcodecavfilterswscaleavformatpostproc${log-lib})

若未能鏈接到庫文件,則檢查路徑是否正常(點擊libs路徑左側菜單能正常展開說明路徑正確)

4.測試ffmpeg

在native-lib.cpp中增加或替換代碼,注意JNI路徑替換為你的包名路徑或方法,在Java中調用,如能正常打印出配置信息,說明編譯及導入完成
?

#include <jni.h>
#include <string>
#include <unistd.h>extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfilter.h>
#include <libavcodec/jni.h>JNIEXPORT jstring JNICALL
Java_cn_jin_newffmpeg_MainActivity_getConfigurations(JNIEnv *env,jobject  /* this */) {return env->NewStringUTF(avcodec_configuration());
}
}

遇到的問題

2 files found with path 'lib/arm64-v8a/libavcodec.so' from inputs:

2 files found with path 'lib/arm64-v8a/libavcodec.so' from inputs:- D:\ffmpeg\project\NewFFmpeg\app\build\intermediates\merged_jni_libs\debug\out\arm64-v8a\libavcodec.so- D:\ffmpeg\project\NewFFmpeg\app\build\intermediates\cxx\Debug\2xk41543\obj\arm64-v8a\libavcodec.so
If you are using jniLibs and CMake IMPORTED targets, see
https://developer.android.com/r/tools/jniLibs-vs-imported-targets

解決辦法:此處是由于在build.gradle中配置了jniLibs.srcDirs導致的文件沖突,gradle高版本已經不需要手動指定so庫的路徑,刪除即可

D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libavcodec.so: error adding symbols: File in wrong format clang++: error: linker command failed with exit code 1 (use -v to see invocation)
?

[1/1] Linking CXX shared library D:\ffmpeg\project\FFmpegProject\app\build\intermediates\cxx\Debug\2c676z6h\obj\arm64-v8a\libffmpeg.so
FAILED: D:/ffmpeg/project/FFmpegProject/app/build/intermediates/cxx/Debug/2c676z6h/obj/arm64-v8a/libffmpeg.so 
cmd.exe /C "cd . && C:\Users\as230\AppData\Local\Android\Sdk\ndk\21.4.7075529\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android21 --gcc-toolchain=C:/Users/as230/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Users/as230/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security  -std=c++11 -frtti -fexceptions -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libffmpeg.so -o D:\ffmpeg\project\FFmpegProject\app\build\intermediates\cxx\Debug\2c676z6h\obj\arm64-v8a\libffmpeg.so CMakeFiles/ffmpeg.dir/native-lib.cpp.o  -llog D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libavcodec.so D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libavfilter.so D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libavformat.so D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libavutil.so D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libpostproc.so D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libswresample.so D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libswscale.so -latomic -lm && cd ."
D:/ffmpeg/project/FFmpegProject/app/src/main/cpp/../../main/jniLibs/arm64-v8a/libavcodec.so: error adding symbols: File in wrong format
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

出現動態庫中的問題導致鏈接器命令失敗大概率是兩個原因

  • 編譯出來的so有問題,此時不要嘗試,可下載其他已經編譯好的so進行替換,如其他可正常運行則已經說明
  • so庫中依賴其他庫文件,其他庫文件未導入或者已導入未進行鏈接,此時應該檢查一下cmake

java.lang.UnsatisfiedLinkError: dlopen failed: library “libxxx.so” not found

此處錯誤是在運行之后出現的,原因是某些已經使用的庫文件沒有鏈接上,應該檢查一下libs和cmkae,基本上能解決

源碼

ffmpeg for android源碼

原文鏈接?ffmpeg for android編譯全過程與遇到的問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697209.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697209.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【計算機網絡】數據鏈路層|封裝成幀|透明傳輸|差錯檢測|PPP協議|CSMA/CD協議

目錄 一、思維導圖 ? 二、數據鏈路層功能概述 1.數據鏈路層概述 2.數據鏈路層功能概述——封裝成幀 3.數據鏈路層功能概述——透明傳輸 4.數據鏈路層功能概述——差錯檢測 三、數據鏈路層重要協議 1.數據鏈路層重要協議&#xff1a;PPP協議 2.數據鏈路層重要協議&#x…

js設計模式:備忘錄模式

作用: 封裝的對象可以在對象觸發行為時進行狀態的記錄與保存 也可以進行狀態的回退,恢復之前的狀態 示例: class Editor{constructor(){this.allText }edit(text){this.allText text}saveNow(){return new EditorText(this.allText)}backspacing(editorText){this.allText…

護眼臺燈哪個品牌更好用?五大好用護眼臺燈大爆料!

護眼臺燈相信大家都有所耳聞或者使用過,家里有小孩的可能了解更深,畢竟是孩子學習時需要使用的小家電。現在市面上的護眼臺燈種類可以說是多到眼花繚亂,甚至有些劣質的產品摻雜在里面,或許有些寶媽已經踩過一些坑了&#xff0c;護眼臺燈究竟哪個品牌更好用&#xff1f; &#x…

這個春節,爽了

四次醫院 請了一周假&#xff0c;準備開始愉快的長假。 結果第一天小孩就發燒了&#xff0c;趕緊送醫院拿藥。回到家才發現&#xff0c;給醫生看的驗血報告是上一次的&#xff0c;那是好幾個月之前的。 但是藥已經吃了&#xff0c;這是吃錯藥了呀&#xff01;&#xff01; …

手機中有哪些逆向進化的功能

手機中有哪些逆向進化的功能&#xff1f;逆向進化是指明明很優秀的很方便的功能&#xff0c;卻因為成本或者其他工業原因莫名其妙地給取消了。 逆向進化1&#xff1a;可拆卸電池-變為不可拆卸電池。 智能手機為了追求輕薄等原因&#xff0c;所以移除了可拆卸電池功能。將電池…

GoLand 相關

goland 下載依賴 go mod tidy&#xff1a;保持依賴整潔 go mod tidy 命令的作用是清理未使用的依賴&#xff0c;并更新 go.mod 以及 go.sum 文件。 go mod tidy 和 go mod vendor 兩個命令是維護項目依賴不可或缺的工具。go mod tidy 確保了項目的 go.mod 文件精簡且準確&…

ubuntu20.04安裝實時內核補丁PREEMPT_RT

參考&#xff1a; Ubuntu 18.04安裝 RT-PREEMPT 實時內核及補丁【過程記錄】_ubuntu18.04 preempt rt linux 5.6.19-CSDN博客 https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/ur_robot_driver/doc/real_time.md當前內核&#xff1a;5.15.0-94-ge…

1.deeplabv3+網絡結構及原理

這里的網絡結構及原理可以看這篇博客&#xff0c;DeepLabV3: 在DeepLabV3基礎上引入了Decoder_matlab deeplabv3resnet101-CSDN博客該博客翻譯原論文解釋得很清楚。 一、引言 語義分割的目標是為圖像中的每個像素分配語義標簽。在這項研究中&#xff0c;考慮了兩種類型的神經網…

Vue計算屬性computed()

1. 計算屬性定義 獲取計算屬性值 <div>{{ 計算屬性名稱}}</div>創建計算屬性 let 定義的屬性ref/reactive....let 計算屬性名稱 computed(() > {//這里寫函數式,函數式里面包含定義屬性//只有這個包含的定義屬性被修改時才出發此函數式//通過計算屬性名稱co…

docker:Haoop集群

系列文章目錄 docker&#xff1a;環境安裝 docker:Web遷移 docker:Haoop集群 文章目錄 系列文章目錄前言一、宿主機選擇二、環境準備1.前置技術2.網絡環境1. docker網卡2. 分配IP 三、容器互聯三、Jdk和Hadoop安裝四、分發腳本五、啟動Hadoop總結 前言 年前學習了docker的相關…

ubuntu18 環境安裝

1. ubuntu18 環境安裝 1. ubuntu18 環境安裝 1.1. default language1.2. sougou shurufa1.3. cmake-last1.4. audio-recorder1.5. sources.list切換清華源1.6. oh my zsh1.7. weixin1.8. bcompare1.9. wireshark1.10. 其他問題 1.1. default language ubuntu 修改系統默認語…

https://registry.npm.taobao.org淘寶npm鏡像倉庫地址更新

在工作中有遇見獲取淘寶的npm鏡像存在問題&#xff0c;圖示如下的報錯&#xff1a; 根據報錯的內容是說 https://registry.npm.taobao.org地址訪問失敗了&#xff0c;然后通過排查發現淘寶的npm鏡像倉庫地址有更新了。需要使用最新的地址 舊的淘寶鏡像倉庫&#xff1a;https://…

數據結構2月19日

題目&#xff1a;順序表作業 代碼&#xff1a; 功能區&#xff1a; #include <stdio.h>#include <stdlib.h>#include "./d2191.h"SeqList* create_seqList(){SeqList* list (SeqList*)malloc(sizeof(SeqList));if(NULL list){return NULL;}list->p…

Linux系列講解 —— 【Vim編輯器】在Ubuntu18.04中安裝新版Vim

平時用的電腦系統是Ubuntu18.04&#xff0c;使用apt安裝VIM的默認版本是8.0。如果想要安裝新版的Vim編輯器&#xff0c;只能下載Vim源碼后進行編譯安裝。 目錄 1. 下載Vim源碼2. 編譯3. 安裝4. 遇到的問題4.1 打開vim后&#xff0c;文本開頭有亂碼現象。4.2 在Vim編輯器中&…

JS常見問題

文章目錄 如何判斷是數組 如何判斷是數組 Array.isArray console.log(Array.isArray(arr))instanceof&#xff08;instanceof 運算符用于驗證構造函數的 prototype 屬性是否出現在對象的原型鏈中的任意位置&#xff09; console.log(arr1 instanceof Array)constructor&#x…

百面嵌入式專欄(經驗篇)如何在面試中介紹自己的項目經驗

文章目錄 1. 在面試前準備項目描述,別害怕,因為面試官什么都不知道2. 準備項目的各種細節,一旦被問倒了,就說明你沒做過3.不露痕跡地說出面試官愛聽的話4.一定要主動,面試官沒有義務挖掘你的亮點5.一旦有低級錯誤,可能會直接出局6.引導篇:準備些加分點,在介紹時有意提到…

測試環境搭建整套大數據系統(三:搭建集群zookeeper,hdfs,mapreduce,yarn,hive)

一&#xff1a;搭建zk https://blog.csdn.net/weixin_43446246/article/details/123327143 二&#xff1a;搭建hadoop&#xff0c;yarn&#xff0c;mapreduce。 1. 安裝hadoop。 sudo tar -zxvf hadoop-3.2.4.tar.gz -C /opt2. 修改java配置路徑。 cd /opt/hadoop-3.2.4/etc…

R語言【raster】——projectRaster():映射一個Raster對象

Package raster version 3.6-27 Description 用另一個投影(坐標參考系統&#xff0c;(CRS))將一個Raster*對象的值投影到一個新的Raster*對象。 您可以通過將新投影作為單個參數提供來實現這一點&#xff0c;在這種情況下&#xff0c;函數將設置新對象的范圍和分辨率。為了對…

Three.js初學(3)

Three.js初學&#xff08;3&#xff09; 動畫渲染循環1. 請求動畫幀2. 旋轉動畫 Canvas畫布布局和全屏常見幾何體渲染器設置GUI.js庫1. 庫的引入2. 如何使用初步調試進階調試界面分組 動畫渲染循環 1. 請求動畫幀 requestAnimationFrame實現周期性循環執行 requestAnimationF…

LeetCode | 整數反轉 C語言

Problem: 7. 整數反轉 文章目錄 思路解題方法Code結果 思路 運算部分 while(x > 0) {y x % 10;y * 10;x / 10; } y / 10;對于大于32位的數要用long int類型的變量保存用pow算-2的31次方和2的31次方-1。 解題方法 由思路得 Code int reverse(long int x){long int y …