如何使用JavaCV接收RTP流?

时间:2019-01-10 19:54:21

标签: java ffmpeg h.264 rtp javacv

我正在尝试从RTP服务器(当前为测试用VLC)流式传输视频,并用Java对其进行解码。为此,我使用JavaCV解码传入的流。这是我到目前为止的内容:

try {
    grabber = new FFmpegFrameGrabber("rtp://localhost:5004/test");
    grabber.setFormat("h264");
    grabber.setFrameRate(30.0);
    grabber.start();
    Java2DFrameConverter converter = new Java2DFrameConverter();
    while (true) {
        Frame frame = grabber.grab();
        imageToDraw = frame != null ? converter.convert(frame) : null;
        // goes off to paint a widget on a window, see https://git.io/fhZSr for more context
        repaint();
    }
} catch (Exception e) {
    // TODO: Discover what circumstances cause this
    e.printStackTrace(System.out);
}

在VLC上,我的视频流设置是这样设置的:

  • 目标流:RTP / TS(地址localhost,端口5004和流名称test。)
  • 激活了转码,预设为“视频-H.264 + MP3(TS)”:
    • MPEG-TS封装
    • 带有MPEG音频的h.264视频
  • 流所有基本流已关闭。

通过这些设置,我可以使一个VLC实例流式传输到另一个实例(使用从rtp://localhost:5004/test接收的“客户端” VLC),它可以正常工作。 (唯一的问题是由于测试机性能较弱,不适合对高分辨率视频进行转码。)

切换到Java,我所看到的只是在这里到那里都带有一小撮颜色的灰色框。控制台也一直在尖叫。一些摘录(完整的日志太长了,不足以构成合理的帖子,但是如果您确实需要,可以在here上找到它):

[h264 @ 0x7f6c4c3502c0] cabac decode of qscale diff failed at 8 12
[h264 @ 0x7f6c4c3502c0] error while decoding MB 8 12, bytestream 670
[h264 @ 0x7f6c4c3502c0] concealing 421 DC, 421 AC, 421 MV errors in P frame

[h264 @ 0x7f6c4c3502c0] Reference 4 >= 2
[h264 @ 0x7f6c4c3502c0] error while decoding MB 25 8, bytestream 416
[h264 @ 0x7f6c4c3502c0] concealing 556 DC, 556 AC, 556 MV errors in B frame

[h264 @ 0x7f6c4c3502c0] Reference 5 >= 4
[h264 @ 0x7f6c4c3502c0] error while decoding MB 21 1, bytestream 6042
[h264 @ 0x7f6c4c3502c0] concealing 826 DC, 826 AC, 826 MV errors in P frame
[h264 @ 0x7f6c4c3502c0] Invalid NAL unit 8, skipping.
[above line repeats 5x]
[h264 @ 0x7f6c4c3502c0] top block unavailable for requested intra mode
[h264 @ 0x7f6c4c3502c0] error while decoding MB 3 0, bytestream 730
[h264 @ 0x7f6c4c3502c0] concealing 836 DC, 836 AC, 836 MV errors in P frame

我明显在做错什么吗?

1 个答案:

答案 0 :(得分:0)

我认为您必须告诉FFmpegFrameGrabber正确的格式和代码。由于您正在发送MPEG-2传输流,因此您的格式不是H.264。 尝试将格式(setFormat)设置为“ mpegts”。 用于某些H.264解码器的视频编解码器和用于MPEG-2第三层解码器(MP3)的音频编解码器。

假定错误消息是由H.264解码器尝试读取MEPG-2传输流导致的。