ffmpeg udp live stream опубликовать в rtmp

Мне нужно сделать эту цепочку: JVC HM650 - UDP -> localhost -> ffmpeg (поток копирования) -> nginx-rtmp

На входе у меня есть поток UDP с камеры (udp: // @: 35501), и мне нужно его опубликовать на сервере rtmp (nginx с модулем rtmp). Кроме того, все работает - я могу воспроизводить ввод на VLC, я могу передавать поток из FMLE в nginx и т. Д. За исключением того, что это мой первый раз с ffmpeg, и я не могу заставить его работать. Так:

Лучшее, что у меня есть:

C:\ffmpeg\bin>ffmpeg -re -i udp://@:35501 -f flv "rtmp://192.168.1.17/live/live" -loglevel debug
ffmpeg version N-69972-g6c91afe Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnu
tls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-
libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-l
ibrtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --
enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --ena
ble-libxvid --enable-lzma --enable-decklink --enable-zlib
  libavutil      54. 19.100 / 54. 19.100
  libavcodec     56. 25.100 / 56. 25.100
  libavformat    56. 23.100 / 56. 23.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.100 /  5. 11.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Splitting the commandline.
Reading option '-re' ... matched as option 're' (read input at native frame rate) with argument '1'.
Reading option '-i' ... matched as input file with argument 'udp://@:35501'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'flv'.
Reading option 'rtmp://192.168.1.17/live/live' ... matched as output file.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input file udp://@:35501.
Applying option re (read input at native frame rate) with argument 1.
Successfully parsed a group of options.
Opening an input file: udp://@:35501.
[udp @ 0000000002c30760] end receive buffer size reported is 65536
[AVIOContext @ 0000000002c513c0] Statistics: 0 bytes read, 0 seeks
udp://@:35501: Immediate exit requested
Received signal 2: terminating.

C:\ffmpeg\bin>

Что не так с конфигурацией ffmpeg?

РЕШЕНИЕ:

ffmpeg прослушивал неправильную версию протокола UDP:

Даже IPv6 отключен на сетевых картах внутри системы с помощью @ разрешенного ffmpeg прослушивания UDPv6.

Использование 127.0.0.1 указывает ffmpeg использовать чистый UDP.

Спасибо, @thomas, чтобы заставить меня думать иначе!


person Pilskalns    schedule 20.02.2015    source источник


Ответы (1)


Похоже, ваша команда ffmpeg правильная, у меня работает. Для информации вот результат, приводящий к хорошо настроенному udp-соединению:

...
Opening an input file: udp://@:35501.
[udp @ 0x2058c80] end receive buffer size reported is 131072
[flv @ 0x20631a0] Format flv probed with size=2048 and score=100
[flv @ 0x20631a0] Before avformat_find_stream_info() pos: 13 bytes read:2099 seeks:0
[flv @ 0x20631a0] max_analyze_duration 5000000 reached at 5016000 microseconds
rfps: 29.916667 0.015099
rfps: 30.000000 0.000067
    Last message repeated 1 times
rfps: 60.000000 0.000267
    Last message repeated 1 times
rfps: 120.000000 0.001067
    Last message repeated 1 times
rfps: 240.000000 0.004267
rfps: 29.970030 0.002007
rfps: 59.940060 0.008027
[flv @ 0x20631a0] After avformat_find_stream_info() pos: 12110 bytes read:12110 seeks:0 frames:154
Input #0, flv, from 'udp://@:35501':
  Metadata:
    AspectRatioX    : 1
    AspectRatioY    : 1
    metadatacreator : GStreamer FLV muxer
    creationdate    : Mon Feb 23 6:51:54 2015
  Duration: N/A, start: 0.002000, bitrate: N/A
    Stream #0:0, 154, 1/1000: Video: h264 (High), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 1/60, 30.30 fps, 30 tbr, 1k tbn, 60 tbc
Successfully opened the file.
Parsing a group of options: output file rtmp://192.168.0.20/live/live.
Applying option f (force format) with argument flv.
Successfully parsed a group of options.
Opening an output file: rtmp://192.168.0.20/live/live.
...

Это означает, что ваш входящий поток плохо настроен. Вы уверены, что ваша камера передает поток по правильному протоколу (udp), адресу (ip хоста ffmpeg) и порту (35501)? Возможно, если у вас его нет, я нашел здесь руководство по эксплуатации вашей камеры: http://pro.jvc.com/pro/attributes/CAMERA/manual/GY-HM650U_V2.pdf (прямая трансляция, стр. 166)

Надеюсь, это поможет!

person thomas    schedule 23.02.2015
comment
Привет, @thomas. Я уверен, что камера настроена правильно, как я вижу в VLC, и мы использовали эту камеру в потоковом режиме в течение некоторого времени, даже через соединение 4G (LTE), и она отлично работает. За исключением того, что в качестве принимающей части мы используем VLC, но я не хочу избавляться от него и создавать автоматизированный и надежный рабочий процесс, который не включает ручной запуск на стороне сервера. Я даже пробовал записывать с помощью ffmpeg в файл, но на выходе всегда получается файл размером 1 Кб, который невозможно воспроизвести. Требуются ли для ffmpeg какие-то библиотеки или зависимости Windows? - person Pilskalns; 23.02.2015
comment
Я видел, что иногда размер блока ffmpeg на конце приемного буфера, о котором сообщается, составляет 65536 шагов. Вы пытались: - остановить потоковую передачу с камеры - перезапустить команду ffmpeg - а затем снова начать потоковую передачу с камеры? Какой тип подключения вы используете для потоковой передачи в VLC? - person thomas; 23.02.2015
comment
Возможно, я ошибаюсь, но чтобы убедиться, что вы действительно транслируете на порт udp 35501, остановите ffmpeg и запустите следующий скрипт python в инструменте командной строки: udpserver.py. А затем начните трансляцию со своей камеры. Если я прав, скрипт будет бесконечно ждать очереди на порту: 35501. - person thomas; 23.02.2015
comment
Я нашел решение по-другому, так как у меня нет настройки Py, я слишком ржавый с ним, не писал ни одной строчки в Py годами :) Итак, то, что сбивало с толку, ffmpeg слушал UDPv6 непросто UDP. Я заметил в TcpView (из Sysinternals), что ffmpeg слушает UDPv6. Чтобы исправить это, я просто изменил команду с @ на 127.0.0.1. У меня следующая ошибка, но there is no place like 127.0.0.1, знаете ... - person Pilskalns; 23.02.2015
comment
Ой, странно .. По умолчанию у меня слушает udp v4. Молодец! Какая у вас новая ошибка? Если вам нужен крошечный сервер, поддерживающий rtmp и rtmfp, вы можете попробовать MonaServer. - person thomas; 23.02.2015
comment
Для сервера I nginx-rtmp, даже если он предназначен для систем Unix, мне нравится работать с ним в Windows, и добавление нового модуля - это новые возможности для существующих навыков. Это приложение не будет перегружать клиентскую сеть. Некоторое время назад я нашел хорошие обучающие материалы на сайте [Help-squad] (help-squad.com). Вот снимок экрана. Ошибки внизу - это перезапуск UDP. Когда stop- ›изменил битрейт внутри камеры-› start, ffmpeg получал странный вывод, ffmpeg restart исправляет это. Я хочу настроить параметры потока ffmpeg для анализа при перезапуске. - person Pilskalns; 23.02.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person thomas; 23.02.2015