You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:10:57