无法使用 klv-metadata 获取 mpegts 从 udpsrc 流向管道末端

Unable to get mpegts with klv-metadata to flow to end of pipe from udpsrc

提问人:Pasi Kähönen 提问时间:11/8/2023 最后编辑:Pasi Kähönen 更新时间:11/18/2023 访问量:92

问:

我已经与这个问题作斗争了很长一段时间。我有来自 udpsrc 的 klv-metadata 的 mpegts 流和下面的 gstreamer 命令来处理它并将其传递给 rtspclientsink。

   gst-launch-1.0 -e udpsrc address=224.1.1.1 reuse=true port=50088 socket-timestamp=1 buffer-size=100000000  ! 'video/mpegts, systemstream=(boolean)true, packetsize=(int)188' !
        queue max-size-time=1700000000 max-size-buffers=50 ! tsparse set-timestamps=true ! 
        tsdemux parse-private-sections=true ignore-pcr=true name=demux
        demux. ! queue max-size-time=0 max-size-buffers=0 ! decodebin use-buffering=true ! videoconvert ! videorate ! videoscale ! x264enc tune=zerolatency bitrate=5500 key-int-max=30 ! mpegtsmux name=mux
        demux. ! queue max-size-time=0 max-size-buffers=0 ! meta/x-klv ! mux. mux. ! rtspclientsink location=rtsp://127.0.0.1:8554/testpath 

如果我将 udpsrc 切换到 filesrc(https://samples.ffmpeg.org/MPEG2/mpegts-klv/< - 任何一个文件都应该工作),整个管道都可以正常工作。

但是在我将其切换到 udpsrc 后,我在 EOS 之后只获得了几帧 klv-data,其他时候我一直收到“WARNING: from element /GstPipeline:pipeline0/GstTSDemux:demux: CONTINUITY: Mismatch packet” 。

我使用了下面的ffmpeg命令将rtsp转发回udp

ffmpeg -i rtsp://127.0.0.1:8554/testpath -map 0 -c copy -f mpegts udp://224.1.1.1:50068

然后我使用下面的命令来收听上面的udp转发。

gst-launch-1.0 -v -e udpsrc address=224.1.1.1 reuse=true port=50068 ! 'video/mpegts, systemstream=(boolean)true, packetsize=(int)188' ! tsdemux name=demux demux. ! queue ! h264parse ! 'video/x-h264, stream-format=byte-stream, alignment=au' ! avdec_h264 ! autovideosink demux. ! queue ! 'meta/x-klv' ! fdsink

就像我说的,整个流程一开始就使用 filesrc,但使用 udpsrc 则不然。

非常感谢所有的帮助。 已经谢谢了。

编辑:我的假设是 ffmpeg 文件中的 klv 数据比我正在使用的文件(我无法共享)少得多,fdsink 管道不适用于它。但设法使用以下方法将数据写入文件

gst-launch-1.0 -e udpsrc address=224.1.1.1 port=50088 ! tsdemux name=demux demux. ! queue ! meta/x-klv ! filesink location=klv_output_night.bin

来自实际 UDP 流的 ffprobe

Input #0, mpegts, from 'udp://<multicast-addr:port>':
  Duration: N/A, start: 288.961000, bitrate: N/A
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
  Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280x722, 90k tbr, 90k tbn
  Stream #0:1[0xfc]: Data: klv (KLVA / 0x41564C4B)
Unsupported codec with id 98311 for input stream 1

以及用 tsduck 制作的流的 10 秒分析。

===============================================================================
|  TRANSPORT STREAM ANALYSIS REPORT                                           |
|=============================================================================|
|  Transport Stream Id: .......... 1 (0x0001)  |  Services: .............. 1  |
|  Bytes: ......................... 6,549,920  |  PID's: Total: .......... 5  |
|  TS packets: ....................... 34,840  |         Clear: .......... 5  |
|     With invalid sync: .................. 0  |         Scrambled: ...... 0  |
|     With transport error: ............... 0  |         With PCR's: ..... 1  |
|     Suspect and ignored: ................ 0  |         Unreferenced: ... 0  |
|-----------------------------------------------------------------------------|
|  Transport stream bitrate, based on ....... 188 bytes/pkt    204 bytes/pkt  |
|  User-specified: .......................... 5,185,598 b/s    5,626,926 b/s  |
|  Estimated based on PCR's: ................ 5,185,598 b/s    5,626,926 b/s  |
|  Selected reference bitrate: .............. 5,185,598 b/s    5,626,926 b/s  |
|-----------------------------------------------------------------------------|
|  Broadcast time: ................................... 10 sec (0 min 10 sec)  |
|-----------------------------------------------------------------------------|
|  Srv Id  Service Name                              Access          Bitrate  |
|  0x0001  Service01 .................................... C    5,034,525 b/s  |
|                                                                             |
|  Note 1: C=Clear, S=Scrambled                                               |
|  Note 2: Unless specified otherwise, bitrates are based on 188 bytes/pkt    |
===============================================================================

===============================================================================
|  SERVICES ANALYSIS REPORT                                                   |
|=============================================================================|
|  Global PID's                                                               |
|  TS packets: 1,015, PID's: 2 (clear: 2, scrambled: 0)                       |
|-----------------------------------------------------------------------------|
|     PID  Usage                                     Access          Bitrate  |
|   Total  Global PID's ................................. C      151,073 b/s  |
|   Subt.  Global PSI/SI PID's (0x00-0x1F) .............. C      151,073 b/s  |
|  0x0000  PAT .......................................... C      126,514 b/s  |
|  0x0011  SDT/BAT ...................................... C       24,559 b/s  |
|=============================================================================|
|  Service: 0x0001 (1), TS: 0x0001 (1), Original Netw: 0xFF01 (65281)         |
|  Service name: Service01, provider: FFmpeg                                  |
|  Service type: 0x01 (Digital television service)                            |
|  TS packets: 33,825, PID's: 3 (clear: 3, scrambled: 0)                      |
|  PMT PID: 0x1000 (4096), PCR PID: 0x0100 (256)                              |
|-----------------------------------------------------------------------------|
|     PID  Usage                                     Access          Bitrate  |
|   Total  Digital television service ................... C    5,034,525 b/s  |
|  0x00FC  MPEG-2 PES private data ...................... C        2,977 b/s  |
|  0x0100  AVC video (1280x722, high profile, level 4.0,  C    4,905,034 b/s  |
|  0x1000  PMT .......................................... C      126,514 b/s  |
|          (C=Clear, S=Scrambled, +=Shared)                                   |
===============================================================================

===============================================================================
|  PIDS ANALYSIS REPORT                                                       |
|=============================================================================|
|  PID: 0x0000 (0)                                                       PAT  |
|-----------------------------------------------------------------------------|
|  Global PID                Transport:                Discontinuities:       |
|  Bitrate: ... 126,514 b/s  Packets: ........... 850  Expected: ......... 0  |
|  Access: .......... Clear  Adapt.F.: ............ 0  Unexpect: ......... 0  |
|                            Duplicated: .......... 0  Sections:              |
|                                                      Unit start: ..... 850  |
|=============================================================================|
|  PID: 0x0011 (17)                                                  SDT/BAT  |
|-----------------------------------------------------------------------------|
|  Global PID                Transport:                Discontinuities:       |
|  Bitrate: .... 24,559 b/s  Packets: ........... 165  Expected: ......... 0  |
|  Access: .......... Clear  Adapt.F.: ............ 0  Unexpect: ......... 0  |
|                            Duplicated: .......... 0  Sections:              |
|                                                      Unit start: ..... 165  |
|=============================================================================|
|  PID: 0x00FC (252)                                 MPEG-2 PES private data  |
|  PES stream id: 0xFC (MPEG-7 metadata stream)                               |
|  Service: 0x0001 (1) Service01                                              |
|-----------------------------------------------------------------------------|
|  Single Service PID        Transport:                Discontinuities:       |
|  Bitrate: ..... 2,977 b/s  Packets: ............ 20  Expected: ......... 0  |
|  Access: .......... Clear  Adapt.F.: ........... 10  Unexpect: ......... 0  |
|                            Duplicated: .......... 0  PES:                   |
|                                                      Packets: ......... 10  |
|                                                      Inv.Start: ........ 0  |
|  Clock values range:                                                        |
|                            PTS: ................ 10                         |
|                            from ................. 0                         |
|                            to ................... 0                         |
|                            Leaps: ............... 0                         |
|=============================================================================|
|  PID: 0x0100 (256)                                               AVC video  |
|  PES stream id: 0xE0 (Video 0)                                              |
|  1280x722, high profile, level 4.0, 4:2:0                                   |
|  Service: 0x0001 (1) Service01                                              |
|-----------------------------------------------------------------------------|
|  Single Service PID        Transport:                Discontinuities:       |
|  Bitrate: . 4,905,034 b/s  Packets: ........ 32,955  Expected: ......... 0  |
|  Access: .......... Clear  Adapt.F.: .......... 353  Unexpect: ......... 0  |
|                            Duplicated: .......... 0  PES:                   |
|                            TSrate: .. 5,185,598 b/s  Packets: ........ 304  |
|                                                      Inv.Start: ........ 0  |
|  Clock values range:                                                        |
|  PCR: ................ 51  PTS: ............... 304                         |
|  from ....... 316,791,000  from ......... 1,052,910                         |
|  to ......... 584,766,000  to ........... 1,955,160                         |
|  Leaps: ............... 0  Leaps: ............... 0                         |
|=============================================================================|
|  PID: 0x1000 (4096)                                                    PMT  |
|  Service: 0x0001 (1) Service01                                              |
|-----------------------------------------------------------------------------|
|  Single Service PID        Transport:                Discontinuities:       |
|  Bitrate: ... 126,514 b/s  Packets: ........... 850  Expected: ......... 0  |
|  Access: .......... Clear  Adapt.F.: ............ 0  Unexpect: ......... 0  |
|                            Duplicated: .......... 0  Sections:              |
|                                                      Unit start: ..... 850  |
===============================================================================

===============================================================================
|  TABLES & SECTIONS ANALYSIS REPORT                                          |
|=============================================================================|
|  PID: 0x0000 (0)                                                       PAT  |
|-----------------------------------------------------------------------------|
|  0x00 (0, PAT), TID ext: 0x0001 (1)                                         |
|      Repetition: ...... 12  ms  Section cnt: ...... 850                     |
|      Min repet.: ....... 1  ms  Table cnt: ........ 850                     |
|      Max repet.: ...... 12  ms  Version: ............ 0                     |
|=============================================================================|
|  PID: 0x0011 (17)                                                  SDT/BAT  |
|-----------------------------------------------------------------------------|
|  0x42 (66, SDT Actual), TID ext: 0x0001 (1)                                 |
|      Repetition: ...... 61  ms  Section cnt: ...... 165                     |
|      Min repet.: ...... 61  ms  Table cnt: ........ 165                     |
|      Max repet.: ...... 62  ms  Version: ............ 0                     |
|=============================================================================|
|  PID: 0x1000 (4096)                                                    PMT  |
|  Service: 0x0001 (1) Service01                                              |
|-----------------------------------------------------------------------------|
|  0x02 (2, PMT), TID ext: 0x0001 (1)                                         |
|      Repetition: ...... 12  ms  Section cnt: ...... 850                     |
|      Min repet.: ....... 1  ms  Table cnt: ........ 850                     |
|      Max repet.: ...... 12  ms  Version: ............ 0                     |
===============================================================================
UDP RTSP gstreamer-1.0 MPEG2-TS klvdata

评论

0赞 Wayne 11/15/2023
我面临着类似的问题。我的一些观点: 注意:MPEG-TS 流中的 KLV 数据有两种主要格式:“异步”和“同步”。GstTsDemux (v1.16.3) 不支持同步。我不知道后来的版本,但在我查看当前代码时没有看到它。然后,有异步的变体。通常它可以工作,但我有一个示例异步 TS 流不能。您链接到的两个文件都是异步 KLV。如果我通过 UDP 流式传输它们,它们也可以正常工作。您的 UDP 流中有什么?
0赞 Pasi Kähönen 11/16/2023
“它们工作正常,如果我通过 UDP 流式传输它们也是如此。您的 UDP 流中有什么?“ 你的意思是,即使你正在收听文件流式传输的 udpsrc,gstreamer 管道也适合你?或者您可以通过 udp 流式传输文件并获取 klv 数据?对不起,这里有点偏头痛,所以:D跑得有点慢。因为我可以很好地将文件流式传输到 udp,但是问题就来了,使用我首先提供的 gstreamer 管道处理 udp 流。
0赞 Wayne 11/17/2023
我通过 UDP 流式传输文件,然后使用 gstreamer 管道对 udpsrc 进行解复用,以分离视频和 klv 文件。注意:klv 数据非常稀疏。日文件是 3 分 20 秒,只有 6 klv 包。晚上是 6 分 40 秒,只有 18 klv。因此,我需要在 filesink 上设置 buffer-mode=2,否则它会缓冲所有 klv,并且只有在我杀死它后才写入。此外,我还删除了您指定的所有属性和上限:gst-launch-1.0 -v udpsrc port=$STREAM_PORT ! tsdemux name=demux demux. ! queue ! 'video/x-h264' ! filesink location="video.ts" demux. ! queue ! 'meta/x-klv' ! filesink buffer-mode=2 location="klv.ts"
0赞 Wayne 11/17/2023
我不认为您拥有的属性和上限规格不好,只是没有必要。而且我不需要tsparse
0赞 Wayne 11/17/2023
所以,我想知道:您尝试处理的 UDP 流是否与测试文件具有相同的格式/结构?

答:

0赞 Wayne 11/17/2023 #1

MPEG-TS 流中的 KLV 数据有 2 种定义的格式:异步同步。当前的 gstreamer-plugins tsdemux 不支持 Synchronous。(我使用的是 v1.16.3,我相信从 v1.22 开始仍然如此)

您发布的测试文件包含异步 KLV。

PID: 0x01F1 (497) MPEG-2 PES private data | PES stream id: 0xBD

stream_id: 0xBD意味着异步 KLV。这两个流都可以由 gstreamer 使用 使用 处理,或者通过 udp 进行流式处理,并使用 摄取 。此管道的工作原理是:filesrcudpsrc

gst-launch-1.0 -v udpsrc port=$STREAM_PORT ! tsdemux name=demux demux. ! queue ! 'video/x-h264' ! filesink location="video.ts" demux. ! queue ! 'meta/x-klv' ! filesink buffer-mode=2 location="klv.ts"

您为 UDP 流发布的 tsduck 输出指示同步 KLV。

PID: 0x00FC (252) MPEG-2 PES private data PES stream id: 0xFC

stream id: 0xFC表示当前 tsdemux 不支持的同步 KLV。Michael Fien 有一个非常古老的补丁,用于将 Sync KLV 添加到 tsdemux:

https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/642

我希望代码会随着时间的推移而发展,所以不知道应用于当前的 tsdemux 代码有多难。我也不知道它有多强大。我自己也在做这件事,但我的项目时间非常有限。

另一种选择是使用 ffmpeg。它似乎适用于同步 KLV 流:

ffmpeg -i udp://$STREAM_IP:$STREAM_PORT -map 0:0 -codec copy -f data "video.ts" -map 0:1 -codec copy -f data "klv.ts"

评论

0赞 Pasi Kähönen 11/20/2023
感谢您的帮助。我想我需要看看你提到的补丁。那个 ffmpeg 并没有真正帮助,因为我仍然需要将其发布到 rtsp :( 。这就是为什么我切换到 gstreamer 希望让它工作的原因:/
0赞 Wayne 11/21/2023
顺便说一句,我将该补丁应用于 v1.16.3。有一点手动冲突解决。但是,编译后,它对我有用。
0赞 Pasi Kähönen 11/22/2023
有趣的是,原来我所需要的只是以下管道“gst-launch-1.0 -e udpsrc address=$STREAM_IP port=$STREAM_PORT reuse=true !稀疏!队列!rtspclientsink location=rtsp://$RTSP_IP:RTSP_PORT/$RTSP_PATH “ 就是这样,将 mpegts 流从 udp 转发到 rtsp。从字面上看,不小心掉到了它身上。
0赞 Wayne 11/23/2023
我误解了你的主要目标。是的,如果您不需要解复用,所有这些问题都可以避免。:)
0赞 Pasi Kähönen 11/23/2023
是的,我有点被误导了,因为最初通过解复用,这是我设法让任何 klv 流向 RTSP 的唯一方法,所以我认为这是唯一的方法。也找不到任何建议以任何其他方式这样做的东西。谈论艰难学习的东西:D我们在芬兰有这样一句话,大致翻译过来就是“先爬树屁股”,这句话确实:D但是,非常感谢您对此事的支持:)