当前位置:  开发笔记 > 运维 > 正文

在Android客户端上通过RTP实时流式传输

如何解决《在Android客户端上通过RTP实时流式传输》经验,为你挑选了0个好方法。

我正在尝试使用gstreamer作为服务器实现实时流式传输,而不是纯RTP(无RTSP),使用sdp文件,服务器到客户端的延迟时间<500ms.测试服务器已经过测试

gst-launch-1.0 -v v4l2src ! video/x-raw,width=640,height=480,framerate=30/1 ! x264enc tune=zerolatency threads=0 bitrate=500 speed-preset=ultrafast ! rtph264pay pt=96 config-interval=1 ! udpsink host=X.X.X.X port=X

如果我尝试使用gst-launch从gstreamer客户端接收它我没有延迟(在网络上使用两个不同的设备),我也能够使用vlc作为客户端,读取sdp文件和使用文件缓存实现相同的功能> = 1500ms.

我的问题是我需要一个Android客户端.我正在尝试使用LibVLC for Android但是使用相同的选项我无法实现延迟<2s.

适用于Android的LibVLC代码,其中MediaPlayer和Media是org.videolan.libvlc的一部分:

ArrayList options = new ArrayList();
options.add("--file-caching=2000");
mLibVLC = new LibVLC(options);
mLibVLC.setOnHardwareAccelerationError(this);
mHolder.setKeepScreenOn(true);

// Create media player
mMediaPlayer = new MediaPlayer(mLibVLC);
mMediaPlayer.setEventListener(mPlayerListener);

mSurface = (SurfaceView) findViewById(R.id.surfaceView);
mHolder = mSurface.getHolder();

// Set up video output
final IVLCVout vout = mMediaPlayer.getVLCVout();
vout.setVideoView(mSurface);
vout.setWindowSize(640, 480);
vout.addCallback(this);
vout.attachViews();

Media m = new Media(mLibVLC, media);
mMediaPlayer.setMedia(m);
mMediaPlayer.play();

我还尝试了其他选项--clock-synchro -clock-jitter等...在启动时,似乎需要大约2秒来缓冲,这些秒延迟了整个流.有一种方法可以减少标准客户端中的延迟,或者是否存在另一个Android客户端?


解:

最后,我得到了延迟≈200ms的工作.我更多地研究了LibVLC和Media对象,并且我发现我可以设置本地媒体选项和硬件加速.我设置了低价值的网络缓存(与VLC桌面客户端相反)时钟同步,时钟抖动,此外我使用全局选项将算法缩放到Fast Bilinear,这对我的活动来说已经足够了.在更新的代码下面:

ArrayList options = new ArrayList();
options.add("--aout=none");
options.add("--swscale-mode=0");

mLibVLC = new LibVLC(options);
mLibVLC.setOnHardwareAccelerationError(this);
mHolder.setKeepScreenOn(true);

// Create media player
mMediaPlayer = new MediaPlayer(mLibVLC);
mMediaPlayer.setEventListener(mPlayerListener);

// Set up video output
final IVLCVout vout = mMediaPlayer.getVLCVout();
vout.setVideoView(mSurface);
vout.setWindowSize(640, 480);
vout.addCallback(this);
vout.attachViews();

Media m = new Media(mLibVLC, media);
m.setHWDecoderEnabled(true, false);
m.addOption(":network-caching=150");
m.addOption(":clock-jitter=0");
m.addOption(":clock-synchro=0");

mMediaPlayer.setMedia(m);
mMediaPlayer.play();

在Media上启用硬件加速,它会自动将文件缓存和网络缓存设置为1500毫秒,因此我覆盖了网络缓存选项,在这种情况下,不使用文件缓存.可以对时钟抖动选项进行进一步研究,以便更好地进行优化.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有