我正在开发 Android 应用程序
我在 rtsp 流(h265/hevc)中有传入视频源
源rtsp服务器有问题只允许一个连接
我想播放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控制,属性下降。
我面临的问题:
如果阀门正在下降(drop=false)。本地视频播放流畅实时。
如果我启动阀门(从java ui按钮到jni功能)。阀门启动,我在 Antmedia 服务器 获得流,流是 good 有 8 秒延迟。
但是在流式传输时本地显示视频开始滞后。由于帧中有很多运动,延迟会变得增加。
如果我停止直播到 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
需要帮助:
如果直播,本地视频延迟可能是什么原因
是否可以对发球台的每个分支使用单独的时钟
udpsink 上发送视频并在其他分支 udpsrc 上接收视频,然后流式传输到 rtmp 服务器,但 antmedia 服务器上的视频存在 故障。
我可以在这里使用的任何其他库。单连接,分流显示,同时推流到rtmp服务器
我想出了以下解决方案
管道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";
现在两条管道独立工作。不会造成时钟滞后。