基于NAudio的NETCore平台任意音频转GSM格式的简便实现方法咨询
.NET Core 音频转GSM格式实现方案
前置依赖
安装NAudio NuGet包:
dotnet add package NAudio
注意:
MediaFoundationReader依赖Windows系统MediaFoundation组件,仅支持Windows平台运行,跨平台场景可替换为FFmpeg相关解码组件。
完整代码
using NAudio.Wave; using NAudio.MediaFoundation; public static bool ConvertToGsm(string sourcePath, string destPath) { try { // MediaFoundation初始化全局仅需执行一次,可迁移到程序启动逻辑 MediaFoundationApi.Startup(); using (var sourceReader = new MediaFoundationReader(sourcePath)) { // GSM编码器输入要求为16位、8kHz、单声道PCM,先做重采样 var targetPcmFormat = new WaveFormat(8000, 16, 1); using (var resampler = new MediaFoundationResampler(sourceReader, targetPcmFormat)) { // 生成标准GSM 6.10编码格式 var gsmFormat = WaveFormat.CreateCustomFormat( WaveFormatEncoding.Gsm610, 8000, 1, 1625, 65, 2 ); // PCM转GSM编码流 using (var conversionStream = new WaveFormatConversionStream(gsmFormat, resampler)) { // 写入目标WAV文件 WaveFileWriter.WriteWavFileToStream(destPath, conversionStream); } } } return true; } catch { // 可自行添加异常日志记录逻辑 return false; } }
关键说明
- 原代码中定义的
WaveFormat(8000, 8, 1)是8位无压缩PCM格式,不是标准GSM编码格式,需用WaveFormat.CreateCustomFormat生成GSM编码配置 - 所有IO、编码流都需要用
using包裹,避免资源泄漏导致文件被锁定 - 重采样是必须步骤:绝大多数源音频的参数不符合GSM编码器输入要求,必须先转成16位8kHz单声道PCM再做编码
- 全局仅需调用一次
MediaFoundationApi.Startup(),不需要每次转换都执行,可放到程序启动初始化逻辑中提升性能
跨平台适配
如果需要在Linux、macOS环境运行,可将解码和重采样逻辑替换为FFmpeg.AutoGen等跨平台音视频处理库,GSM编码转换逻辑可直接复用。
内容的提问来源于stack exchange,提问作者mordechai
相关产品推荐
相关产品推荐

