Канонические настройки с низкой задержкой для VLC для Android (3.0+)

Недавно я начал использовать libVLC в приложении для Android с намерением заменить коммерческий SDK, за который мы много платим, но не видим ожидаемых результатов. Приложение требует просмотра RTSP-потоков как можно ближе к реальному времени. В идеале 500 мс или лучше (в зависимости от планшета), без смещения задержки с течением времени.

Процесс переключения коммерческого SDK для libVLC был практически незаметен и заработал сразу же, за исключением задержки в несколько секунд (без изменения каких-либо настроек по умолчанию). Он очень быстро подключается к потокам RTSP и не разрывает соединения.

Я потратил пару дней на настройку различных параметров, чтобы попытаться максимально уменьшить задержку. В некоторых случаях я получаю задержку в 300 мс, которая в конечном итоге смещается к задержке в несколько секунд, прежде чем поток прерывается и перезапускается (и танец задержки начинается снова). В других случаях (думаю, когда я устанавливаю слишком низкий сетевой кеш) я получаю журнал, полный ошибок, и никогда не получаю изображения.

Мои текущие настройки:

val media = Media(libVLC, Uri.parse(streamUrl))
media.setHWDecoderEnabled(true, false)
media.addOption(":network-caching=300")
media.addOption(":clock-jitter=0")
media.addOption(":clock-synchro=0")

Если я установлю network-caching на что-то меньшее, чем 200, я никогда не увижу изображение (я где-то читал, что это может быть связано с тем, что задержка декодера планшета выше 200 мс).

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

2019 г.: https://forum.videolan.org/viewtopic.php?t=149511

m.AddOption(":network-caching=150");
m.AddOption(":clock-jitter=0");
m.AddOption(":clock-syncro=0");

2018: параметры Android LibVLC не работают

options.add("--network-caching=50");
options.add("--clock-jitter=0");
options.add("--clock-synchro=0");

2017: Уменьшить задержку при воспроизведении rtp-потока с помощью libvlc на Android.

LibVLC libVlc = new LibVLC(context, arrayListOf(
    "--file-caching=150", 
    "--network-caching=150",
    "--clock-jitter=0",
    "--live-caching=150", 
    "--clock-synchro=0",
    "-vvv", 
    "--drop-late-frames", 
    "--skip-frames"
)); 

...OR...

media.setHWDecoderEnabled(true, false);
media.addOption(":network-caching=150");
media.addOption(":clock-jitter=0");
media.addOption(":clock-synchro=0");

2015 г.: https://forum.videolan.org/viewtopic.php?f=35&t=124932&p=420020&hilit=latency#p420020

Set network cache to 500, and disable HW acceleration

2015 г.: уменьшить задержку во время потоковой передачи и методы прямой трансляции

mLibvlc.setDevHardwareDecoder(LibVLC.DEV_HW_DECODER_AUTOMATIC);
mLibvlc.setHardwareAcceleration(LibVLC.HW_ACCELERATION_DISABLED);
mLibvlc.setNetworkCaching(150);
mLibvlc.setFrameSkip(true);

2013: Потоковая передача рабочего стола по RTP с использованием VLC с минимальная возможная задержка

Related to Desktop VLC and tweaking FFMPEG

И, конечно же, у нас есть огромный список флагов VLC здесь: https://wiki.videolan.org/VLC_commaand-line_help/

Итак, в заключение, существует ли канонический метод для libVLC 3+ на Android, который мы должны коллективно использовать для потоковых приложений в реальном времени?

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

Первоначально я разместил сообщение на форумах VideoLAN 3 дня назад.


person SJoshi    schedule 24.06.2019    source источник
comment
Есть новый флаг low-delay, который вы можете попробовать, нужна недавняя (4+) сборка.   -  person mfkl    schedule 25.06.2019
comment
Также попробуйте раздел форума разработчиков LibVLC.   -  person mfkl    schedule 25.06.2019
comment
@mtz Спасибо! Я только что нашел еще один пост с низкой задержкой на этом форуме, включая упоминание флага низкой задержки 4.0. Мне очень любопытно, что Videolabs работает с задержкой 60 мс. Это еще не достаточно чисто, чтобы быть выпущенным.   -  person SJoshi    schedule 25.06.2019
comment
Имейте в виду, что многие параметры, применяемые на уровне Media, вероятно, не будут иметь никакого эффекта. Единственный способ убедиться в этом — применить их на уровне Instance. Это верно для тех, кто использует Python, и я подозреваю, что это верно и для других языков программирования.   -  person Rolf of Saxony    schedule 02.07.2019
comment
Мы прошли точно такой же путь. Есть еще пара параметров, на которые вы можете обратить внимание: rtsp-caching, realrtsp-caching, sout-mux-caching. Не уверен, что какой-либо из них устарел. Я обнаружил, что иногда мне приходится смотреть в фактический исходный код, чтобы понять это, поскольку документация (как вы заметили) представляет собой беспорядок лет.   -  person avariant    schedule 04.07.2019
comment
Привет, есть новости по этой проблеме? Кроме того, какое у вас время начала воспроизведения? Мой поток rtsp h264/opus запускается около 20 секунд: O   -  person StayCool    schedule 05.02.2020
comment
@StayCool К сожалению, нет хороших ответов. Время воспроизведения довольно быстрое (секунды), но канонических настроек я пока не получил. Мы работаем с VLC, чтобы протестировать некоторые варианты с низкой задержкой, но результаты немного разбросаны, когда мы меняем настройки. Короткий ответ: они рекомендуют подождать, пока VLC 4 не станет стабильным, так как это должно быть существенным улучшением.   -  person SJoshi    schedule 11.02.2020
comment
@Sjoshi спасибо за подробности того, что происходит. На самом деле, мне сейчас нужен поток rtsp с очень низкой задержкой. Не могли бы вы поделиться цифрами того, чего вы достигли, используя 3.0, поэтому, если они не удовлетворяют меня, я мог бы просто начать двигаться дальше, с нашей libVLC или без нее. Кроме того, было бы очень здорово, если бы вы могли поделиться некоторыми аргументами запуска, которые я могу передать моему объекту org.videolan.libvlc.VLC и ускорить запуск воспроизведения) еще раз спасибо и с нетерпением жду вашего ответа!   -  person StayCool    schedule 11.02.2020
comment
Привет, @StayCool, у меня нет подробных цифр, потому что ни одна из них не была даже близкой к тому, что нам нужно. Либо у них была низкая задержка, а затем задержка накапливалась до неразумных уровней (> 5 секунд) в течение нескольких минут, либо нам пришлось принять задержку около 1 секунды - и большинство аргументов в моем исходном ответе / связанных ответах могут привести к задержка в 1 секунду.   -  person SJoshi    schedule 11.02.2020
comment
@SJoshi чувствует себя плохо, услышав это ( кроме того, это официальный порт из 3.0 libvlc github.com/videolan/vlc-android? У них есть приблизительная дата выпуска vlc 4.0 для Android?   -  person StayCool    schedule 11.02.2020
comment
@StayCool Ага. и Нет.   -  person SJoshi    schedule 12.02.2020