android jni层 opencv读写视频,基于VideoCapture和VideoWriter
创始人
2024-03-25 03:04:12
0

开始用正常c++的opencv代码,包括python代码,也都是直接用VideoCapture,在open后面加videofile就可以了

	// read videocv::VideoCapture capture;capture.open("/storage/emulated/0/DCIM/test.mp4");

但是在android jni层无论读写视频,capture.open那里都会报错

E/cv::error(): OpenCV(4.6.0) Error: Requested object was not found (could not open directory: /data/app/~~sbu7r1TB_QJQDnKVkr9ABQ==/com.tencent.yolov5ncnn-5hoZtN5FqSkRrIkcIlVUuQ==/base.apk!/lib/arm64-v8a) in glob_rec, file /build/master_pack-android/opencv/modules/core/src/glob.cpp, line 279
A/libc: Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x797302f480 in tid 19587 (cent.yolov5ncnn), pid 19587 (cent.yolov5ncnn)

下面是VideoWriter写入的代码,也是报同样的错

cv::VideoWriter writer;
writer.open("/sdcard/DCIM/test_opencv_write.avi", codec, fps, size, true);

解决方案:
后来查了opencv的文档,发现open后面还有apiPreference,不同的平台使用不用的apiPreference,附1有详细的对应

读取时在选择了cv::CAP_ANDROID就可以正常读取视频了

// read video
cv::VideoCapture capture;
capture.open("/sdcard/DCIM/test.mp4", cv::CAP_ANDROID);

要注意的是,写的时候,也需要apiPreference,但是用cv::CAP_ANDROID也会报错,于是尝试另一个cv::CAP_OPENCV_MJPEG,跟fourcc对应起来,就可以正常跑了

int fps = 25;
int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
cv::VideoWriter writer;
writer.open("/sdcard/DCIM/test_opencv_write.avi",cv::CAP_OPENCV_MJPEG, codec, fps, size, true);

这个bug的解决真是让我找了好几天,最后发现还是要认真看官方文档,多尝试就能有结果

附1:(为apiPreference 接口的设备ID对应)

> enum VideoCaptureAPIs {
>        CAP_ANY          = 0,            //!< Auto detect == 0
>        CAP_VFW          = 200,          //!< Video For Windows (platform native)
>        CAP_V4L          = 200,          //!< V4L/V4L2 capturing support via libv4l
>        CAP_V4L2         = CAP_V4L,      //!< Same as CAP_V4L
>        CAP_FIREWIRE     = 300,          //!< IEEE 1394 drivers
>        CAP_FIREWARE     = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
>        CAP_IEEE1394     = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
>        CAP_DC1394       = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
>        CAP_CMU1394      = CAP_FIREWIRE, //!< Same as CAP_FIREWIRE
>        CAP_QT           = 500,          //!< QuickTime
>        CAP_UNICAP       = 600,          //!< Unicap drivers
>        CAP_DSHOW        = 700,          //!< DirectShow (via videoInput)
>        CAP_PVAPI        = 800,          //!< PvAPI, Prosilica GigE SDK
>        CAP_OPENNI       = 900,          //!< OpenNI (for Kinect)
>        CAP_OPENNI_ASUS  = 910,          //!< OpenNI (for Asus Xtion)
>        CAP_ANDROID      = 1000,         //!< Android - not used
>        CAP_XIAPI        = 1100,         //!< XIMEA Camera API
>        CAP_AVFOUNDATION = 1200,         //!< AVFoundation framework for iOS (OS X Lion will have the same API)
>        CAP_GIGANETIX    = 1300,         //!< Smartek Giganetix GigEVisionSDK
>        CAP_MSMF         = 1400,         //!< Microsoft Media Foundation (via videoInput)
>        CAP_WINRT        = 1410,         //!< Microsoft Windows Runtime using Media Foundation
>        CAP_INTELPERC    = 1500,         //!< Intel Perceptual Computing SDK
>        CAP_OPENNI2      = 1600,         //!< OpenNI2 (for Kinect)
>        CAP_OPENNI2_ASUS = 1610,         //!< OpenNI2 (for Asus Xtion and Occipital Structure sensors)
>        CAP_GPHOTO2      = 1700,         //!< gPhoto2 connection
>        CAP_GSTREAMER    = 1800,         //!< GStreamer
>        CAP_FFMPEG       = 1900,         //!< Open and record video file or stream using the FFMPEG library
>        CAP_IMAGES       = 2000,         //!< OpenCV Image Sequence (e.g. img_%02d.jpg)
>        CAP_ARAVIS       = 2100,         //!< Aravis SDK
>        CAP_OPENCV_MJPEG = 2200,         //!< Built-in OpenCV MotionJPEG codec
>        CAP_INTEL_MFX    = 2300,         //!< Intel MediaSDK
>        CAP_XINE         = 2400,         //!< XINE engine (Linux)
>      };

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...