JavaCV Fetch RTSP遇到“ avcodec_open2()错误-40:无法打开音频编解码器”错误

时间:2019-04-05 15:06:11

标签: 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

显示监视摄像机的帧,它可以正常工作,并提供以下信息

  • 从'rtsp:// admin:DWUUUP@10.193.8.71'输入#0,rtsp:

    • 元数据:
      • title:媒体演示
    • 持续时间:N / A,开始:0.000000,比特率:N / A
      • 流#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文件,该代码可以正常工作。

如何解决此问题?非常感谢!

1 个答案:

答案 0 :(得分:0)

我添加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秒之前捕获图像,如何解决此问题?非常感谢!