【问题标题】:Low latency video player on androidAndroid上的低延迟视频播放器
【发布时间】:2021-08-06 21:11:10
【问题描述】:

我希望能够在本地网络上将视频从我的网络摄像头流式传输到延迟低于 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 上也有同样的东西。

这是我的尝试。

外层播放器

查看了 Android Studio 上可用的不同播放器后,似乎 Exoplayer 是首选。
我尝试了live-streaming 文档中指出的不同选项,但我总是以几秒钟的时间启动流并且延迟几秒钟。
我尝试添加一个按钮来寻找窗口的默认位置,但这会导致加载几秒钟。

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 不适合这个用例。

老实说,像这样的超低延迟并不是 ExoPlayer 的主要用例

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,因为它使用能够以低延迟(gst-launch 命令)流式传输的 gstreamer。
但是这个库现在已经过时了。

问题

还有其他尝试,但都没有成功。
我的一种方法有问题吗?
如果没有,Android 上是否有一个播放器(我错过了)能够在 linux 上实现像 gstream 或 mpv 这样的低延迟流?

【问题讨论】:

    标签: android react-native video ffmpeg video-streaming


    【解决方案1】:

    我不知道 Android 中的原生低延迟播放器。
    但是,您可以在 Android Studio 中使用 WebView,并在网络中使用播放器。
    使用此解决方案,我使用livecam 将我的电脑的网络摄像头流式传输到我的手机(在本地网络中)。
    他们使用 websocket 逐帧传输视频,这并不理想。使用这种方法,我有 370 毫秒的延迟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多