UDP 视频流从 FFMPG 到 gstreamer

UDP 视频流从 FFMPG 到 gstreamer

硬件:Jetson AGX ORIN
软件:Jetpack 5.0.2

我一直尝试使用 ffmpeg 通过 UDP 发送视频文件:

ffmpeg -stream_loop -1 -re -i test.ts -map 0 -c copy -preset ultrafast -f mpegts "udp://127.0.0.1:5000"

并使用 gstreamer 通过 UDP 接收相同的流:

gst-launch-1.0 udpsrc port=5000 ! application/x-rtp, media=video, clock-rate=90000, encoding-name=H264 ! rtph264depay ! decodebin ! videoconvert ! aasink

但是在接收 gstreamer 端出现错误:

/GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0: Could not decode stream.
Additional debug info:
gstrtpbasedepayload.c(505): gst_rtp_base_depayload_handle_buffer (): 
/GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0:
Received invalid RTP payload, dropping
ERROR: from element /GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0:
The stream is in the wrong format.
Additional debug info:
gstrtph264depay.c(1298): gst_rtp_h264_depay_process ():
/GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0:
NAL unit type 27 not supported yet

有关视频文件的更多详细信息:

Original ID: 1002
Codec: H264 - MPEG-4 AVC (part 10) (h264)
Type: Video
Video resolution: 1920x1080
Buffer dimensions: 1920x1088
Frame rate: 30
Decoded format: 
Orientation: Top left
Chroma location: left

当我使用命令 gst-launch-1.0 -v udpsrc port=5000 ! fakesink dump=1 进行监听时,很明显接收到了来自 FFMPEG 的数据包。
我不确定为什么 gstreamer 的 rtph264depay 说流的格式错误。

我是否需要检查 FFMPEG 方面的一些细节?这是 FFMPEG 在运行时默认显示的信息。

Input #0, mpegts, from 'test.ts':
  Duration: 00:00:57.36, start: 20902.827056, bitrate: 2504 kb/s
  Program 1
    Stream #0:0[0x3ea]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Output #0, mpegts, to 'udp://127.0.0.1:5000':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 90k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=  611 fps= 30 q=-1.0 Lsize=    5847kB time=00:00:20.62 bitrate=2323.0kbits/s speed=   1x
video:5350kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 9.301388%

任何意见,将不胜感激。

答案1

问题解决了。
继续阅读以查看故障排除步骤或跳至最后的 TLDR。


export GST_DEBUG=*FACTORY*:4后来会获取调试信息来查看正在使用哪些插件。
然后我运行了这个接收管道:
gst-launch-1.0 uridecodebin uri="udp://127.0.0.1:5000" ! fakesink

调试信息表明 gstreamer 选择生成的管道是这样的:
gst-launch-1.0 udpsrc port=5000 ! tsdemux ! multiqueue ! h264parse ! nvv4l2decoder ! fakesink

我对其进行了调整以更好地满足我的需求,并增加了时钟频率以减少卡顿。
gst-launch-1.0 udpsrc uri="udp://127.0.0.1:5000" ! video/mpegts, systemstream=true, clock-rate=90000 ! tsdemux ! queue ! h264parse ! avdec_h264 ! videoconvert ! aasink


TLDR;
为了完成这项工作,我可以做以下两件事之一:

  • 在接收 gstreamer 管道中不使用 rtp depayloader
  • 确保发送 ffmpeg 管道正在发送 rtp 数据包

相关内容