Недавно я начал использовать 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 дня назад.
low-delay
, который вы можете попробовать, нужна недавняя (4+) сборка. - person mfkl   schedule 25.06.2019Media
, вероятно, не будут иметь никакого эффекта. Единственный способ убедиться в этом — применить их на уровнеInstance
. Это верно для тех, кто использует Python, и я подозреваю, что это верно и для других языков программирования. - person Rolf of Saxony   schedule 02.07.2019