На моей Raspberry Pi с модулем камеры я пытаюсь установить веб-платформу для потокового вещания. Я хочу просматривать поток в браузере и использовать CGI-скрипты для запуска/остановки трансляции на youtube (,...).

Вот как я выполнил настройку потоковой передачи:

введите описание изображения здесь

Nginx размещает RTMP-приложение webcam. Сюда я буду отправлять камеру и аудио поток с помощью ffmpeg. Он публикует поток как HLS для предварительного просмотра в Интернете. Он также направляет поток в другое приложение source. Именно там я хочу (иногда) подключить другой процесс ffmpeg для трансляции на конечные точки youtube (,...) RTMP.

Я инициирую поток с помощью ffmpeg следующим образом:

ffmpeg -loglevel debug -f v4l2 -framerate 15 -video_size 1280x720 -input_format h264 -i /dev/video0 -f alsa -i hw:2 -codec:v copy -g 15 -codec:a aac -b:a 128k -ar 44100 -strict experimental -f flv "rtmp://localhost:1935/webcam/hhart"

Пока все работает нормально. Я могу просматривать HLS-поток с помощью программы просмотра video.js на моем сайте (также обслуживаемом nginx).

Сейчас я хочу запустить еще один процесс ffmpeg для трансляции на мой канал youtube, подключенный к приложению source следующим образом:

ffmpeg -loglevel debug -f flv -listen 1 -i rtmp://localhost:1935/source/hhart -c copy 'rtmp://a.rtmp.youtube.com/live2/'

(в окончательной конфигурации запуск и завершение этого процесса будет осуществляться с помощью CGI-скриптов)

Вот что возвращает ffmpeg:

Opening an input file: rtmp://localhost:1935/source/hhart.
[flv @ 0x2032480] Opening 'rtmp://localhost:1935/source/hhart' for reading
[rtmp @ 0x2032a10] No default whitelist set
[tcp @ 0x20330f0] No default whitelist set

и затем... ничего не происходит. В студию Youtube не поступает поток, но и сообщений об ошибках нет.

Некоторые другие тесты, которые я провел:

  1. из приложения webcam, нажмите непосредственно на Youtube RTMP => это работает! (но это не то, что я хочу, потому что я хочу, чтобы поток HLS был онлайн всегда, а трансляция - только когда я выхожу в прямой эфир).

  2. из VLC отображает поток по адресу rtmp://localhost:1935/source/hhart => аналогично ffmpeg, сообщения об ошибке нет, индикатор выполнения продолжает загружаться.

Так что у меня сложилось впечатление, что происходит нечто, но фактических данных не передается.

Раздел RTMP в nginx.conf:

rtmp {                                                                     
    server {                                                               
        listen 1935;                                                       
        chunk_size 4000;                                                   
                                                                           
        application webcam {                                               
            live on;                                                       
            hls on;                                                        
            hls_path /Services/Webcam/HLSStream;                           
            hls_fragment 3;                                                
            hls_playlist_length 60;                                        
            #deny play all;                                                 
            push rtmp://localhost:1935/source/;                            
            #push rtmp://a.rtmp.youtube.com/live2/;
        }                                                                  
                                                                           
        application source {                                               
            live on;                                                       
            record off;                                                    
        }                                                                  
    }                                                                      
}                                                                          

Конечно, я могу быть совершенно не на том пути, поэтому любые предложения, как я могу реализовать свои требования лучшим образом, приветствуются!

vicmortelmans

Ответов: 1

Ответы (1)

OK, я перекомпилировал nginx с --with-debug и это привело меня к решению.

Чтобы не передавать поток другому приложению, мне нужно передать поток на RTMP-адрес на другом порту, а там второй процесс ffmpeg сможет его забрать. И кажется, что лучше использовать 127.0.0.1 вместо localhost.

Похоже на это:

rtmp {                                                                     
    server {                                                               
        listen 1935;                                                       
        chunk_size 4000;                                                   
                                                                           
        application webcam {                                               
            live on;                                                       
            hls on;                                                        
            hls_path /Services/Webcam/HLSStream;                           
            hls_fragment 3;                                                
            hls_playlist_length 60;                                        
            #deny play all;                                                 
            push rtmp://127.0.0.1:1936/test/;  # ADDED
            record off;                                                    
        }                                                                  
    }                                                                      
}        

Запуск трансляции на youtube:

ffmpeg -loglevel debug -f flv -listen 1 -i rtmp://127.0.0.1:1936/test/ -c copy -f flv 'rtmp://a.rtmp.youtube.com/live2/'

Сейчас мой поток HLS всегда онлайн, и я могу контролировать трансляцию на youtube, запуская/убивая второй процесс ffmpeg.

2022 WebDevInsider