java - JavaCV Fetch RTSP 遇到“avcodec_open2() 错误 -40: 无法打开音频编解码器”错误
问题描述
我正在尝试使用 javacv 获取 rtsp 监控摄像头并抓取帧,但在设置参数后准备启动抓取器时遇到“avcodec_open2() 错误 -40:无法打开音频编解码器”错误。
Javacv 版本:
- org.bytedeco.javacv 平台,1.4.1
- org.bytedeco.javacpp-presets.opencv-平台,3.4.1-1.4.1
这是 Jave 异常信息:
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 infomation:
对于rtsp源,我也试过下载FFplay和使用命令
.\ffplay.exe -rtsp_transport tcp rtsp://admin:DWUUUP@10.193.8.71
显示来自监控摄像机的帧,它可以工作,并带有以下信息
输入 #0,rtsp,来自 'rtsp://admin:DWUUUP@10.193.8.71':
- 元数据:
- 标题:媒体展示
- 持续时间:不适用,开始:0.000000,比特率:不适用
- 流 #0:0:视频:h264(主要)、yuvj420p(pc、bt709、渐进式)、1920x1080 [SAR 1:1 DAR 16:9]、15 fps、24.17 tbr、90k tbn、30 tbc
- 流 #0:1:音频:aac,16000 Hz,1 个通道,fltp
- 元数据:
[aac @ 000001fc123be880] 音频对象类型 0 未实现。将您的 FFmpeg 版本更新到 Git 的最新版本。如果问题仍然存在,则意味着您的文件具有尚未实现的功能。
这是源代码:
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber ("rtsp://admin:DWUUUP@10.193.8.71");
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 秒前的图像,我该如何解决这个问题?非常感谢!
推荐阅读
- dart - 如何为函数类型的可选位置参数设置默认值?
- java - 将来自蓝牙连接的传入数据用于特定对象?C# Windows 窗体应用程序和 Java Android 应用程序
- flutter - Flutter Dio Package:如何收听另一个类的下载进度?
- hibernate - Hibernate 创建 OneToMany 而不是 OneToOne
- sql - 如何在特定值之前找到行?
- asp.net - Asp.net 验证器未在客户端验证在服务器端工作正常
- c# - 如何按 DataTime 对元组列表进行排序,其中 DataTime 是元组的第三个元素?
- distributed-computing - 严格一致性 vs 原子一致性
- c# - 依赖注入问题 - 初始化远程服务连接
- javascript - 尝试使用“import”时 Jest 出错