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