我最近开始在 Android 应用程序中使用 libVLC,目的是替换我们付出很多代价但没有看到我们希望的结果的商业 SDK。该应用程序需要尽可能接近实时地查看 RTSP 流。理想情况下为 500 毫秒或更好(取决于平板电脑),而延迟不会随着时间的推移而漂移。
为 libVLC 切换商业 SDK 的过程几乎是无缝的,并且可以立即运行,除了延迟为几秒钟(没有触及任何默认设置)。它连接到 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");
options.add("--network-caching=50");
options.add("--clock-jitter=0");
options.add("--clock-synchro=0");
2017:在 Android 上使用 libvlc 播放 rtp 流时减少延迟
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:使用 VLC 以尽可能低的延迟通过 RTP 流式传输桌面
Related to Desktop VLC and tweaking FFMPEG
当然,我们在这里有大量的 VLC 标志列表:https ://wiki.videolan.org/VLC_commaand-line_help/
所以,总而言之,Android 上的 libVLC 3+ 是否有一个规范的方法,我们应该共同将其用于实时流应用程序?
在我的例子中,为了尽可能接近实时,零缓存和丢弃延迟帧是理想的(即使是 janky 帧)。但是,我也明白,对于大多数人来说,稳定的流媒体(偶尔会出现零星的丢帧)会更受欢迎。
我最初在3 天前发布在VideoLAN 论坛上。