核心代码:

//该回调函数是button的回调函数,实现的功能是点击button就缓存已保存的图片为视频

private void addCallBack() {

int fps = 10;

int ifourcc = VideoWriter.fourcc('M','J','P','G');

org.opencv.core.Size cvSize = new org.opencv.core.Size(cropCopyBitmap.getWidth(),cropCopyBitmap.getHeight());

String path = Environment.getExternalStorageDirectory()+"/123/";//需要确保根目录有123这个文件

String name = System.currentTimeMillis() + ""

+ new Random().nextInt(1000000) + ".avi";

String filename = path + name;

VideoWriter writer = new VideoWriter(filename, ifourcc, fps, cvSize);

if(writer.isOpened())

Toast.makeText(getApplicationContext(),"successful!!!",Toast.LENGTH_SHORT).show();

else {

Toast.makeText(getApplicationContext(),"The opening fail!!!",Toast.LENGTH_SHORT).show();

}

for (int i = 0; i < matVideo.size(); i++) {

writer.write(matVideo.get(i));//matVideo是该类的成员变量,在此之前已经缓存了Mat视频帧信息。

//String pathName = path + i + ".jpg";

//imwrite(pathName,matVideo.get(i));

}

writer.release();

Toast.makeText(getApplicationContext(),"视频已缓存",Toast.LENGTH_SHORT).show();

matVideo.clear();

}

注意事项:

首先确保读写SD卡的权限被授予(我被它坑了一天)。

确保路径能够正确访问,最好是使用Android提供的文件API;其次文件名还是用数字吧,可以避免斜杠和字母组成转义字符啥的。

解码格式问题。我尝试了很多种,目前就('M','J','P','G')成功。

其他问题我已经在上篇博客中已提到,上篇。

尝试的解码格式种类如下(有兴趣的也可以去试试):

CV_FOURCC('P','I','M','1') = MPEG-1 codec

CV_FOURCC('M','J','P','G') = motion-jpeg codec

CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec

CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec

CV_FOURCC('U', '2', '6', '3') = H263 codec

CV_FOURCC('I', '2', '6', '3') = H263I codec

CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐