Уменьшить задержку HLS с +30 секунд

Убунту 12.04

нгинкс 1.2.4

avconv -версия

avconv version 0.8.10-4:0.8.10-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Feb  6 2014 20:56:59 with gcc 4.6.3
avconv 0.8.10-4:0.8.10-0ubuntu0.12.04.1
libavutil    51. 22. 2 / 51. 22. 2
libavcodec   53. 35. 0 / 53. 35. 0
libavformat  53. 21. 1 / 53. 21. 1
libavdevice  53.  2. 0 / 53.  2. 0
libavfilter   2. 15. 0 /  2. 15. 0
libswscale    2.  1. 0 /  2.  1. 0
libpostproc  52.  0. 0 / 52.  0. 0

Я использую avconv и nginx для создания потока HLS, но сейчас моя задержка регулярно превышает 30 секунд. После долгого чтения я понял, что HLS имеет встроенную задержку и что 10 секунд ожидаются и даже предпочтительнее, но 30 секунд кажутся довольно экстремальными.

Я видел много обсуждений в группе nginx-rtmp google, было много предложений. Я попытался решить свою проблему, уменьшив hls_fragment и hls_playlist_length, но они не оказали существенного влияния.

nginx.conf:

#user  nobody;
worker_processes  1;

error_log  logs/error.log debug;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       8888;
        server_name  localhost;

        add_header 'Access-Control-Allow-Origin' "*";

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
        }

        # rtmp stat
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            # you can move stat.xsl to a different location
            root /usr/build/nginx-rtmp-module;
        }

        # rtmp control
        location /control {
            rtmp_control all;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

        application myapp {
            live on;

            hls on;
            hls_path /tmp/hls;
            hls_base_url http://x.x.x.x:8888/hls/;
            hls_sync 2ms;
            hls_fragment 2s;

            #hls_variant _low BANDWIDTH=160000;
            #hls_variant _mid BANDWIDTH=320000;
            #hls_variant _hi BANDWIDTH=640000;
        }
    }
}

команда авконв:

avconv -r 30 -y -f image2pipe -codec:v mjpeg -i - -f flv -codec:v libx264 -profile:v baseline -preset ultrafast -tune zerolatency -an -f flv rtmp://127.0.0.1:1935/myapp/mystream

Изменить

Я знаю, что узким местом является не avconv, потому что я также создаю поток RTMP с использованием nginx. Этот RTMP-поток имеет очень маленькую задержку (пару секунд).


person Rick    schedule 04.06.2014    source источник
comment
Как вы видели, природа HLS заключается в высокой задержке. 30 секунд не экстремально... это довольно часто. Когда YouTube проводит прямые трансляции, задержки в несколько минут являются нормой (хотя у них есть гораздо большая сеть для распространения). Предложения, которые вы нашли, также верны. Если они не повлияли на вашу задержку, проблема может быть на стороне кодирования. Уберите часть HLS из уравнения и попробуйте немедленно воспроизвести данные из avconv/FFmpeg. Измерьте задержку. Это должно быть секунда или меньше, но вы никогда не знаете.   -  person Brad    schedule 04.06.2014
comment
Моя текущая настройка создает два потока, один из которых использует HLS, другой использует RTMP, поток RTMP имеет очень небольшую задержку (возможно, пару секунд).   -  person Rick    schedule 04.06.2014
comment
@Rick Я вижу, что вы сейчас используете nodejs, который может быть интересен в использовании, но, к сожалению, я считаю, что iOS требует, чтобы вы использовали HLS для потоковой передачи, или RTMP, вероятно, был бы моим первым выбором. Как у вас с задержкой сейчас?   -  person Panama Jack    schedule 22.12.2016
comment
@PanamaJack - Предостережение, я не участвовал в этом проекте пару лет. Я не считаю, что IOS была проблемой, мы использовали nodejs для потоковой передачи, а затем использовали библиотеку декодера JS, которая записывала кадры в холст HTML5. Задержка была нормальной (пару секунд). Мы не могли использовать RTMP, потому что для этого требовался флеш-плеер в браузере, который не даст вам доступа к отдельным кадрам (что нам было нужно). Обратите внимание, что все это могло измениться за пару лет, что я последний раз работал над этим.   -  person Rick    schedule 23.12.2016


Ответы (2)


У меня когда-то была такая же проблема. Я добавил два параметра в nginx.conf, после чего задержка сократилась до 10 секунд еще меньше. Вот моя конфа:

    application hls {
        hls_playlist_length 4s; 
        hls_fragment 1s
    }

Тем не менее, я должен сказать, что 10 секунд, кажется, являются нашим ограничением. Любые лучшие решения?

person 余云鹏    schedule 26.05.2016
comment
В конце концов мы полностью отказались от HLS и переключились на использование сервера nodejs, который будет передавать кадры через сокет. ссылка - person Rick; 26.05.2016

Ответ, подробно описывающий сокращение hls_playlist до 4 с, а hls_fragment до 1 с, хорош. Однако важно отметить, что если в исходном видео интервал между ключевыми кадрами больше, чем длина hls_fragment, то nginx, как правило, будет создавать более длинные фрагменты, и задержка будет увеличиваться.

Самая низкая задержка, которую мы достигли, была с hls_fragment равным 1 с и интервалом ключевого кадра исходного видео также равным 1 с. С этими настройками мы добились задержки менее 7 секунд.

person brod    schedule 14.08.2016
comment
Я чувствую, что это больше комментарий, чем ответ. - person Aziz; 14.08.2016
comment
Я дал это в качестве ответа, потому что вам абсолютно необходимо установить интервал исходного ключевого кадра на низкое значение, иначе вы не получите задержку ниже 10 с, как ожидалось в исходном вопросе (и мне не разрешено добавлять комментарии, так как еще я мог это сделать важное различие, которое еще не было упомянуто ясно?) - person brod; 16.08.2016
comment
@brod, как ты изменил интервал ключевых кадров нашего видео? Я пытаюсь выполнить потоковую передачу в браузере с помощью hls.js и не нашел способа сделать это. - person hoodsy; 08.12.2017
comment
@hoodsy Это должно быть установлено для того, что генерирует ваше видео. Для тестирования вы можете попробовать использовать приложение Larix Broadcaster на планшете или телефоне. Вещатель Larix позволяет изменить интервал ключевых кадров видео: ссылка - person brod; 10.12.2017
comment
Также возможно, когда вы используете OBS или vmix. - person Hirbod; 28.04.2018