公司有个功能使用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

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐