首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gstreamer-tsdemux并没有发现所有的流。

gstreamer-tsdemux并没有发现所有的流。
EN

Stack Overflow用户
提问于 2020-08-07 09:01:41
回答 1查看 957关注 0票数 0

我需要用gstreamer来解锁一个流(在CentOS上用1.10.4版和在Ubuntu上用1.14.1版进行测试)

这意味着我有一个输入mpegts流,需要输出一个带有视频/音频的流和一个带有klv元数据的流。

如果我的输入流完全由这些元素(视频、音频和klv元数据流)组成,那么一切都按预期工作,我可以将我的视频/音频和我的klv元数据发送到两个不同的udp接收器。

现在,我们正在接收一个mpegts流,其中包含额外的未知二进制流(我们对这些流不感兴趣)。

这是ff探头的输出

工作流

代码语言:javascript
运行
复制
Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1088, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x101]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 128 kb/s
Stream #0:2[0x102]: Data: klv (KLVA / 0x41564C4B)

附加流,不工作

代码语言:javascript
运行
复制
Stream #0:0[0x12c]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x12d]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 256 kb/s
Stream #0:2[0x5]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:3[0x262]: Data: bin_data (FBID / 0x44494246)
Stream #0:4[0x258]: Data: klv (KLVA / 0x41564C4B)

正如你所看到的,两条未知的溪流出现在klv流之前。

我已经注册了tsdemux回调pad-addedno-more-pads

对于工作流,gstreamer调用pad-added三次(每个流一次),然后调用no-more-pads一次。一切都如我所料。

对于非工作流,gstreamer调用pad-added两次(对于前两个流),然后调用no-more-pads一次。

当遇到一个它无法处理的流时,tsdemux似乎就停止寻找流/可能的pad。

我原以为它会继续寻找,直到没有更多的溪流。

编辑

我从gstreamer中添加了调试日志。

代码语言:javascript
运行
复制
mpegtsbase mpegtsbase.c:532:mpegts_base_program_add_stream:[00m pid:0x0005, stream_type:0x006
mpegtsbase mpegtsbase.c:557:mpegts_base_program_add_stream:[00m PID 0x0005, registration_id 00000000 (....)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x0a in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x6a in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x7a in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x56 in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:532:mpegts_base_program_add_stream:[00m pid:0x0262, stream_type:0x006
mpegtsbase mpegtsbase.c:557:mpegts_base_program_add_stream:[00m PID 0x0262, registration_id 46424944 (FBID)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x0a in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x6a in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x7a in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x56 in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:532:mpegts_base_program_add_stream:[00m pid:0x0258, stream_type:0x015
mpegtsbase mpegtsbase.c:557:mpegts_base_program_add_stream:[00m PID 0x0258, registration_id 4b4c5641 (KLVA)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x0a in stream 0x0258 (stream_type 0x15)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0258 (stream_type 0x15)
tsdemux tsdemux.c:1639:create_pad_for_stream:[00m Non-media stream (stream_type:0x15). Not creating pad

看起来,tsdemux确实看到了所有的流,但不知怎么拒绝为klv流创建一个衬垫。

如果我们只查看ff探头的输出--流看起来是相同的,但是我看gstreamers日志--我注意到klv流有不同的流类型

工作流具有stream_type=0x06,而另一个流具有stream_type=0x15

检查wikipedia上的流类型会告诉:

  • 0x06 = ITU-T Rec. H.222 and ISO/IEC 13818-1 (MPEG-2 packetized data) privately defined (i.e., DVB subtitles/VBI and AC-3)
  • 0x15 = Packetized metadata

不太确定我该怎么想。

不幸的是,这个输入流不在我们的控制之下,所以我们不能改变它。

如果我们想使用更新版本的gstreamer,我们必须自己编译它。

我们能做些什么来成功地获得克里夫流吗?

这真的是tsdemux想要的行为吗?

编辑2

它似乎归结为同步和异步的由impleoTv描述

其中同步流类型为0x15,异步流类型为0x06

不幸的是,tsdemux无法像它们的邮寄名单gitlab中未合并的修补程序。所描述的那样处理同步的klv流。

因此,我可能需要看看ffmpeg/libavformat,或者可能是另一个gstreamer插件(如果存在的话)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-13 06:17:51

正如我在问题中已经提到的,gstreamer的tsdemux无法处理同步KLV数据。

这将导致以下可能性

由于我的C和gstreamer知识远远不够,无法继续使用前两个选项,所以我选择了第三个选项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63298585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档