You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中如何将WAV转xWMA用于XAudio2播放?Sink Writer相关疑问

在C#中使用Media Foundation Sink Writer将WAV转换为xWMA

基础说明

  • Sink Writer是**Windows Media Foundation(WMF)**的内置组件,无需单独下载,Windows Vista及以上系统默认自带,C#可通过互操作或NuGet包调用。
  • xWMA是适配XAudio2的流式音频格式,转换核心是借助WMF的WMA编码能力实现。

实现步骤

1. 依赖准备

直接通过NuGet包管理器安装MediaFoundation.Net或WindowsMediaFoundation,这些包封装了Media Foundation的原生API,省去手动编写大量P/Invoke代码的麻烦。

2. 核心转换代码示例

以下是可直接复用的基础转换逻辑,实现从WAV到xWMA的编码:

using MediaFoundation;
using MediaFoundation.ReadWrite;
using System;
using System.IO;

public class WavToXwmaConverter
{
    public void Convert(string inputWavPath, string outputXwmaPath)
    {
        // 初始化Media Foundation
        MFExtern.MFStartup(MFVersion.MF_VERSION);

        try
        {
            // 创建WAV文件的媒体源
            IMFMediaSource mediaSource;
            MFExtern.MFCreateSourceFromURL(inputWavPath, null, out mediaSource);

            // 获取输入音频的媒体类型
            IMFMediaTypeHandler typeHandler;
            mediaSource.GetMediaTypeHandler(out typeHandler);
            IMFMediaType inputType;
            typeHandler.GetCurrentMediaType(out inputType);

            // 配置输出xWMA的媒体类型
            IMFMediaType outputType = MFExtern.MFCreateMediaType();
            outputType.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio);
            outputType.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFAudioFormat.WMAudioV9);

            // 同步输入音频的采样率、通道数参数
            uint sampleRate;
            inputType.GetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, out sampleRate);
            outputType.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, sampleRate);

            uint channels;
            inputType.GetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, out channels);
            outputType.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, channels);

            // 创建Sink Writer并关联输出文件
            IMFSinkWriter sinkWriter;
            MFExtern.MFCreateSinkWriterFromURL(outputXwmaPath, null, null, out sinkWriter);

            // 添加流并绑定输入输出类型
            int streamIndex;
            sinkWriter.AddStream(outputType, out streamIndex);
            sinkWriter.SetInputMediaType(streamIndex, inputType, null);

            // 开始写入流程
            sinkWriter.BeginWriting();

            // 读取WAV数据并写入Sink Writer
            IMFMediaStream mediaStream;
            mediaSource.CreateStreamDescriptor(streamIndex, out _, out mediaStream);

            IMFMediaSample sample;
            while (mediaStream.ReadSample(MFStreamFlags.None, out sample, out _, out _, out _) == 0 && sample != null)
            {
                sinkWriter.WriteSample(streamIndex, sample);
                sample.Release();
            }

            // 完成编码并收尾
            sinkWriter.Finalize_();
        }
        finally
        {
            // 释放Media Foundation资源
            MFExtern.MFShutdown();
        }
    }
}

3. 关键注意事项

  • 项目平台需设置为x64或x86,Media Foundation不支持Any CPU模式。
  • 运行环境必须是Windows Vista及以上系统,且Media Foundation服务正常运行。
  • 输入WAV需为PCM编码格式,xWMA编码器仅支持PCM输入源。
  • 转换后的xWMA文件可直接通过XAudio2的CreateSourceVoice加载播放,XAudio2原生支持该格式的解码。

常见问题解决

  • 找不到Sink Writer相关API:确认已安装对应NuGet包,Sink Writer是WMF内置组件,不存在单独下载包。
  • 编码失败:检查输入WAV路径是否正确、输出路径是否有写入权限,或确认WAV为PCM编码。

内容的提问来源于stack exchange,提问作者XTankKiller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:58:34