我正在尝试使用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的一部分:
ArrayListoptions = 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,这对我的活动来说已经足够了.在更新的代码下面:
ArrayListoptions = 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毫秒,因此我覆盖了网络缓存选项,在这种情况下,不使用文件缓存.可以对时钟抖动选项进行进一步研究,以便更好地进行优化.