问题:在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