Канонические настройки низкой задержки для VLC для Android (3.0+) - PullRequest
7 голосов
/ 25 июня 2019

Я недавно начал использовать 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 дня назад.

...