Android Gstreamer 启动 rtmpsink 后本地显示视频滞后

问题描述 投票:0回答:1

我正在开发 Android 应用程序

  1. 我在 rtsp 流(h265/hevc)中有传入视频源

  2. 源rtsp服务器有问题只允许一个连接

  3. 我想播放rtsp流并串流到rtmp服务器(antmedia)。

    简单视图如下

    [rtsp server] ---> [split] ---> [display]
                               L--> [rtmp stream]
    

目前进展:

我使用了gstreamer及其教程3代码并修改其管道如下

data->pipeline = gst_parse_launch ("rtspsrc location=rtsp://<local_server_ip>:8554/main.265 latency=50 udp-reconnect=1 timeout=5000000 ! tee name=t t. ! queue ! parsebin sink-caps=\"video/x-h265,width=1280,height=720,stream-format=hvc1\" ! decodebin3 ! autovideosink  sync=false t. ! valve drop=true name=liveStrmValve ! queue max-size-buffers=0 silent=true ! parsebin sink-caps=\"video/x-h265,width=1280,height=720,stream-format=hvc1\" ! avdec_h265 ! videoscale ! videorate ! video/x-raw,width=1280,height=720,framerate=25/1 ! x264enc speed-preset=ultrafast tune=zerolatency ! h264parse ! queue ! flvmux streamable=true skip-backwards-streams=true ! rtmpsink location=\"rtmp://<server_ip>/LiveApp/<key> live=true\" sync=false async=false", &error);

其中流式传输由阀门名称=liveStrmValve控制,属性下降。

我面临的问题:

  1. 如果阀门正在下降(drop=false)。本地视频播放流畅实时。

  2. 如果我启动阀门(从java ui按钮到jni功能)。阀门启动,我在 Antmedia 服务器 获得流,流是 good 有 8 秒延迟。

  3. 但是在流式传输时本地显示视频开始滞后。由于帧中有很多运动,延迟会变得增加

  4. 如果我停止直播到 rtmp 服务器(valve drop=true)。 滞后视频开始快速播放并匹配实时提要并顺利工作。

安卓:

armeabi-v7a
minSdk 25
targetSdk 33
ndkVersion '21.3.6528147'

Gstreamer:gstreamer-1.0-android-universal-1.22.6

我的实现:

  • 我正在获取rtsp流编码h264/hevc。我在创建管道之前通过更改等级使用了硬件解码器。这只是为了在 autovideosink

    上显示视频源

    三通t。 ->parsebin ->decodebin3 ->autovideosink

  • 对于将视频流传输到服务器,我有 tee split 流。然后解码

    t。 -> h265解码 -> 视频速率+缩放 -> 编码h264 -> 解析 -> flvmix -> rtmpsink

gstreamer 的一些错误和警告:

After pipe start
w : ../gst-libs/gst/video/video-info.c:762:gst_video_info_to_caps invalid matrix 0 for RGB format, using RGB

w : ../libs/gst/base/gstaggregator.c:2146:gst_aggregator_query_latency_unlocked:<flvmux0> Latency query failed

w : amcvideodec-omxqcomvideodecoderhevc0: Too old frames, bug in decoder -- please file a bug

w : ../gst-libs/gst/video/gstvideodecoder.c:3154:gst_video_decoder_prepare_finish_frame:<amcvideodec-omxqcomvideodecoderhevc0> decreasing timestamp (0:00:00.056677084 < 0:00:03.382351466)

After stream start
e : :0: Could not find ref with POC 54
w : ../gst-libs/gst/video/video-info.c:201:validate_colorimetry Need to specify a color matrix when using YUV format (I420)
w : ../gst-libs/gst/video/video-info.c:516:gst_video_info_from_caps invalid colorimetry, using default

需要帮助:

  1. 如果直播,本地视频延迟可能是什么原因

  2. 是否可以对发球台的每个分支使用单独的时钟

  3. 我尝试在

    udpsink 上发送视频并在其他分支 udpsrc 上接收视频,然后流式传输到 rtmp 服务器,但 antmedia 服务器上的视频存在 故障

  4. 有没有

    我可以在这里使用的任何其他库。单连接,分流显示,同时推流到rtmp服务器

android stream video-streaming gstreamer-1.0
1个回答
0
投票

我想出了以下解决方案 管道1(主管道展示视频)

String RtspH264Url= "rtspsrc location=" + CameraSettingParameter.getRtspURL() + // camera RTSP Url " latency=100 udp-reconnect=1 " + "timeout=5000000 wait-for-keyframe=1 name=rtspSrc ! " + "rtpjitterbuffer drop-on-latency=true " + "latency=100 ! parsebin " + "sink-caps=\"video/x-h264,width=1280,height=720,stream-format=byte-stream\" ! " + "tee name=t t. ! queue ! decodebin3 ! autovideosink name=video-sink sync=false " + "t. ! queue ! tcpserversink port=5002 sync=true ";
现在我在 tpc 端口 5002 上获取视频

管道 2(将视频流传输到服务器)

String streamingH264Url = "tcpclientsrc port=5002 ! " + "capsfilter caps=\"video/x-h264, " + "media=(string)video," + "clock-rate=(int)90000, " + "width=(int)1280, " + "height=(int)720," + "framerate=30/1, " + "payload=(int)96, " + "encoding-name=(string)H264, " + "stream-format=(string)byte-stream\" ! " + "queue " + "max-size-buffers=600 " + "max-size-time=90000000000 ! " + "decodebin ! " + "videoconvert ! " + "videoscale ! " + "videorate ! " + "video/x-raw," + "width="+ videoWidth +","+//1280 "height="+ videoHeight+","+ //720 "framerate="+String.valueOf(CameraSettingParameter.getFrameRate())+"/1 ! " + "x264enc speed-preset=ultrafast " + "tune=zerolatency ! " + "h264parse ! " + "flvmux streamable=true ! " + "rtmpsink location=\""+ streamingServerUrl +" live=true\" sync=false";
现在两条管道独立工作。不会造成时钟滞后。

© www.soinside.com 2019 - 2024. All rights reserved.