Потоковое видео и передача аудио только на сервер icecast2 - PullRequest
1 голос
/ 03 апреля 2019

У меня есть работающий сервер nginx, который позволяет мне передавать потоковое видео с нашей мобильной производственной системы. У нас также есть радиостанция на отдельном сервере, и мы хотели бы транслировать на оба. Но я не могу заставить его работать, и я не могу получить какие-либо журналы или информацию об ошибках, чтобы объяснить, почему. Я пытался решить конфигурацию nginx и FFMPEG.

Я пробовал различные попытки, используя то, что, как мне кажется, я понимаю из других страниц онлайн:

exec_push FFREPORT=file=ffreport.log:level=48 ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source:********!!@xxx.xxx.xxx.180:8000/live;

Также попытался использовать простой restream в conf nginx:

application restream {
                    live on;
                    exec_push ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source:***********@xxx.xxx.xxx.180:8000/live;
                    # push server2:1935
            }

Я использовал ту же информацию в Mixxx Live Broadcast Connection, чтобы получить подробности, думая, что я спрашиваю то же самое на сервере icecast2. Просто источником является сервер nginx.

Это полный конф на nginx

rtmp {

    server {
            listen 1935;
            chunk_size 4000;

            application live {
                    live on;
                    allow publish 127.0.0.1;
                    allow publish all;
                    allow play all;
                    record all;
                    record_path /usr/local/nginx/flv-streams;
                    record_unique on;
                    exec_record_done ffmpeg -i $basename.flv /usr/local/nginx/html/streams/$basename.mp4;
                    hls on;
                    hls_nested on;
                    hls_path /mnt/hls;
                    hls_fragment 1s;
                    hls_sync 1ms;
                    #exec_push FFREPORT=file=ffreport.log:level=48 ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source:*************@xxx.xxx.xxx.xxx:8000/live;
            }
            # Video on Demand
            application streams {
                    play /usr/local/nginx/html/streams/;
            }

            # Restream
            application restream {
                    live on;
                    exec_push ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source***************@xxx.xxx.xxx:8000/live;
                    # push server2:1935
            }

    }

Мне бы хотелось, чтобы те, кто может смотреть любую трансляцию с видео, но если они могут только слушать, как радио, я хочу, чтобы они слушали через наш радиоплеер. Это два разных потока на разных серверах.

В настоящее время я использую программное обеспечение для потоковой передачи на оба и хотел бы предотвратить это.

По моей собственной формулировке, возможно, не найдено ни одной идеи, как это сделать.

UPDATE

С помощью TBR мне удалось получить поток с сервера Nginx, идущего на новый сервер, на котором размещается icecast2. Однако не так, как ожидалось. Это делает это в 32 раза быстрее, поэтому не поток как таковой.

ffmpeg -i fcpr-1554651146.flv -vn -c:a mp3 icecast://source:password@10.0.0.0:8000/fcprlive.mp3

Однако мне интересно, не думал ли я об этом неправильно. В моем файле liquidsoap у меня есть этот код:

 #!/usr/bin/liquidsoap
 # Log dir set("log.file.path","/tmp/basic-radio.log")
 # Music
 myplaylist = mksafe(playlist("/home/offlineftp/playlist"))

 #Live Source
 set("harbor.bind_addr","0.0.0.0")
 live = input.http("http://localhost:8000/fcprlive")
 radio = fallback(track_sensitive=false, [live,plist])

 # Stream it out
 output.icecast(%mp3, host = "localhost", port = 8000,
 password = "pass", mount = "/fcpr")

Стоит ли смотреть на использование LiquidSoap для извлечения потока из Nginx, когда он активен, и если нет сигнала, чем перейти на запасной вариант?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Насколько я вижу, у вас есть сервер Nginx, который непрерывно записывает в файл 'flv'.

Я бы рекомендовал подходить к этому постепенно.

1. Прототип команды FFmpeg, которая будет транслироваться на Icecast за пределами Nginx , чтобы избежать путаницы

Все, что вам нужно сделать, - это убедиться, что вы можете успешно передавать аудио из статического видеофайла в Icecast и слушать его. Скорее всего, это будет выглядеть примерно так:

ffmpeg -i test.flv -vn -c:a libopus icecast://source:password@icecast.example.org:8000/teststream.opus
или в случае MP3
ffmpeg -i test.flv -vn -c:a mp3 icecast://source:password@icecast.example.org:8000/teststream.mp3

Возможно, вам придется дополнительно настроить это в соответствии с вашими потребностями, но это должно дать вам представление о том, как начать.

2. Интеграция в вашу настройку Nginx

Затем вы можете поместить это в конфигурацию Nginx и выяснить, как убедиться, что он может читать flv-файл во время его записи и что он выполняется.
Для отладки вы можете перенаправить STDOUT и STDERR, добавив 2>&1 >/tmp/ffmpeg-icecast.log к вашей команде.

0 голосов
/ 28 апреля 2019

Прошло несколько недель, но мне удалось заставить его работать.

Итак, что случилось: мы используем два потока от Mixxx и MimoLive, потому что нам нужна радиостанция, но иногда мы снимаем видео. Но это означало, что мне пришлось передавать дважды. Mixxx транслировал аудио на icecast. MimoLive транслировал на Nginx Server аудио и видео.

Во время мобильного вещания было много пропускной способности и данных. Поэтому я хотел полагаться только на аудио с сервера Nginx и передавать его на сервер icecast. С помощью и руководством @TBR мне удалось заставить это работать, используя это:

 exec ffmpeg -i rtmp://localhost/live/fcpr -vn -c:a libmp3lame -f mp3 icecast://source:password@ip.to.ice.cast:8000/live;

Что я пропустил, так это кодировку .flv в .mp3, а также использование правильных атрибутов в инструкции ffmpeg.

Стоит также отметить, что сервер icecast использует Liquidsoap, поэтому при отсутствии трансляции он возвращается в список воспроизведения.

Надеюсь, это может помочь другим, желающим сделать то же самое.

...