vlc-android播放网络视频流时网络延时参数设置
:
options.add(":file-caching=1500");
options.add(":network-caching=1500");
options.add(":codec=mediacodec,iomx,all");
options.add(":demux=h264");
值越大,缓存越大,延迟越大。
下面是摘录别人的pc端的方法,供大家参考
vlc这款播放器非常优秀而且是开源的,它的核心是开源视频编解码库ffmpeg。而且这款播放器还支持RTSP协议,这个主要是用开源的live555来实现的,live555这个库以后还需要认真研习。
一:
PC
端(
Windows
平台)
VLC
播放
RTSP
视频延迟问题解决
前几天用
PC
平台上的
VLC
播放
RTSP
流媒体时延迟时间较长,存在
1s
左右的延迟,效果不是很好,后来查了资料,发现这个延迟时间是可以修改的。
找到工具
->
首选项,然后参数设置左下角选择“全部”,左边选择 “输入编解码”
->“
网络缓存”选项,可以根据具体需要加以修改,具体见下图不过这个值不要太小,否则缓存太小,播放视频的过程中会很卡
如果网络环境较好,
300ms
以内效果很好,实时性较好。
二:
PC
端(
Linux
平台)
VLC
播放
RTSP
视频延迟问题解决
这里我的测试平台是
ubuntu
,
linux
平台上的
vlc
可以以命令行的方式来运行,而命令行是可以带参数的,我们只需要在参数里面指定这个延迟时间就可以了,下面是具体的命令行形式,大家可以根据各自需要加以调整
vlcrtsp://192.168.1.1:8556/test.avi --newwork-caching=300
rtsp
的地址要根据自己需要播放的视频地址修改,网络延迟时间也可以根据需要修改,这个值越小,实时性越好,当然太小了播放会很卡,或者设置的值失效,一般建议在
100-300
之间
三.
Android
平台
VLC
播放
RTSP
视频延迟问题解决
首先在
Android
平台上的
VLC
播放器不像
windows
平台上
UI
里提供了设置延迟时间这一项功能,其次也不像
Linux
平台上可以以命令行的方式来运行,我们也就不能通过设置参数的方式来修改这个延迟时间,怎么办呢,只剩下最后一条路,修改源代码,将延迟时间写死在源码里,有了前面
linux
平台下设置参数的经验,就可以在源码里面通过
grep
工具来查找”
network-caching”
,发现有很多文件包含这个值,下面是搜索的结果
点击
(
此处
)
折叠或打开
-
vlc
/
src
/
libvlc-module
.
c:add_integer
(
"network-caching"
,
CLOCK_FREQ
/
1000
,
-
vlc
/
NEWS:- --network-caching specifies caching
for
networkresources
,
-
vlc
/
modules
/
gui
/
macosx
/
simple_prefs
.
m:TestCaC
(
"network-caching"
,
10
/
3
);
-
vlc
/
modules
/
gui
/
macosx
/
simple_prefs
.
m:CaC
(
"network-caching"
,
10
/
3
);
-
vlc
/
modules
/
gui
/
qt4
/
components
/
open_panels
.
cpp:emit methodChanged
(
qfu
(
"network-caching"
)
);
-
vlc
/
modules
/
gui
/
qt4
/
components
/
simple_preferences
.
cpp:TestCaC
(
"network-caching"
,
10
/
3
);
-
vlc
/
modules
/
gui
/
qt4
/
components
/
simple_preferences
.
cpp:CaC
(
"network-caching"
,
10
/
3
);
-
vlc
/
modules
/
access
/
file
.
c:
*
pi_64
=
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
rtp
/
rtp
.
c:
*
v
=
INT64_C
(
1000
)
*
var_InheritInteger
(
demux
,
"network-caching"
);
-
vlc
/
modules
/
access
/
ftp
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
live555
.
cpp:
*
var_InheritInteger
(
p_demux
,
"network-caching"
);
-
vlc
/
modules
/
access
/
http
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
sftp
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
udp
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
smb
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
tcp
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
rtsp
/
access
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
mms
/
mmsh
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
mms
/
mmstu
.
c:
*
var_InheritInteger
(
p_access
,
"network-caching"
);
-
vlc
/
modules
/
access
/
vnc
.
c:
*
var_InheritInteger
(
p_demux
,
"network-caching"
);
-
vlc-android
/
jni
/
libvlcjni
.
c:libvlc_media_add_option
(
p_md
,
":network-caching=1500"
);
对这些文件的代码进行了一些分析,最后发现目标在
vlc/src/libvlc-module.c
这个文件,于是修改这个文件的
1832
行,如下图所示,将
CLOCK_FREQ/ 1000
改为
CLOCK_FREQ/ 3000
,这里可以根据各自的需要加以修改,分母越大,这个值就越小,实时性也就越好,当然跟前面所说一样,不能太小
点击
(
此处
)
折叠或打开
-
1832
//
add_integer
(
"network-caching"
,
CLOCK_FREQ
/
1000
,
-
1833
//
NETWORK_CACHING_TEXT
,
NETWORK_CACHING_LONGTEXT
,
true
)
-
1834add_integer
(
"network-caching"
,
CLOCK_FREQ
/
3000
,
-
1835NETWORK_CACHING_TEXT
,
NETWORK_CACHING_LONGTEXT
,
true
)
最后再编译运行发现延迟时间大概在
200ms
左右,比修改之前实时性有明显改善,实时性很好,希望这篇文章能给需要相关资料的朋友提供一些帮助,如果有什么问题欢迎给我留言。
为进一步降低延迟,采用极端方法修改
VLC
读缓冲机制。
0x01
VLC
读缓冲机制
对于一个rtmp
流
的读取,发起端在Demux module中,具体在该模块的Demux方法中调用ffmepg的接口av_read_frame读取每一帧数据。但是这个read的接口实在不清晰,经过了多个抽象层的封装,最后真正指向了rtmp_read接口。还是通过一个图来看会比较清晰:
了解一定
播放
器知识的同学应该都知道,
播放
器内部是有
缓存
的(非直播场景)。
缓存
的作用主要是解决生产者和消费者速度的不匹配,给用户更好的使用体验。例如,在
网络
不稳定的情况下,可以提前
缓存
部分数据确保视频
流
畅
播放
;在
网络
差的情况下,可以及时弹出缓冲标志提示用户当前
网络
不好。下面简单介绍下
VLC
的Buffering机制。
我们在使用
VLC
播放
视频时,能够明确的看到类似如下日志:
08-0613:48:51.8451149512427D
VLC
: [894f9830/308b...
VLC
版本2.0.1
最近研究IP-STB音视频同步问题,发现方案自带的自动STC在
网络
延时
过大时,不能成功同步音视频。在参考了
VLC
的串
流
播放
机制后,以为适当缓冲可以解决此问题,可惜最终结果是稍有缓解,并不能从根本上解决。但这种缓冲
时间
的计算,对于基于
网络
这种音视频数据的注入有一定的参考意义。
1、最初的线索:
使用-vvv参数启动VL
步骤2:从侧边栏菜单中选择“串
流
输出”(Stream Output)。影响缓冲区大小的
设置
标记为“
流
输出混
流
器
缓存
(毫秒)”(Stream Output Muxer Caching)。
步骤3:在“
流
输出混
流
器
缓存
(毫秒)”后面的输入框中输...