【问题标题】:demultiplexing UDP/RTP multi program transport streams解复用 UDP/RTP 多节目传输流
【发布时间】:2014-07-22 15:15:24
【问题描述】:

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

使用GraphEdit,组成的基本图:

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

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

我试过了:

1) 通过 PSI 解析器属性对话框。第一个配置没问题,但是当我配置第二个音频/视频/节目时,旧的内容渲染被新的配置所取代。使用这种方法通过 API 构建图形会带来相同的结果:只有第一个配置有效。如果我添加其他引脚,我只能在配置与第一个引脚相同的情况下呈现内容。如果音视频 PID 属于不同的程序,则不渲染。

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

你能帮忙吗?

【问题讨论】:

  • 我认为您必须手动配置 demux 过滤器。 (不使用 psi 解析器)。

标签: audio video streaming directshow


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我现在的做法是使用 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
    

    希望这有助于将某人引向正确的方向。我希望在我需要帮助时能简单地解释一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2017-11-27
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2012-07-12
      相关资源
      最近更新 更多