Java Opencv ffmpeg各种问题
公司有个功能使用Opencv将rtsp流生成图片和视频。
代码大概如下:
// 加载动态库
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
VideoCapture vc = new VideoCapture();
//第一步 :打开视频流
vc.open("rtsp://");
Mat mat = new Mat();
VideoWriter vw = new VideoWriter();
// 第二步:
//打开视频文件,参数1 视频文件的路径 参数2视频编码 参数3 帧数 参数4 视频宽度 参数5 视频高度
vw.open("playbackCamera.mp4", VideoWriter.fourcc('m', 'p', '4', '2'), 25.0, new Size(mat.width(), mat.height()));
// 第三步:读取一帧
boolean success = vc.read(mat);
// 第四步:写入
vw.write(mat);
// 第五步:释放
vw.release();
vc.release();
问题1:以上代码在windows环境中生成的视频如果遇到rtsp中断或者网络波动断流,程序会卡在
vc.read(mat);这个方法里,如果是线程,线程无法结束。
解决办法:
1.添加动态库System.load("opencv_videoio_ffmpeg460_64.dll");但是Linux中如果正确安装不需要加载此动态库。
2.第一步中添加vc.setExceptionMode(true);
此时再遇到断流,程序会抛出异常,然后结束程序或者线程。
问题2:以上代码在linux中无法生成视频提示如下:

H.264编解码器都已经正确安装并且ffmpeg编译时也已经使用H.264
方法1:
修改第二步代码中的视频编码
VideoWriter.fourcc('m', 'p', '4', 'v')
但是生成的视频编码不支持谷歌火狐edge浏览器播放,因为不是H.264编码。
可以使用 ffmpeg -i 视频文件名查看。如下:

正常的视频格式信息如下:
方法2:
视频编码的参数修改为
VideoWriter.fourcc('a', 'v', 'c', '1')
window/linux都可以生成的视频编码一致,浏览器都正常支持播放。
但是window开发过程中控制台会输出如下内容,不影响视频生成。有懂得的朋友可以解答一下。
[libopenh264 @ 0000023b8c2032c0] Incorrect library version loaded
[ERROR:1@96.981] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (2985) open Could not open codec libopenh264, error: Unspecified error (-22)
[ERROR:1@96.981] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (3002) open VIDEOIO/FFMPEG: Failed to initialize VideoWriter
问题3:linux环境中正确部署opencv相互匹配的版本。
版本不匹配的话生成视频时会报错
版本匹配方法参考:opencv ffmpeg 编译指南-CSDN博客
部署过程参考:linux系统中部署 FFmpeg-opencv460-CSDN博客
提醒各位:
opencv460 jdk1.8即可,opencv480需要jdk11
更多推荐

所有评论(0)