FFMpegCore .Net处理WAV音频时截断开头约1.5秒问题求助
解决FFMpegCore转换WAV到PCM时开头截断1.5秒的问题
问题核心原因
你遇到的情况是:用FFMpegCore处理WAV转PCM时开头丢失约1.5秒,CLI用相同参数处理正常,MP3格式无异常,所有WAV格式都存在这个问题。本质是FFmpeg通过管道读取WAV时,自动检测格式的逻辑在流式场景下出错——WAV的头部包含采样率、声道等关键信息,管道流式读取时,FFmpeg可能把开头部分数据当作格式检测缓冲直接跳过;而CLI处理本地文件时能一次性读取完整头部,所以不会出现截断。
解决方案
1. 明确指定输入格式为WAV
在FromPipeInput中添加WithFormat("wav"),强制FFmpeg按WAV格式解析输入流,跳过自动检测步骤,避免开头数据被误判为检测缓冲:
public async Task<MemoryStream> ConvertToPcmStreamAsync(Stream inputStream) { // 确保输入流处于起始位置 inputStream.Position = 0; var outputStream = new MemoryStream(); var audioInput = new StreamPipeSource(inputStream); var audioOutput = new StreamPipeSink(outputStream); await FFMpegArguments .FromPipeInput(audioInput, options => options.WithFormat("wav")) .OutputToPipe(audioOutput, options => options .WithCustomArgument("-f s16le -acodec pcm_s16le -ac 1")) .ProcessAsynchronously(); outputStream.Position = 0; return outputStream; }
2. 可选:禁用输入缓冲
如果上述方法无效,给输入添加-avioflags direct参数,强制FFmpeg直接读取流数据,不做额外缓冲处理:
.FromPipeInput(audioInput, options => options .WithFormat("wav") .WithCustomArgument("-avioflags direct"))
3. 基础检查
调用转换方法前,务必确认输入流的Position属性为0——如果流已经被读取过,位置不在起始点,也会导致开头数据被跳过。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

