解复用UDP / RTP多节目传输流

时间:2014-07-22 15:15:24

标签: audio video streaming directshow

我使用Directshow处理UDP / RTP多程序传输流。 我希望在单个图形中解码不同程序带来的音频通道。 如何配置解复用器以实现此目的?

使用GraphEdit,基本图形由:

组成

网络接收器---> MS解复用器---> PSI解析器

允许我查看与每个节目相关的节目列表和音频/视频频道。 如果我在PSI解析器属性中选择程序,音频和视频PID,则会呈现内容。 现在,如何在同一个图表中同时渲染来自不同程序的多个频道?

我试过了:

1)通过PSI解析器属性对话框。第一个配置正常,但是当我配置第二个音频/视频/程序时,旧的内容呈现将被新配置替换。使用此方法通过API构建图形会产生相同的结果:只有第一个配置有效。如果我添加其他引脚,只有在配置与第一个引脚相同时才能呈现内容。如果音频/视频PID属于不同的程序,则不会呈现它。

2)级联两个(或更多)Demux,配置第一个转发属于特定程序的数据包,第二个从收到的流中提取音频和视频。对于此配置,输出引脚媒体类型="传输流",映射到"传输数据包(完整)&#34 ;; PID是由PSI解析器识别的程序PID。 结果:图表运行,但我有一个黑色的窗口,没有音频。

请帮忙吗?

2 个答案:

答案 0 :(得分:0)

如何在demux之后添加tee过滤器,然后将多个解析器添加到tee的输出引脚?我认为这可能有用。

答案 1 :(得分:0)

我现在的方式是使用ffmpeg并生成多个输出。然后使用单独的FFmpeg实例分别编码这些流。唯一可能的问题是我使用Linux,这可能不适合其他操作系统。

这是主FFmpeg命令:

/usr/bin/ffmpeg -f mpegts -i "udp://@server_ip:8080?overrun_nonfatal=1&reuse=1" \
-map 0:p:1 -copyinkf -vcodec copy -acodec copy -f mpegts "udp://server_ip:8001" \
-map 0:p:2 -copyinkf -vcodec copy -acodec copy -f mpegts "udp://server_ip:8002" \
...
-map 0:p:10 -copyinkf -vcodec copy -acodec copy -f mpegts "udp://server_ip:8010"

然后你可以让单个FFmpeg实例运行如下:

/usr/bin/ffmpeg -i "udp://@server_ip:8001" -vcodec libx264 -acodec libmp3lame -f mpegts rtmp://other_server:port

希望这有助于让某人朝着正确的方向前进。我希望在我需要帮助时能够解释这一点。