Как получить точную длину волновых данных с помощью MediaFoundationReader?

При чтении файла WAVE в виде двоичных данных я получаю длину фрагмента данных из соответствующих байтов (Subchunk2Size).

Но когда я использую NAudio MediaFoundationReader, я получаю немного другое значение размера данных, потому что оно вычисляется как:

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

Есть ли способ получить точную длину данных с помощью NAudio MediaFoundationReader?


person Vladislav    schedule 11.09.2014    source источник
comment
Если вам нужна длина данных в байтах файла WAV, почему бы просто не использовать WaveFileReader от NAudio и посмотреть свойство Length?   -  person Mark Heath    schedule 11.09.2014
comment
Привет Марк, спасибо за вашу библиотеку. Я использую MediaFoundationReader, потому что хочу читать звук из как можно большего количества типов аудио и видео. И MediaFoundationReader делает свое дело.   -  person Vladislav    schedule 11.09.2014


Ответы (1)


Вот что я придумал впервые: используйте List<Int32> вместо array для хранения данных, так что теперь мне не нужно знать точную длину данных.

Следующее решение - извлечь звуковые данные во временный wav-файл с MediaFoundationReader и обработать его данные позже с WaveFileReaderLength свойством). Вот как я это сделал:

    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

person Vladislav    schedule 09.10.2014