Как я могу получить поток RTP с JavaCV? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь потоковое видео с сервера 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
    • видео h.264 со звуком MPEG
  • Поток всех элементарных потоков выключен .

Я могу получить один экземпляр VLC для потоковой передачи на другой с этими настройками (с "клиентским" VLC, получающим от rtp://localhost:5004/test), и он работает просто отлично. (Единственные проблемы возникают из-за того, что слабый тестовый компьютер не подходит для перекодирования видео высокого разрешения.)

Переключитесь на Java, и все, что я вижу, это серые рамки с разбрызгиванием цвета здесь и там. Консоль также кричит весь путь до конца. Некоторые фрагменты (полный журнал слишком длинный, чтобы быть разумным сообщением, но его можно найти здесь , если вы действительно этого хотите):

[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 голосов
/ 11 января 2019

Я предполагаю, что вы должны сообщить FFmpegFrameGrabber правильный формат и коды. Ваш формат не H.264, так как вы отправляете транспортный поток MPEG-2. Попробуйте установить формат (setFormat) в «mpegts». Видеокодек для некоторого декодера H.264 и аудиокодек для некоторого декодера MPEG-2 Layer 3 (MP3).

Предположим, что сообщения об ошибках являются результатом того, что декодер H.264 пытается прочитать транспортный поток MEPG-2.

...