Я работаю над потоковым 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. Или, может быть, можно создать отдельный декомпрессор для каждого кадра или подмножества кадров? Я пытался это сделать, но новый декомпрессор всегда возвращает пустые данные для первого распакованного кадра.