2015-02-22 2 views
2

Я использую DynamicSoundEffectInstance для потока в необработанных данных PCM. Эти данные 16 бит и подписываются. Мой код работает отлично, а не одна проблема. Проблема заключается в сжатии этого исходного PCM дает низкие результаты: 13.9mb до 13.7mb.Как преобразовать звук 8 бит в 16 бит

Если я кодирую данные PCM как 8-значные знаковые значения, а затем сжимаю их, результатом будет небольшой файл размером 5.24mb - это ок. 1mb меньше, чем файл Ogg.

Почему бы не просто использовать Ogg? Слишком много хлопот. Я не хочу никаких зависимостей и нуждаюсь в кросс-платформенной поддержке, а raw PCM отлично справляется с DynamicSoundEffectInstance.

Я понял, что мне нужно как-то вернуть 8-битные данные на 16 бит, чтобы XNA мог играть в нее. Здесь я потерялся. Я провел бесчисленные часы, глядя на то, как это сделать, но никуда не денусь. Нигде.

Как преобразовать 8-битный байт в 16-битное целое число? Convert.ToInt16 не помогает, и звук по-прежнему искажен глупостью.

Кто-нибудь знает простой способ сделать это, или я смотрю на это все неправильно? Можете ли вы не преобразовать 8 бит в 16 бит, как в отношении аудио?

EDIT: Вот некоторые ОЧЕНЬ шокирующие VB кода с использованием Convert.ToInt16. В массиве данных содержится 44 100 байт аудио.

Dim buffer((44100 * 2) - 1) As Byte ' place to dump 8-16bit data 
For i As Integer = 0 To data.Count - 1 ' data holds 8bit data 

    Dim aaa = Convert.ToInt16(data(i)) 
    Dim bb() As Byte = BitConverter.GetBytes(aaa) 

    buffer(i * 2) = bb(0) 
    buffer(i * 2 + 1) = bb(1) 
Next 

Это работает, хотя, Windows нуждается в системном томе на 100 даже слышать его, он по-прежнему еле слышно и полный статический.

+0

Для целей PCM, когда 8-разрядные образцы были декодированы (то есть у вас есть фактические 8-битные значения), преобразование в 16-битные выборки просто связано с изменением значения, оставшегося на 8 бит, например. 'x << = 8;' (убедитесь, что 'x' является« коротким »или более крупным шрифтом). Обратите внимание, что большая часть вашего «сжатия» на самом деле просто потому, что вы уменьшили вдвое размер выборки, что вдвое уменьшает размер данных за счет снижения отношения сигнал/шум в аудио. Если вам нужна дополнительная помощь, вам, вероятно, придется показывать какой-то фактический код. –

+0

Спасибо, Питер. Я новичок в аудио-материалах. Я приложил немного шокирующего кода. –

+0

Вы должны иметь возможность изменить инициализацию 'aaa' на' Convert.ToInt16 (data (i)) << 8'. Это устранит проблему с объемом. В зависимости от того, что вы подразумеваете под «статикой», оно должно также улучшить эти проблемы, но, как я уже говорил, вы теряете SNR, уменьшая вдвое размер выборки, поэтому после преобразования вы всегда будете больше шума, независимо от того, что еще вы делать. –

ответ

2

Основываясь на вашем примере кода, кажется, что осталось только оставить только 8-битные выборки, оставшиеся 8 бит, чтобы данные занимали самые значащие бит 16-разрядного образец.

т.е .:

Dim buffer((44100 * 2) - 1) As Byte ' place to dump 8-16bit data 

For i As Integer = 0 To data.Count - 1 ' data holds 8bit data 

    Dim aaa = Convert.ToInt16(data(i)) << 8 ' shift to most-significant-bits 
    Dim bb() As Byte = BitConverter.GetBytes(aaa) 

    buffer(i * 2) = bb(0) 
    buffer(i * 2 + 1) = bb(1) 
Next 

Вы можете все еще испытывают проблемы шума, так как вдвое размер выборки также половин отношение сигнал-шум.

Смежные вопросы