如何用MediaComposition及Windows.Media.Transcoding将MP4音频转成16KHz单声道WAV?
提取MP4左声道并转码为符合Speech服务要求的WAV文件
当然可以实现!你遇到的CanTranscode=false问题,大概率是因为直接复用示例音频的MediaEncodingProfile时,没有明确告诉转码器只处理音频轨道,或者示例配置和源MP4的音频轨道存在兼容性冲突。下面是具体的解决步骤和代码示例:
核心思路
- 明确告诉转码器忽略视频轨道,只处理音频部分;
- 手动创建完全符合Microsoft Speech认知服务要求的音频编码配置(16KHz、单声道、PCM编码的WAV);
- 通过声道映射算法提取MP4中的左声道音频,转码为目标格式。
具体实现代码
1. 获取源MP4的媒体轨道信息
首先我们需要确认源文件中的音频轨道情况:
var sourceFile = SourceVideo.VideoFile; var sourceProperties = await MediaPropertiesRetrieval.GetMediaPropertiesAsync(sourceFile); var audioTracks = sourceProperties.AudioTracks; // 假设源文件的第一个音频轨道是我们需要处理的立体声轨道 if (!audioTracks.Any()) { // 处理无音频轨道的异常情况 return; }
2. 创建符合要求的MediaEncodingProfile
不要直接复用示例音频的profile,手动构建更可靠:
// 创建WAV格式的编码配置 var targetProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Auto); // 强制设置为16KHz采样率、单声道、PCM编码 targetProfile.Audio.Properties[MediaPropertyKeys.AudioSampleRate] = 16000; targetProfile.Audio.Properties[MediaPropertyKeys.AudioChannelCount] = 1; targetProfile.Audio.Subtype = MediaEncodingSubtypes.Pcm;
3. 配置转码器并执行转码
重点是忽略视频轨道,并且配置声道映射提取左声道:
var transcoder = new MediaTranscoder(); // 告诉转码器不处理视频轨道,避免因视频配置缺失导致转码失败 transcoder.VideoProcessingAlgorithm = MediaVideoProcessingAlgorithm.None; // 配置音频轨道选择:选择第一个音频轨道,并映射左声道到单声道 var targetAudioTrack = audioTracks.First(); var trackSelection = new MediaTrackSelection(targetAudioTrack); transcoder.AddAudioTrackSelection(trackSelection); // 使用声道混合器,只保留左声道(权重1.0),丢弃右声道(权重0.0) transcoder.AudioProcessingAlgorithm = MediaAudioProcessingAlgorithm.CreateChannelMixer( outputChannelCount: 1, channelMixingMatrix: new double[] { 1.0, 0.0 } ); // 准备转码并执行 var prepareResult = await transcoder.PrepareFileTranscodeAsync(sourceFile, tempFile, targetProfile); if (prepareResult.CanTranscode) { await prepareResult.TranscodeAsync(); // 转码成功,后续可将tempFile用于Speech认知服务的语音转文字 } else { // 查看失败原因,方便排查问题 var failureReason = prepareResult.FailureReason; var errorMessage = prepareResult.FailureReasonMessage; // 此处可添加日志记录或错误提示逻辑 }
关键注意点
- 为什么不用示例profile?:示例音频的profile可能包含与源MP4音频轨道不兼容的参数(比如编码格式、轨道数量),手动构建能确保完全匹配Speech服务的要求。
- 声道映射的作用:
CreateChannelMixer方法通过权重矩阵控制声道输出,[1.0, 0.0]表示将输入的左声道(第一个值)全量输出到单声道,右声道(第二个值)完全丢弃。 - 忽略视频轨道:因为目标是音频文件,转码器默认会尝试处理视频轨道,若没有指定视频输出配置就会导致转码失败,所以必须设置
VideoProcessingAlgorithm.None。
内容的提问来源于stack exchange,提问作者ei2kpi
相关产品推荐
相关产品推荐

