gstreamer-tsdemux 没有发现所有流
gstreamer-tsdemux is not discovering all streams
我需要使用 gstreamer 对流进行多路分解和多路复用(一切都在 CentOS 上使用版本 1.10.4 和 Ubuntu 上的 1.14.1 进行了测试)
这意味着我有一个输入 mpegts 流,需要输出一个带有 video/audio 的流和一个带有 klv 元数据的流。
如果我的输入流恰好包含这些元素(视频、音频和 klv 元数据流),一切都会按预期工作,我可以将我的 video/audio 和我的 klv 元数据发送到两个不同的 udp 接收器。
现在我们正在接收一个 mpegts 流,其中有额外的未知二进制流(我们对那些不感兴趣)。
这是 ffprobe
的输出
工作流
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 在遇到一个它无法处理的流时就停止寻找 streams/possible 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 流创建填充。
如果我们只看 ffprobe 的输出,流看起来是一样的,但我看 gstreamers 日志我注意到 klv 流有不同的 stream types.
工作流有 stream_type=0x06
而另一个流有 stream_type=0x15
.
检查维基百科上的流类型告诉:
- 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,我们必须自己编译它。
有什么办法可以成功获取klv流吗?
这真的是 tsdemux 所期望的行为吗?
编辑 2
似乎可以归结为同步与异步 klv,如 described by impleoTv.
其中同步流类型为0x15
,异步流类型为0x06
.
不幸的是,tsdemux 无法处理他们 mailing list and the unmerged patch in gitlab..
中描述的同步 klv 流
所以我可能需要看看 ffmpeg/libavformat 或者另一个 gstreamer 插件(如果存在)
正如我在问题中提到的,gstreamer 的 tsdemux 无法处理同步 KLV 数据。
这导致以下可能性
- 推出您自己的 gstreamer 插件
- help fixing tsdemux and have a look at the PR in their gitlab
- 使用 ffmpeg。我成功地用有问题的流测试了 ffmpeg。
由于我的 C 和 gstreamer 知识不足以继续前两个选项,我选择了第三个选项。
我需要使用 gstreamer 对流进行多路分解和多路复用(一切都在 CentOS 上使用版本 1.10.4 和 Ubuntu 上的 1.14.1 进行了测试)
这意味着我有一个输入 mpegts 流,需要输出一个带有 video/audio 的流和一个带有 klv 元数据的流。
如果我的输入流恰好包含这些元素(视频、音频和 klv 元数据流),一切都会按预期工作,我可以将我的 video/audio 和我的 klv 元数据发送到两个不同的 udp 接收器。
现在我们正在接收一个 mpegts 流,其中有额外的未知二进制流(我们对那些不感兴趣)。
这是 ffprobe
工作流
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 在遇到一个它无法处理的流时就停止寻找 streams/possible 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 流创建填充。
如果我们只看 ffprobe 的输出,流看起来是一样的,但我看 gstreamers 日志我注意到 klv 流有不同的 stream types.
工作流有 stream_type=0x06
而另一个流有 stream_type=0x15
.
检查维基百科上的流类型告诉:
- 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,我们必须自己编译它。
有什么办法可以成功获取klv流吗?
这真的是 tsdemux 所期望的行为吗?
编辑 2
似乎可以归结为同步与异步 klv,如 described by impleoTv.
其中同步流类型为0x15
,异步流类型为0x06
.
不幸的是,tsdemux 无法处理他们 mailing list and the unmerged patch in gitlab..
中描述的同步 klv 流
所以我可能需要看看 ffmpeg/libavformat 或者另一个 gstreamer 插件(如果存在)
正如我在问题中提到的,gstreamer 的 tsdemux 无法处理同步 KLV 数据。
这导致以下可能性
- 推出您自己的 gstreamer 插件
- help fixing tsdemux and have a look at the PR in their gitlab
- 使用 ffmpeg。我成功地用有问题的流测试了 ffmpeg。
由于我的 C 和 gstreamer 知识不足以继续前两个选项,我选择了第三个选项。