Задать вопрос
@Levhav
Возьмусь за разработку проектов любой сложности.

Как реализовать стриминг видео «Один-ко-многим» с минимальной задержкой?

Надо сделать стриминг когда один вещает видео поток а множество людей его смотрит. Желательно сделать всё с минимальной задержкой в воспроизведении.

Сейчас наладил это так FreeSwitch держит видеоконференцию и транслирует её по rtmp на nginx с nginx-rtmp-module там rtmp конвертируется в hls и раздаётся в браузеры.

Но пока не могу побороть задержку в воспроизведении. Она у меня сейчас до 40 секунд и ни как не могу понять как её сократить.

Конфигурация nginx rtmp секции
worker_processes  1;

rtmp {
           
    server {
		live on;
        listen 1935;
        chunk_size 512;
        buflen 1s;
        idle_streams off;
        
        application cam1 {
            live on;
            exec_options on;


         	record off;

            exec ffmpeg -i rtmp://localhost/cam1/$name
				  -c:a libfdk_aac -b:a 32k   -c:v libx264 -b:v 128K -s 80x60    -f flv rtmp://localhost/hls/$name_low
				  -c:a libfdk_aac -b:a 64k   -c:v libx264 -b:v 256k -s 160x120  -f flv rtmp://localhost/hls/$name_mid
				  -c:a libfdk_aac -b:a 128K  -c:v libx264 -b:v 512K -s 320x240  -f flv rtmp://localhost/hls/$name_hi;
				   
        }
          
		application hls {
			live on;
			hls on;
			hls_path /tmp/hls;
			hls_fragment 2s;
			hls_playlist_length 10s;
			#record off;
			hls_type live;
 
			hls_continuous on;

			hls_fragment_naming sequential;

			hls_nested on; 
                        hls_cleanup off;

			hls_variant _low BANDWIDTH=160000;
			hls_variant _mid BANDWIDTH=320000;
			hls_variant _hi  BANDWIDTH=640000;
		} 
    }
}
Примечание: В итоге задержку мне удалось уменьшить. Как выяснилось её вносила команда `exec ffmpeg ... ` если там не проводить модификации самого видео с уменьшением качества то мой сервер начинает нормально тянуть трансляцию с задержкой до 10 секунд.
  • Вопрос задан
  • 7831 просмотр
Подписаться 10 Сложный 5 комментариев
Решения вопроса 1
@Levhav Автор вопроса
Возьмусь за разработку проектов любой сложности.
В целом отвечу ещё сам раз есть 10 подписчиков.
Мне удалось настроить nginx так чтоб задержка стрима была около 7 - 9 секунд.

Вот конфиг nginx
worker_processes  1;

rtmp {
           
    server {
		live on;
        listen 1935;
        chunk_size 512;
        buflen 1s;
        idle_streams off;
        
        application stream {
            live on; 
         	record off;
 
			hls on;
			hls_path /tmp/hls;
			hls_fragment 1s;
			hls_playlist_length 6; 
			hls_type live;
  
			hls_fragment_naming sequential;

			hls_nested on;  
			dash on;
            dash_path /tmp/dash;
            
            dash_fragment 1s;
            dash_playlist_length 6;
            dash_nested on; 
        } 
    }
}


Но этого мало. Если такой стрим скормить плееру https://videojs.github.io/videojs-contrib-hls/ то задержка будет 15 - 18 секунд примерно.

Но если внедриться в код плеера и перед тем как он в свои недра передаст содержимое index.m3u8 файла этот файл обрезать чтоб вместо 6 последних элементов в плей листе оставить 2 самых новых файла видео то задержка сократится до 7 - 9 секунд.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Wexter
с hls у вас задержки меньше 30-40с не будет. low-latency сейчас идут rtmp/mse/webrtc. последний работает из коробки в фрисвиче через sipml5, только что клиентам нужна будет учётка для дозвона extension'у
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Aporia Севастополь
от 50 000 до 100 000 ₽
Clain Лимассол
от 5 000 €