Я работаю над потоковым mp3-плеером. Первоначально при создании AcmMp3FrameDecompressor я использовал первый кадр для определения формата волны в качестве демонстрационного шоу. Затем я понял, что некоторые файлы работают с неправильной скоростью (обычно медленнее). Я посмотрел на реализацию Mp3FileReader и обнаружил, что он решает между первым и вторым кадрами.NAudio выбрать подходящую рамку для AcmMp3FrameDecompressor
// 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. Или, возможно, можно создать отдельный декомпрессор для каждого кадра или подмножества кадров? Я попытался это сделать, но новый декомпрессор всегда возвращает пустые данные для первого декомпрессированного кадра.
Я пробовал этот подход в своем приложении, и он работал для всех файлов, с которыми у меня были проблемы. Но в идеале NAudio справится с этим, да. Большое спасибо! –