2016-04-20 3 views
0

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

ответ

1

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

+0

Я пробовал этот подход в своем приложении, и он работал для всех файлов, с которыми у меня были проблемы. Но в идеале NAudio справится с этим, да. Большое спасибо! –