一、FFmpeg编译和环境的搭建
2019-06-30 本文已影响46人
石器时代小古董
一、使用 NDK 编译 FFmpeg
1.默认环境编译
下载 FFmpeg 源码 目前4.0.2是比较稳定的版本
执行 .configure 文件
./configure --disable-x86asm
注意编译android版本还需要一些配置
--disable-shared \ 禁用动态库
--enable-static \ 使用静态库
--cross-prefix 交叉编译工具的路径
--target-os=android
二、AS 搭建 FFmpeg 环境
1.将编译好的库放到libs目录下

2.在工程的gradle目录下指定编译的平台

3.在 CmakeList 中添加 FFmpeg 的库
cmake_minimum_required(VERSION 3.4.1)
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp)
include_directories(src/main/cpp/include)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L$-L${CMAKE_SOURCE_DIR}/libs/armeabi-v7a")
find_library(
log-lib
log)
target_link_libraries( # Specifies the target library.
native-lib
# ffmpeg 库
avcodec avfilter avformat avutil swresample swscale
# Links the target library to the log library
# included in the NDK.
${log-lib})
4.测试是否成功
因为 FFmpeg 使用的都是 C 语言编写的,所以需要用 extern 关键词声明混合编译
#include <jni.h>
#include <string>
/**
* FFmpeg 都是用 C 语言来写的,使用extern来进行混合编译
*/
extern "C" {
#include <libavcodec/avcodec.h>
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_baidu_crazyorange_ffmpeg_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string _ffmpeg_info = av_version_info();
return env->NewStringUTF(_ffmpeg_info.c_str());
}