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

时间:2015-12-28 08:22:34

标签: android gstreamer rtp libvlc

我正在尝试使用gstreamer作为服务器实现使用sdp文件的纯RTP(无RTSP)的实时流,从服务器到客户端的延迟< 500毫秒。测试服务器已使用

进行了测试
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文件和文件缓存> = 1500毫秒。

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

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

ArrayList<String> options = new ArrayList<String>();
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客户端?

SOLUTION:

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

ArrayList<String> options = new ArrayList<String>();
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毫秒,因此我覆盖了网络缓存选项,在这种情况下,不使用文件缓存。可以对时钟抖动选项进行进一步研究,以便更好地进行优化。

0 个答案:

没有答案