我正在尝试使用javacv获取rtsp监控摄像头并抓取帧,但遇到“avcodec_open2()错误-40:无法打开音频编解码器”错误,当抓取器准备在设置参数后启动。
Javacv版本:
这是Java异常信息:
org.bytedeco.javacv.FrameGrabber$Exception: avcodec_open2() error -40: Could not open audio codec.
at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:835) ~[javacv-1.4.1.jar:1.4.1]
at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:663) ~[javacv-1.4.1.jar:1.4.1]
rtsp信息: 对于rtsp源代码,我还尝试下载了FFplay和use命令
.\ffplay.exe -rtsp_transport tcp rtsp://admin:[email protected]
从监控摄像头显示帧,它工作,并具有以下信息
这是源代码:
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber ("rtsp://admin:[email protected]");
grabber.setImageHeight(640);
grabber.setImageWidth(360);
grabber.setOption("rtsp_transport", "tcp");
grabber.start(); // Where meet the problem
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.convert( grabber.grab() );
ByteArrayOutputStream bateArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpeg", bateArrayOutputStream);
byte[] data = bateArrayOutputStream.toByteArray();
bateArrayOutputStream.close();
我已经测试过将rtsp更改为mp4文件,代码可以正常工作。
我该如何解决这个问题?非常感谢!
我添加avutil.setLogCallback(FFmpegLogCallback.getInstance());
以获取更多日志:
Warning: [aac @ 00000000213a2c60] Audio object type 0
Warning: is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
Warning: [rtsp @ 00000000013fe6c0] Failed to open codec in avformat_find_stream_info
似乎FFmpeg处理音频流有一些问题。由于我不需要音频信息,最后我复制了FFmpegFrameGrabber
的所有代码,并禁用了音频代码部分。它可以成功抓取Frame。但我不确定此行动是否存在任何问题,是否有更好的解决方案?
更重要的是,当我使用grabber.grabImage()和grabber.flush()时,我觉得Javacv的性能不是很好......
我试图每秒抓取一次图像,但图像仍然严重延迟。运行约1分钟后,该程序仍然在40秒之前抓取图像,我该如何解决这个问题?非常感谢!