问题:在AS3.0中通过ffmpeg解码播放资源文件中的H264格式的视频资源。
开发流程如下:
1.在AS中新建一个项目,打开项目的File-->Settings-->Android SDK-->SDK Tool,下载安装CMake,LLDB,NDK
2.回到桌面右键我的电脑-->属性-->高级系统设置-->高级-->环境变量-->Path-->编辑-->添加安装好的jdk的bin的安装目录如下
3.回到AS的项目中新建一个类Decoder.java在里面写好需要调用C/C++中的方法如下
public static native String avcodecinfo(); //创建解码对象,返回解码对象索引 public static native int init(Object CB); //释放解码对象 public static native int deInit(int index);
4.在AS的Terminal中通过命令行的指令生成.h文件
5.AS中选中项目的根目录app右键-->New-->Folder-->JNI Folder在项目的根目录下生成名为cpp的文件夹,把上一步生成的.h文件复制到这个文件夹下面。
6.在该文件夹中新建一个.cpp的C/C++源文件,该文件中的方法名对应第四步生成的.h文件中声明的方法名,java层通过调用该文件中的方法达到调用C/C++中方法的目的。
7.AS中把需要写的C/C++文件放在第6步中新建的.cpp的文件夹中。
8.AS在Project的视图下app-->src-->main下新建名为jniLibs的文件夹,在jniLibs中新建名为armeabi和armeabi-v7a的文件夹,把需要调用的外部的.so库各复制一份相同的到这两个文件夹下。
9.把用到的.so库中的.h头文件放到.cpp文件夹中。
10.AS在Project的视图下app-->src-->main下新建名为assets的文件夹,把作为试例的.h264的资源文件放到这个文件夹下。
11.接下来使用cmake开发(AS3.0支持)需要在 module 下的 buidle.gradle 中添加以下语句
android {
compileSdkVersion 26
defaultConfig {
......
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// For ndk-build, instead use ndkBuild {}
externalNativeBuild {
cmake {
// Sets a flag to enable format macro constants for the C++ compiler.
cppFlags "-std=c++11 -D__CORRECT_ISO_CPP_WCHAR_H_PROTO"
}
ndk {
abiFilters "armeabi", "armeabi-v7a"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// 配置CMakeLists.txt路径
externalNativeBuild {
cmake {
path "CMakeLists.txt" // 设置所要编写的c源码位置,以及编译后so文件的名字
}
}
}
12.AS在Project视图中app下新建名为CMakeLists.txt的文件,在这个文件中添加如下内容
#cmake最小版本
cmake_minimum_required(VERSION 3.4.1)
set(libs "${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi")
add_library(avcodec SHARED IMPORTED )
set_target_properties(avcodec PROPERTIES
IMPORTED_LOCATION "${libs}/libavcodec-56.so")
......
add_library( # 设置so文件名称.
Decoder
# 设置这个so文件为共享.
SHARED
# 设置 c文件源码位置.
src/main/jni/jniDecoder.cpp
)
# Specifies a path to native header files.
include_directories(src/main/jni/include/
src/main/jni
)
# link_directories(src/main/jni)
find_library( # Sets the name of the path variable.
log-lib
log )
target_link_libraries( # 制定目标库.
Decoder
avcodec ......
${log-lib})
13.然后运行项目就可以播放.h264的视频了。可以在以下路径下找到通过上面这些步骤生成的.so文件。
app\build\intermediates\cmake\debug\obj