首先个人感觉JAVACV这个库不好用,内部API基本上没有注释
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
log.info("创建grabber成功");
grabber.setOption("rtsp_transport", "tcp");
grabber.setFrameRate(frameRate);
//设置获取的视频宽度
grabber.setImageWidth(frameWidth);
//设置获取的视频高度
grabber.setImageHeight(frameHeight);
//设置视频bit率
grabber.setVideoBitrate(2000000);
FFmpegLogCallback.set();
grabber.start();
log.info("grabber.start");
Java2DFrameConverter java2DFrameConverter = new Java2DFrameConverter();
while (true){
Frame frame = grabber.grabImage();
if (null == frame) {
continue;
BufferedImage bufferedImage = java2DFrameConverter.getBufferedImage(frame);
byte[] bytes = imageToBytes(bufferedImage, "jpg");
byte2image(bytes);
// 抓取延时2s
Thread.sleep(2000);
try (FileImageOutputStream imageOutput = new FileImageOutputStream(new File("D:\\excel\\" + num + ".png"))) {
num++;
imageOutput.write(data, 0, data.length);
log.info("图片保存成功" + num);
} catch (Exception ex) {
ex.printStackTrace();
使用FFmpegFrameGrabber.grabImage()进行抓帧的时候,如果设置Thread.sleep(2000),保存在D盘的图片并不是搁2s一张,是连续的帧,且抓取一段时间会出现Error: [h264 @ 00000181aa66e6c0] error while decoding MB 91 47, bytestream -5 错误
这边为了解决这个问题,代码改为下面的(因为本身要求只是个小demo,可能只是演示使用一次)
FFmpegFrameGrabber.tryLoad();
grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
log.info("创建grabber成功");
grabber.setOption("rtsp_transport", "tcp");
// grabber.setFrameRate(frameRate);
// //设置获取的视频宽度
// grabber.setImageWidth(frameWidth);
// //设置获取的视频高度
// grabber.setImageHeight(frameHeight);
// //设置视频bit率
// grabber.setVideoBitrate(200000);
// grabber.setMaxDelay(2);
FFmpegLogCallback.set();
//不进行grabber.start()
//grabber.start();
log.info("grabber.start");
singleThreadExecutor.execute(() -> {
while (true) {
try {
Long end = System.currentTimeMillis();
//为了抓取最新的,每次进行grabber.start()
grabber.start();
log.info("grabber.start====>" + (System.currentTimeMillis()-end));
frame = grabber.grabImage();
log.info("grabber.grabImage====>" + (System.currentTimeMillis()-end));
if (frame != null) {
bufferedImage = java2DFrameConverter.getBufferedImage(frame);
if (bufferedImage != null) {
byteImage = PictureUtils.imageToBytes(bufferedImage, "jpg");
this.byte2image(byteImage);
log.info("数据转换====>" + (System.currentTimeMillis()-end));
//抓取完成,进行grabber.stop()
grabber.stop();
Long data = System.currentTimeMillis();
log.info("grabber.stop====>" + (data-end));
Thread.sleep(1000);
通过每次抓取去grabber.start() 和grabber.stop()去解决这个问题
JAVACV 中断报错:Error: [h264 @ 00000181aa66e6c0] error while decoding MB 91 47, bytestream -5,图像延时问题
首先个人感觉JAVACV这个库不好用,内部API基本上没有注释,社区也不够完善 FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl); log.info("创建grabber成功"); grabber.setOption("rtsp_transport", "tcp"); grabber.setFrameRate(frameRate); //设置获取的视频宽度 grabber.s.
我是使用 ffmpeg播发mp4视频时候
报错的,
报错,但是视频依然能播发。mp4视频是自己打包的。
经过追踪,在
h264打包成mp4之前的纯264视频就存在了
报错问题。经过对比,确定是264视频帧数据存在错误。
JavaCV-示例
该项目包含使用和来自项目的其他库包装器的。
-在罗伯特Laganière的书“OpenCV计算机视觉应用编程食谱”介绍的例子JavaCV版本。 Cookbook中的原始示例是C ++,在此将它们转换为使用JavaCV API。
使用库的示例。
将用于Flir / Point Grey 。
demo-将用于Flir / Point Grey 示例。
一方面:如果采取pipeline的模式进行目标识别,先读取数据再识别,会有下面的
报错:
[
h264 @ 0x55abeda05080] left block unavailable for requested intra mode
[
h264 @ 0x55abeda05080]
error while
decoding MB 0 14,
bytestream 104435
目前比较靠谱的一种解释是“FFMPEG Lib does not support
H264 videos
解决Python OpenCV 读取视频抽帧出现error while decoding的问题1. 问题2. 解决3. 源代码参考
1. 问题
读取H264视频,抽帧视频并保存,报错如下;
[aac @ 00000220b9a07fc0] Input buffer exhausted before END element found
[h264 @ 00000220b9cd0500] error while decoding MB 20 45, bytestream -14
2. 解决
溯本求源:htt
JAVACV 中断报错:Error: [h264 @ 00000181aa66e6c0] error while decoding MB 91 47, bytestream -5,图像延时问题