在将WAVE文件作为二进制数据读取时,我从相应的字节(Subchunk2Size)中获取“数据”块的长度。
但是当我使用NAudio MediaFoundationReader时,我获得了不同的数据大小值,因为它的计算为:
private long GetLength(IMFSourceReader reader)
{
...
var lengthInBytes = (((long)variant.Value) * waveFormat.AverageBytesPerSecond) / 10000000L;
...
return lengthInBytes;
}
有没有办法获得NAudio MediaFoundationReader的确切数据长度?
答案 0 :(得分:0)
以下是我第一次提出的问题:使用List<Int32>
代替array
来存储数据,因此我现在不需要知道确切的数据长度。
下一个解决方案 - 使用MediaFoundationReader
将声音数据提取到temp wav文件,然后使用WaveFileReader
(和Length
属性)处理其数据。我在这里是怎么做到的:
private void ExtractAndResampleAudio(WaveFormat resampleFormat)
{
using (var reader = new MediaFoundationReader(this.Filename))
{
if (NeedResample(reader.WaveFormat, resampleFormat))
{
using (var resampler = new MediaFoundationResampler(reader, CreateOutputFormat(resampleFormat)))
{
WaveFileWriter.CreateWaveFile(this.TempFilename, resampler);
}
}
else
{
WaveFileWriter.CreateWaveFile(this.TempFilename, reader);
}
}
}
此解决方案有一个奇怪的副作用 - 在Windows 7上MediaFoundationReader
提取的数据略少。在Windows 8上复制的数据长度与源文件匹配。我已向NAudio项目发布了一个问题:https://naudio.codeplex.com/workitem/16453