android 上的低延迟视频播放器
Low latency video player on android
我希望能够将视频从我的网络摄像头流式传输到本地网络上延迟低于 500 毫秒的 Android 应用程序。
为了通过网络捕获和发送视频,我使用 ffmpeg。
ffmpeg -f v4l2 -i /dev/video0 -preset ultrafast -tune zerolatency -vcodec libx264 -an -vf format=yuv420p -f mpegts udp://192.168.1.155:5000
此命令将网络摄像头作为输入,将其转换并使用 mpegts 协议将其发送到设备。
这不是必需的,如果其他技术可行,我可以更改发送视频的方式。
我可以使用
这样的命令从本地网络以低于 500 毫秒的延迟读取另一台 PC 上的视频
gst-launch-1.0 -v udpsrc port=5000 ! video/mpegts ! tsdemux ! h264parse ! avdec_h264 ! fpsdisplaysink sync=false
或
mpv udp://0.0.0.0:5000 --no-cache --untimed --no-demuxer-thread --video-sync=audio --vd-lavc-threads=1
所以有可能有这个延迟范围。
我想在 Android.
上做同样的事情
这是我的尝试。
Exoplayer
查看 Android studio 上可用的不同播放器后,Exoplayer 似乎是首选。
我尝试了 live-streaming 文档中指示的不同选项,但我总是以几秒钟开始的流和几秒钟的延迟结束。
我试图添加一个按钮来寻找 windows 的默认位置,但它会导致加载几秒钟。
DefaultExtractorsFactory extractorsFactory =
new DefaultExtractorsFactory()
.setTsExtractorFlags(DefaultTsPayloadReaderFactory.FLAG_IGNORE_AAC_STREAM);
player = new SimpleExoPlayer.Builder(this)
.setMediaSourceFactory(
new DefaultMediaSourceFactory(this, extractorsFactory))
.setLoadControl(new DefaultLoadControl.Builder()
.setBufferDurationsMs(DefaultLoadControl.DEFAULT_MIN_BUFFER_MS, DefaultLoadControl.DEFAULT_MAX_BUFFER_MS, 200, 200)
.build())
.build();
MyPlayerView playerView = findViewById(R.id.player_view);
// Bind the player to the view.
playerView.setPlayer(player);
// Build the media item.
MediaItem mediaItem = new MediaItem.Builder()
.setUri(Uri.parse("udp://0.0.0.0:5000"))
.setLiveMaxOffsetMs(500)
.setLiveTargetOffsetMs(0)
.setLiveMinOffsetMs(0)
.build();
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.setPlayWhenReady(true);
player.prepare();
//player.seekToDefaultPosition();
这个 issue 是关于同一个问题,结论是 Exoplayer 不适合这个用例。
I'll be honest, ultra low-latency like this isn't ExoPlayer's main use-case
Vlc
另一种尝试是使用 Vlc 库。
但是我无法获得与之前使用 Vlc 的两个播放器相同的低延迟流。
我尝试将 Vlc 的首选项更改为尽可能快地传输 here
Input/Codecs -> x264 preset: ultrafast - zerolatency
Input/Codecs -> Access Module: UDP input
Input/Codecs -> Clock Jitter: 500
Audio: disable audio
我也试过减少不同的缓冲区。
但是,我仍然有超过 1 秒的延迟。
Gstreamer
另一个尝试是创建一个 react-native 项目来使用这里可用的不同播放器。
一个看起来很有前途的播放器是 react-native-gstreamer,因为它使用能够以低延迟流式传输的 gstreamer(gst-launch 命令)。
但是图书馆现在已经过时了。
问题
还有其他尝试,但 none 成功了。
我的方法有问题吗?
如果没有,Android 上是否有播放器(我错过了)能够在 linux 上实现像 gstream 或 mpv 这样的低延迟流?
我不知道 Android 中的本地低延迟播放器。
但是,您可以在 Android Studio 中使用 WebView
,并在网络中使用播放器。
使用此解决方案,我使用 livecam.
将我电脑的网络摄像头流式传输到我的 phone(在本地网络中)
他们使用 websockets 逐帧传输视频,这并不理想。使用这种方法,我有 370 毫秒的延迟。
我希望能够将视频从我的网络摄像头流式传输到本地网络上延迟低于 500 毫秒的 Android 应用程序。
为了通过网络捕获和发送视频,我使用 ffmpeg。
ffmpeg -f v4l2 -i /dev/video0 -preset ultrafast -tune zerolatency -vcodec libx264 -an -vf format=yuv420p -f mpegts udp://192.168.1.155:5000
此命令将网络摄像头作为输入,将其转换并使用 mpegts 协议将其发送到设备。
这不是必需的,如果其他技术可行,我可以更改发送视频的方式。
我可以使用
这样的命令从本地网络以低于 500 毫秒的延迟读取另一台 PC 上的视频gst-launch-1.0 -v udpsrc port=5000 ! video/mpegts ! tsdemux ! h264parse ! avdec_h264 ! fpsdisplaysink sync=false
或
mpv udp://0.0.0.0:5000 --no-cache --untimed --no-demuxer-thread --video-sync=audio --vd-lavc-threads=1
所以有可能有这个延迟范围。
我想在 Android.
这是我的尝试。
Exoplayer
查看 Android studio 上可用的不同播放器后,Exoplayer 似乎是首选。
我尝试了 live-streaming 文档中指示的不同选项,但我总是以几秒钟开始的流和几秒钟的延迟结束。
我试图添加一个按钮来寻找 windows 的默认位置,但它会导致加载几秒钟。
DefaultExtractorsFactory extractorsFactory =
new DefaultExtractorsFactory()
.setTsExtractorFlags(DefaultTsPayloadReaderFactory.FLAG_IGNORE_AAC_STREAM);
player = new SimpleExoPlayer.Builder(this)
.setMediaSourceFactory(
new DefaultMediaSourceFactory(this, extractorsFactory))
.setLoadControl(new DefaultLoadControl.Builder()
.setBufferDurationsMs(DefaultLoadControl.DEFAULT_MIN_BUFFER_MS, DefaultLoadControl.DEFAULT_MAX_BUFFER_MS, 200, 200)
.build())
.build();
MyPlayerView playerView = findViewById(R.id.player_view);
// Bind the player to the view.
playerView.setPlayer(player);
// Build the media item.
MediaItem mediaItem = new MediaItem.Builder()
.setUri(Uri.parse("udp://0.0.0.0:5000"))
.setLiveMaxOffsetMs(500)
.setLiveTargetOffsetMs(0)
.setLiveMinOffsetMs(0)
.build();
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.setPlayWhenReady(true);
player.prepare();
//player.seekToDefaultPosition();
这个 issue 是关于同一个问题,结论是 Exoplayer 不适合这个用例。
I'll be honest, ultra low-latency like this isn't ExoPlayer's main use-case
Vlc
另一种尝试是使用 Vlc 库。
但是我无法获得与之前使用 Vlc 的两个播放器相同的低延迟流。
我尝试将 Vlc 的首选项更改为尽可能快地传输 here
Input/Codecs -> x264 preset: ultrafast - zerolatency
Input/Codecs -> Access Module: UDP input
Input/Codecs -> Clock Jitter: 500
Audio: disable audio
我也试过减少不同的缓冲区。
但是,我仍然有超过 1 秒的延迟。
Gstreamer
另一个尝试是创建一个 react-native 项目来使用这里可用的不同播放器。
一个看起来很有前途的播放器是 react-native-gstreamer,因为它使用能够以低延迟流式传输的 gstreamer(gst-launch 命令)。
但是图书馆现在已经过时了。
问题
还有其他尝试,但 none 成功了。
我的方法有问题吗?
如果没有,Android 上是否有播放器(我错过了)能够在 linux 上实现像 gstream 或 mpv 这样的低延迟流?
我不知道 Android 中的本地低延迟播放器。
但是,您可以在 Android Studio 中使用 WebView
,并在网络中使用播放器。
使用此解决方案,我使用 livecam.
将我电脑的网络摄像头流式传输到我的 phone(在本地网络中)
他们使用 websockets 逐帧传输视频,这并不理想。使用这种方法,我有 370 毫秒的延迟。