做网站找哪家公司最好,wordpress island主题,合同模板网,保定网站建设平台分析编译前准备
编译环境#xff1a;Ubuntu16#xff0c;可自行下载VMWare最新版并百度永久许可证或在服务器上安装Ubuntu
ffmpeg源码#xff1a;ffmpeg4.2.2
NDK下载#xff1a;Android NDK r21e
有条件的最好还是在Liunx平台下编译吧#xff0c;Windows平台下编译坑更多…编译前准备
编译环境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.解压ffmepgtar -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
API21
#arm64 x86 x86_64 ---- aarch64 i686 x86_64
ARCHarm64
ARCH2aarch64
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-osandroid \--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 -fexceptionsabiFilters arm64-v8a,armeabi-v7a}}
abiFilters是指定当前项目所支持的CPU架构一般来说有arm64-v8aarm64位、armeabi-v7a(arm32位)足够大部分手机都是这两种架构之一要完全兼容可能会导致APP体积增大
注意如果你的Gradler版本足够高大约5.6.4无须配置以下项否则有可能报错
sourceSets {main {jniLibs.srcDirs [libs]}
}
【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图资料包括C/CLinuxFFmpeg 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.hextern C {
#include libavcodec/avcodec.h
#include libavformat/avformat.h
#include libavfilter/avfilter.h
#include libavcodec/jni.hJNIEXPORT 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 --targetaarch64-none-linux-android21 --gcc-toolchainC:/Users/as230/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64 --sysrootC:/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_SOURCE2 -Wformat -Werrorformat-security -stdc11 -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编译全过程与遇到的问题