【问题标题】:Changing audio renderer endpoint while playing播放时更改音频渲染器端点
【发布时间】:2020-11-13 12:20:18
【问题描述】:

我正在使用 Microsoft Media Foundation 编写音频播放器。 我想知道是否可以在不重新创建会话的情况下更改播放设备?

IMFActivate *m_p_sink_activate;
...
m_p_sink_activate->SetString(MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, name_device);

如果音频已经在播放,这不会生效。

顺便说一句,Microsoft.Windows.SDK.Contracts (Windows.Media.Playback.MediaPlayer) 提供的媒体播放器做得很完美。 当我更改 m_mediaPlayer.AudioDevice 时,音频流会立即重定向到分配的设备。所以我想知道这是否也适用于 MSMF。

【问题讨论】:

    标签: c++ multimedia


    【解决方案1】:

    到目前为止,我有办法可以完成这项工作,

    1. 创建一个从前一个拓扑克隆的新拓扑。
    2. 使用 MFCreateAudioRendererActivate 创建新的音频渲染器,并使用带有新音频端点 ID 的设置字符串将其添加到拓扑节点;
    3. 将新节点添加到新拓扑中;
    4. 使用 IMFMediaSession::SetTopology() 设置要播放的新拓扑。

    您可以参考 MS 示例 TopoEdit 了解详细信息。

    一个副作用是每次 SetTopology 都会导致巨大的内存增长。

    【讨论】:

    • 感谢您的回答!那是很久以前的事了,我最终使用 ffmpeg + WASAPI 编写了自己的播放器
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2022-08-23
    • 2023-03-30
    相关资源
    最近更新 更多