nvidia nx平台 Gstreamer tcpserverink延迟2-3秒问题调试2
1. 前言
2. 测试结果
3. 使用同一个sdp文件
4. 分析
5. 用Windows Gstreamer库接收流
1. 前言
承接上篇
https://www.ebaina.com/articles/140000012900
2. 测试结果
使用gst-inspect-1.0 生效了
(1)gst-launch-1.0 videotestsrc in UDP
它工作得很好,大约20毫秒的延迟
(2)gst-launch-1.0 videotestsrc in TCP
必须指定NX的IP地址,
使用tcpclientsrc还是tcpserverrc:
gst-launch-1.0 tcpserversrc host=NX.Address.IP port=5000 !
'application/x-rtp,encoding-name=H264,payload=96'
! rtph264depay ! avdec_h264 ! xvimagesink sync=0
采集不到
发送pipeline(NX):
gst-launch-1.0 videotestsrc is-live=1
! video/x-raw,width=1280,height=720
! timeoverlay valignment=4 halignment=1
! nvvidconv ! 'video/x-raw(memory:NVMM),width=1280,height=720'
! tee name=t ! nvv4l2h264enc insert-sps-pps=1 idrinterval=15
! h264parse ! rtph264pay
! tcpserversink host=NX.Address.IP port=5000 sync=0 t.
! queue ! nvegltransform
! nveglglessink sync=0
(3)gst-launch-1.0 OpenCV in UDP
std::string gst_out = "appsrc
! video/x-raw,width=1920,height=1080
! videoconvert
! timeoverlay valignment=4 halignment=1
! nvvidconv ! 'video/x-raw(memory:NVMM),width=1920,height=1080'
! tee name=t
! nvv4l2h264enc insert-sps-pps=1 idrinterval=15
! h264parse ! rtph264pay
! udpsink host=PC.Address.IP port=5000 sync=0 t.
! queue ! nvegltransform ! nveglglessink sync=0
它工作的0-20ms延迟(计算与几张照片)注意到视频转换,
否则它不会推帧到管道
我也有一些帧都模糊了
这并不经常发生,
看来延迟来自tcpserverink。
现在传输工作得很好(我还把编码器从264改为265,质量高多了)。
我不能接收我的流与VLC使用
udp://@NX.Address.IP:PORT .
似乎我需要定义数据包大小,找不到哪些参数可以做到这一点。
3. 使用同一个sdp文件
设法使视频与UDP与Gstreamer在
一个应用程序与VLC与一个sdp文件,
但我现在有500ms的延迟,我使用相同的管道之前:
std::string gst_out = "appsrc
! video/x-raw,width=1920,height=1080
! videoconvert ! timeoverlay valignment=4 halignment=1
! nvvidconv
! video/x-raw(memory:NVMM),width=1920,height=1080
! tee name=t ! nvv4l2h265enc insert-sps-pps=1 idrinterval=15
! h265parse ! rtph265pay
! udpsink host=PC.Address.IP port=5000 sync=0 t.
! queue ! nvegltransform ! nveglglessink sync=0
sdp文件:
v=0
m=video #PORT RTP/AVP 96
c=IN IP4 192.168.1.21
a=rtpmap:96 H265/90000
能减少这个延迟吗?
不确定,但似乎在VLC中有缓冲机制。
它可能有助于运行在CBR +设置虚拟缓冲区大小。
它避免了I和P帧之间的突发比特率,
并可能在有限的网络带宽提供更好的稳定性。
例子如下:
如何设置:虚拟缓冲区大小
如何设置CBR模式?
num-buffers=XXX (src的属性)是虚拟缓冲区的大小?
$ gst-launch-1.0 filesrc location= park_joy_1080p50.y4m
! y4mdec ! nvvidconv ! nvv4l2h264enc
bitrate=14000000 control-rate=1 vbv-size=450000
! h264parse ! qtmux ! filesink location= park_joy.mov
$ gst-launch-1.0 filesrc location= park_joy_1080p50.y4m
! y4mdec ! nvvidconv ! nvv4l2h265enc
bitrate=14000000 control-rate=1 vbv-size=450000
! h265parse ! qtmux ! filesink location= park_joy_265.mov
安装/运行ffmpeg检查PSNR
$ gst-launch-1.0 filesrc location= park_joy_1080p50.y4m ! y4mdec ! filesink location=park_joy_50.yuv
$ sudo apt install ffmpeg
$ ffmpeg -i park_joy.mov -f rawvideo -video_size 1920x1080 -framerate 50 -i park_joy_50.yuv -lavfi "ssim;[0:v][1:v]psnr" -f null - ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
(...skip)
[Parsed_ssim_0 @ 0x55c102f010] SSIM Y:0.713943 (5.435473) U:0.732030 (5.719138) V:0.788833 (6.753741) All:0.729439 (5.677350)
[Parsed_psnr_1 @ 0x55c102eda0] PSNR y:24.882475 u:30.801891 v:34.448052 average:26.262739 min:22.971376 max:30.380294
4. 分析
VLC中似乎有缓冲机制
事实上,它看起来是这样的,
当我把之前的管道放入VLC时,
可以经常看到一些模糊的帧。
可以通过调整比特率和设置vbv大小来纠正。
现在可以使用UDP,现在有1-2秒的管道延迟:
std::string gst_out = "appsrc
! video/x-raw,width=1920,height=1080
! videoconvert ! timeoverlay valignment=4 halignment=1
! nvvidconv ! video/x-raw(memory:NVMM),width=1920,height=1080
! tee name=t
! nvv4l2h265enc EnableTwopassCBR=1 insert-sps-pps=1 idrinterval=2
bitrate=64000000 vbv-size=1600000 maxperf-enable=1
! h265parse ! rtph265pay config-interval=1 pt=96
! udpsink host=PC.Address.IP port=PORT sync=0 async=0 t.
! nvegltransform
! nveglglessink max-lateness=11000 sync=0";
尝试删除这些参数
max-late =11000, EnableTwopassCBR=1,
insert-sps-pps=1, idrinterval=2,
似乎对流没有任何影响
5. 用Windows Gstreamer库接收流
不使用VLC
用Windows Gstreamer库接收流
用udpsink有大约30毫秒的延迟。
如果有人想把它发送到VLC,
这里是一个适合我的管道,
但不能得到比1s延迟更好的:
std::string gst_out = "appsrc is-live=1
! video/x-raw, width=1920, height=1080
! videoconvert
! timeoverlay valignment=4 halignment=1
! nvvidconv ! video/x-raw(memory:NVMM), width=1920, height=1080
! tee name=t ! nvv4l2h265enc EnableTwopassCBR=1
insert-sps-pps=1 idrinterval=15 iframeinterval=1000
bitrate=64000000 vbv-size=1600000 maxperf-enable=1
preset-level=1 ! h265parse ! rtph265pay config-interval=1 pt=96
! udpsink host=IP.address port=PORTsync=0 async=0 t.
! nvegltransform
nveglglessink max-lateness=11000 sync=0";
接收端需要打开一个.sdp文件来读取该流。
调整码率有助于抑制帧的模糊
- 分享
- 举报
-
2021-07-30 17:04:37
-
浏览量:10795次2021-05-06 16:22:01
-
2021-05-06 16:03:00
-
浏览量:7123次2021-07-29 14:18:58
-
浏览量:7051次2021-05-20 16:37:42
-
浏览量:5247次2021-07-09 15:20:08
-
浏览量:5289次2021-08-05 13:59:50
-
浏览量:7407次2021-06-09 14:29:23
-
2021-04-27 16:19:04
-
浏览量:4621次2021-08-04 11:20:41
-
浏览量:5563次2021-08-05 13:55:51
-
浏览量:7124次2021-07-31 15:26:23
-
浏览量:7439次2021-05-20 17:08:14
-
浏览量:5180次2021-07-09 15:23:33
-
浏览量:4278次2021-07-22 14:48:32
-
浏览量:8542次2021-05-14 14:43:43
-
浏览量:9354次2021-04-27 17:56:41
-
浏览量:7370次2021-05-11 17:51:48
-
浏览量:9406次2021-05-26 14:17:15
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
free-jdx
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明