我希望能够在我的本地网络上将视频从我的摄像头传输到一个延迟小于500 my的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协议将其发送到设备。
这不是一个要求,如果另一种技术可以工作,我可以改变我发送视频的方式。
我可以使用以下命令从本地网络读取另一台PC上的视频,延迟时间小于500 ms
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上做同样的事情。
这是我的尝试。
外挂机
在查看了Android工作室的不同播放器后,Exoplayer似乎是最佳选择。
我尝试了现场直播文档中指出的不同选项,但我总是以流的开始时间为秒而延迟为秒结束。
我试图添加一个Button以寻求窗口的默认位置,但结果是加载了几秒钟。
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();
这个问题是关于同样的问题,结论是Exoplayer不适合这个用例。
老实说,像这样的超低延迟不是ExoPlayer的主要用例
Vlc
另一个尝试是使用Vlc库。
但我无法拥有与前两个Vlc玩家相同的低延迟流。
我尝试更改Vlc的首选项,以尽可能快地按这里描述的速度进行流。
Input/Codecs -> x264 preset: ultrafast - zerolatency
Input/Codecs -> Access Module: UDP input
Input/Codecs -> Clock Jitter: 500
Audio: disable audio
我还试着减少不同的缓冲。
然而,我仍然有超过1秒的延迟。
流光器
另一种尝试是创建一个使用这里可用的不同玩家的反应本机项目。
一个看起来很有希望的玩家是反应-本机gstreamer,因为它使用的是gstreamer,它能够以低延迟(gst命令)进行流。
但是图书馆现在已经过时了。
问题
还有其他的尝试,但都没有成功。
我的方法有问题吗?
如果没有,在Android (我错过了)上是否有一个能够实现低延迟流的播放器,比如gstream或linux上的mpv?
发布于 2021-05-20 11:24:01
我不知道在Android中有一个本地的低延迟播放器。
但是,您可以在Android中使用WebView
,也可以在网络上使用播放器。
有了这个解决方案,我用利维康将我的个人电脑的摄像头传输到我的手机上(在本地网络中)。
他们使用websockets逐帧传输视频,这并不理想。用这种方法,我有370 ms的延迟。
https://stackoverflow.com/questions/67572522
复制相似问题