OpenCV VideoWriter fourCC Android

时间:2016-10-12 04:20:44

标签: java android opencv fourcc

我在我的项目中使用Android的OpenCV 3.1库来处理图像并根据几个单独的OpenCv :: Mat编译视频文件。

我的问题是找到正确的fourCC代码。使用" MJPG"适用于Google Nexus 6P(Android 7.0),但不适用于Nexus 4(5.1.1)或Galaxy A3(6.0.1)。

在代码中,images是一个包含图像数据为bytearrays的数组。

VideoWriter videoWriter = new VideoWriter(filePath, VideoWriter.fourcc('M','J','P','G'), FPS, new Size(w,h));
videoWriter.open(filePath, VideoWriter.fourcc('M','J','P','G'), FPS, new Size(w,h));

for (int i = 0; i < images.size(); i++) {
     byte[] image = images.get(i);
     Mat rgbMat = new Mat(h,w,CvType.CV_8UC3);
     rgbMat.put(0,0,image);

     videoWriter.write(rgbMat);
     rgbMat.release();

}

videoWriter.release();

正如我所说,我在Nexus 6P上获得了一个有效的.avi文件,但在其他手机上却是一个损坏的文件。我知道我的其他管道正在所有手机上运行,​​因为我可以保存单个图像而不会出现问题(不使用OpenCV)。

我的问题:是否有适用于任何手机的4CC代码,独立于制造商?

我尝试过没有成功:&#39; MPEG&#39;,&#39; MP4V&#39;,&#39; PIM1&#39;

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果在onCameraFrame内使用mVideoWriter会覆盖每次初始化,因此会使用下面提到的某些条件。

 if (mVideoWriter == null) {
            mVideoWriter = new VideoWriter();
            Log.d(TAG, "mVideoWriter good : " + mVideoWriter);
            mVideoWriter.open(file_path.toString() + "/" + System.currentTimeMillis() + ".avi", VideoWriter.fourcc('M', 'J', 'P', 'G'), 30.0, mRgba.size());
            Log.i(TAG, "onCameraFrame: recordFilePath");


        }
        if (!mVideoWriter.isOpened()) {
            Log.w(TAG, "onCameraFrame: open");
            mVideoWriter.open(path.toString() + "/" + System.currentTimeMillis() + ".avi", VideoWriter.fourcc('M', 'J', 'P', 'G'), 30.0, mRgba.size());

        }

答案 1 :(得分:0)

问题是Android中的VideoWriter仅支持.avi格式。这是一个示例解决方案。

if (videoWriter.isOpened() == false) {
    Log.w("wewe", "som tu OPEN");
    videoWriter.open("/sdcard/movies/video.avi", VideoWriter.fourcc('M', 'J', 'P', 'G'), 25.0D, colorMat.size());
} else {
    videoWriter.write(colorMat);
}