JavaCV 获取 RTSP 遇到 "avcodec_open2() error -40: Could not open audio codec"错误

标签 java ffmpeg rtsp javacv

我正在尝试使用 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 信息:
    对于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 个 channel ,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。但是我不确定这个 Action 有没有问题,有没有更好的解决方案?

    更何况我在使用grabber.grabImage()和grabber.flush()的时候,感觉Javacv的性能不是很好……

    我尝试每秒抓取一次图像,但图像仍然严重延迟。运行大约 1 分钟后,程序仍在抓取 40 秒前的图像,我该如何解决这个问题?非常感谢!

    关于JavaCV 获取 RTSP 遇到 "avcodec_open2() error -40: Could not open audio codec"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538414/

    相关文章:

    javascript - 使用 Node Media Server 将 IP cam 的 RTSP 重新流式传输到 http/ws 并以 html 形式显示

    android - 在android中从http url播放sdp文件(rtsp流)

    audio - ffmpeg 转换为 mp4 将音频移动一帧

    c - 如何在cygwin环境下使用mingw-w64工具链编译ffmpeg

    url - 从YouTube获取RTSP URL

    java - 常数的病态使用

    JAVA - 使用 JNDI 或 Spring LDAP 从 AD 获取最大密码期限 (maxPwdAge)?

    java - 我可以并且是否需要避免单例模式?

    java - 自定义监听器未注册

    video - 使用 ffmpeg 在视频上绘图