我需要用gstreamer来解锁一个流(在CentOS上用1.10.4版和在Ubuntu上用1.14.1版进行测试)
这意味着我有一个输入mpegts流,需要输出一个带有视频/音频的流和一个带有klv元数据的流。
如果我的输入流完全由这些元素(视频、音频和klv元数据流)组成,那么一切都按预期工作,我可以将我的视频/音频和我的klv元数据发送到两个不同的udp接收器。
现在,我们正在接收一个mpegts流,其中包含额外的未知二进制流(我们对这些流不感兴趣)。
这是ff探头的输出
工作流
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)
附加流,不工作
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-added
和no-more-pads
。
对于工作流,gstreamer调用pad-added
三次(每个流一次),然后调用no-more-pads
一次。一切都如我所料。
对于非工作流,gstreamer调用pad-added
两次(对于前两个流),然后调用no-more-pads
一次。
当遇到一个它无法处理的流时,tsdemux似乎就停止寻找流/可能的pad。
我原以为它会继续寻找,直到没有更多的溪流。
编辑
我从gstreamer中添加了调试日志。
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上的流类型会告诉:
ITU-T Rec. H.222 and ISO/IEC 13818-1 (MPEG-2 packetized data) privately defined (i.e., DVB subtitles/VBI and AC-3)
Packetized metadata
不太确定我该怎么想。
不幸的是,这个输入流不在我们的控制之下,所以我们不能改变它。
如果我们想使用更新版本的gstreamer,我们必须自己编译它。
我们能做些什么来成功地获得克里夫流吗?
这真的是tsdemux想要的行为吗?
编辑2
它似乎归结为同步和异步的由impleoTv描述。
其中同步流类型为0x15
,异步流类型为0x06
。
不幸的是,tsdemux无法像它们的邮寄名单和gitlab中未合并的修补程序。所描述的那样处理同步的klv流。
因此,我可能需要看看ffmpeg/libavformat,或者可能是另一个gstreamer插件(如果存在的话)
发布于 2020-08-13 06:17:51
正如我在问题中已经提到的,gstreamer的tsdemux无法处理同步KLV数据。
这将导致以下可能性
由于我的C和gstreamer知识远远不够,无法继续使用前两个选项,所以我选择了第三个选项。
https://stackoverflow.com/questions/63298585
复制相似问题