如何将Android存储的视频传入MATLAB生成的C++函数处理?
方案可行性与实现步骤
一、方案可行性
该方案完全可行。MATLAB Coder支持将包含深度学习模型(如YOLOv4)的MATLAB代码转换为可在Android平台运行的C++代码,结合Android的JNI与CMake构建系统,能够实现视频处理流程的本地化部署。需要注意确保MATLAB Coder生成的代码兼容Android的ABI架构,同时处理好视频路径传递、帧数据转换以及深度学习模型的部署依赖。
二、具体实现步骤
1. 调整MATLAB生成的C++接口
当前生成的Android5函数使用coder::rtString作为输入,且自动生成的初始化代码使用默认占位符,无法直接传入真实路径。需要修改MATLAB代码并重新生成C++代码:
- 修改MATLAB函数的输入参数类型,明确指定
Vrecorded为字符串类型,避免自动生成模糊类型 - 在MATLAB Coder的代码生成设置中,将目标平台指定为Android,同时配置深度学习模型的部署选项,确保生成的代码包含模型推理逻辑且依赖库可在Android上运行
- 重新生成代码后,将
Android5函数的输入改为更易用的const char*类型,或者直接接收解码后的视频帧数组(后者能避免MATLAB生成的VideoReader在Android上的兼容性问题)
2. Android端获取视频路径与权限处理
要访问设备存储中的视频,需处理权限与路径获取:
- 权限申请:Android 13及以上需申请
READ_MEDIA_VIDEO权限,Android 12及以下需申请READ_EXTERNAL_STORAGE权限,且必须动态申请权限 - 获取视频路径:
- 通过系统文件选择器让用户选择视频,得到
Uri后,利用ContentResolver将Uri转换为绝对路径;Android 10+受Scoped Storage限制无法直接访问外部存储路径时,可通过输入流读取视频数据到应用私有目录后处理 - 若视频是应用自身录制的,可直接使用应用私有目录的路径,无需额外权限
- 通过系统文件选择器让用户选择视频,得到
3. 编写JNI层代码连接Java与C++
通过JNI实现Android Java层与MATLAB生成的C++代码的交互:
- 编写JNI函数,例如
nativeProcessVideo(String videoPath),接收Java层传递的视频路径字符串 - 在JNI函数中,将Java字符串转换为C语言的
const char*,初始化coder::rtString(或直接传入const char*,取决于重新生成的接口),然后调用Android5函数 - 处理
coder::array与Java数组的转换:若需将处理后的帧数据返回给Java层,需将coder::array<unsigned char, 3U>转换为Java的byte[]或ByteBuffer
示例JNI代码片段:
#include <jni.h> #include "Android5.h" #include "coder_array.h" #include "rt_nonfinite.h" extern "C" JNIEXPORT void JNICALL Java_com_example_yourapp_VideoProcessor_nativeProcessVideo(JNIEnv* env, jobject thiz, jstring video_path) { const char* c_path = env->GetStringUTFChars(video_path, nullptr); coder::rtString Vrecorded; coder::array<unsigned char, 3U> output_frames; // 初始化rtString并传入路径 coder::array<char, 2U> path_arr; path_arr.set_size(1, strlen(c_path)); memcpy(&path_arr[0], c_path, strlen(c_path)); Vrecorded.init(path_arr); // 调用MATLAB生成的处理函数 Android5(&Vrecorded, output_frames); env->ReleaseStringUTFChars(video_path, c_path); Android5_terminate(); }
4. CMake构建配置
在Android项目的CMakeLists.txt中配置MATLAB生成的代码:
- 添加MATLAB生成的所有C++源文件到
add_library的源文件列表 - 指定MATLAB生成的头文件路径(通过
include_directories) - 链接MATLAB Coder生成的依赖库(如
libmwrt.so、libmwcoder.so等),这些库需放置在app/src/main/jniLibs/[abi]/目录下,对应项目支持的ABI架构(如arm64-v8a、armeabi-v7a) - 设置CMake的目标平台为Android,指定最小SDK版本
示例CMakeLists.txt片段:
cmake_minimum_required(VERSION 3.18.1) project("videoprocessor") # 添加MATLAB生成的源文件 add_library( videoprocessor SHARED native-lib.cpp ${CMAKE_SOURCE_DIR}/matlab_generated/Android5.cpp ${CMAKE_SOURCE_DIR}/matlab_generated/Android5_terminate.cpp # 其他MATLAB生成的源文件 ) # 包含MATLAB生成的头文件目录 include_directories(${CMAKE_SOURCE_DIR}/matlab_generated) # 链接MATLAB依赖库 find_library( matlab_rt_lib mwrt PATHS ${CMAKE_SOURCE_DIR}/jniLibs/${ANDROID_ABI} NO_DEFAULT_PATH ) target_link_libraries( videoprocessor ${matlab_rt_lib} log )
5. 关键注意事项
- 深度学习模型部署:确保MATLAB Coder生成的代码包含YOLOv4模型的推理逻辑,需在MATLAB中使用
codegen命令时指定深度学习支持选项;也可选择将模型转换为TFLite格式后在Android上运行,性能更优 - 性能优化:视频处理属于耗时操作,需放在Android的后台线程(如
Coroutine、AsyncTask)中执行,避免阻塞UI线程 - Scoped Storage兼容:Android 10+禁止直接访问外部存储的文件路径,建议使用文件选择器获取
Uri后,通过ContentResolver读取视频数据到应用私有目录,再传入C++函数处理
内容的提问来源于stack exchange,提问作者Matheus Fortunato Alves
相关产品推荐
相关产品推荐

