如何使用MediaFoundationReader获取波形数据的确切长度?

时间:2014-09-11 07:19:43

标签: naudio ms-media-foundation

在将WAVE文件作为二进制数据读取时,我从相应的字节(Subchunk2Size)中获取“数据”块的长度。

但是当我使用NAudio MediaFoundationReader时,我获得了不同的数据大小值,因为它的计算为:

    private long GetLength(IMFSourceReader reader)
    {
        ...
        var lengthInBytes = (((long)variant.Value) * waveFormat.AverageBytesPerSecond) / 10000000L;
        ...
        return lengthInBytes;
    }

有没有办法获得NAudio MediaFoundationReader的确切数据长度?

1 个答案:

答案 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