在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
相关产品推荐
相关产品推荐

