NAudio выбирает правильный кадр для AcmMp3FrameDecompressor

Я работаю над потоковым mp3-плеером. Первоначально при создании AcmMp3FrameDecompressor я использовал первый кадр для определения формата волны, как показано в демо. Потом я понял, что некоторые файлы воспроизводятся с неправильной скоростью (обычно медленнее). Я посмотрел на реализацию Mp3FileReader и обнаружил, что она выбирает между первым и вторым кадрами.

// workaround for a longstanding issue with some files failing to load
// because they report a spurious sample rate change
var secondFrame = Mp3Frame.LoadFromStream(mp3Stream);
if (secondFrame != null &&
       (secondFrame.SampleRate != firstFrame.SampleRate ||
        secondFrame.ChannelMode != firstFrame.ChannelMode))
{
              ...
    firstFrame = secondFrame;
}

Я начал использовать тот же подход, и он решил проблему со скоростью воспроизведения. Позже я нашел кучу файлов, которые до сих пор не воспроизводятся корректно. Я расширил логику, чтобы рассмотреть третий кадр. Это решило еще несколько проблем, но, наконец, у меня возникла проблема, когда декомпрессор выдает NAudio.MmException: AcmNotPossible, вызывающий acmStreamConvert.

Я решил проанализировать все кадры исходного файла. Я создал декомпрессор с волновым форматом из каждого из первых 10 кадров mp3 и попытался распаковать весь файл. Вот результаты. Первый столбец — это номер кадра, используемый для инициализации декомпрессора, второй — количество успешно распакованных кадров, затем — свойства кадра.

0: decompressed: 6215 sample rate: 44100 Stereo      bitrate: 96000  
1: decompressed: 6215 sample rate: 44100 JointStereo bitrate: 128000
2: decompressed: 0    sample rate: 12000 DualChannel bitrate: 96000 
3: decompressed: 0    sample rate: 44100 Mono        bitrate: 224000
4: decompressed: 0    sample rate: 16000 Mono        bitrate: 24000 
5: decompressed: 6215 sample rate: 48000 DualChannel bitrate: 64000 
6: decompressed: 6215 sample rate: 44100 DualChannel bitrate: 96000 
7: decompressed: 0    sample rate: 48000 Mono        bitrate: 96000 
8: decompressed: 0    sample rate: 11025 JointStereo bitrate: 112000
9: decompressed: 6215 sample rate: 32000 JointStereo bitrate: 160000
10:decompressed: 6215 sample rate: 48000 JointStereo bitrate: 384000

Есть ли способ определить лучший кадр для этого? Я воспроизводю звук из потока, поэтому не могу прочитать весь файл и рассчитать средний битрейт, как это делает Mp3FileReader. Или, может быть, можно создать отдельный декомпрессор для каждого кадра или подмножества кадров? Я пытался это сделать, но новый декомпрессор всегда возвращает пустые данные для первого распакованного кадра.


person Vitaliy Gorbenko    schedule 20.04.2016    source источник


Ответы (1)


Я думаю, что это обложки альбомов, которые неправильно интерпретируются как действительные кадры MP3. В идеале код NAudio должен быть обновлен, чтобы искать, скажем, 10 последовательных кадров подряд с одинаковой частотой дискретизации и количеством каналов, прежде чем решить, что он нашел начало реального звука.

person Mark Heath    schedule 21.04.2016
comment
Я попробовал этот подход в своем приложении, и он работал для всех файлов, с которыми у меня были проблемы. Но в идеале NAudio справится с этим, да. Большое спасибо! - person Vitaliy Gorbenko; 21.04.2016
comment
@VitaliyGorbenko - согласен, стандартная практика, я также считаю, что NAudio должен включать эту фундаментальную функцию. Кто знает в эти дни от одного ручья к другому, какая дрянь в ручье. - person Rusty Nail; 17.01.2019