2016-07-04 5 views
-1

Я работаю над проектом, в котором мне нужно объединить два 8-битных .wav-файла с использованием C и я до сих пор не знаю, как это сделать.О wav data sub-chunk

Я прочитал о wav-файлах, и я хочу начать с чтения одного из файлов.

Там одна вещь, которую я не понимаю:

Допустим, у меня есть 8bit WAV аудио-файл, и я был в состоянии прочитать (даже то я до сих пор пытаюсь) данные, которая начинается после 44 байта , Я получу число от 0 до 255 логически.

Мой вопрос:

Что означают эти цифры? Если я получаю 255 или 0, что они означают? Являются ли они образцами из волны?

Может ли кто-нибудь объяснить это?

Заранее спасибо

+0

Любое базовое руководство по WAV-формату объяснит это. У вас была проблема, связанная с программированием? –

+0

Да, мне тоже нужно руководствоваться программированием .. –

+0

Если вы не понимаете формат, как вы можете программировать что-нибудь полезное вокруг него? –

ответ

0

Предполагая, что мы не имеем дело с проблемами формата файла, получение значений между 0 и 255 означает, что образцы звука имеют неподписанный восьмибитовый формат, как вы выразились.
Одним из способов слияния данных будет чтение данных из файлов в буферы, массивы a и b и их суммирование по значению: c[i] = a[i] + b[i]. Поступая таким образом, вы должны позаботиться о следующем:

  • длина файлов не может быть равной
  • по подведению неподписанных 8-битовых буферов, таких, как ваш будет почти наверняка переполнение

Обычно это достигается с помощью петли for. Сначала вы получаете размеры кусков. Ваш цикл for должен быть записан таким образом, чтобы он не читал за границей массива и не игнорировал то, что можно прочитать. Для предотвращения переполнения вы можете:

  • значения делить на два на чтение

или

  • чтение (конвертировать) в формат, который бы не переполнение, а затем нормализовать и преобразовывать объединить данные обратно в исходный формат или в любой желаемый формат.

Для всех подробностей чтения и записи в файл формата .wav вы можете использовать некоторые существующие аудиофайлы или написать свою собственную программу. Однако обработка форматом аудиофайлов не является тривиальной. Вот ссылка на .wavformat.

Вот несколько аудио файлов API, стоит смотреть на:

libsndfile
sndlib

Надеется, что это может помочь.

+0

«Получение значений между 0 и 255 означает, что образцы звука имеют неподписанный восьмибитовый формат». OP уже сказал, что они тестируют 8-битный файл. Но то же самое было бы верно для _any_ файла, если читать в массив 'unsigned char'. (Что предпочтительнее простого 'char', поскольку последний определяется реализацией.) Это не обязательно означает, что данные действительно 8-битные. Формат должен быть проверен в заголовке и полученное в результате знание, используемое для восстановления образцов. –

+0

Я никогда не думал о формате файлов данных. Объяснение того, как писать универсальный API для чтения и обработки аудиофайлов, выходит за рамки ответа на любой совместимый с SO вопрос. Есть более или менее сложные API с открытым исходным кодом, которые конвертируют любой формат данных файла в формат целевых данных, но я не думаю, что это то, о чем говорит OP.Я считаю, что речь идет только о простейшем случае, @underscore_d. Спасибо за ваш вклад, тем не менее. (-: – user3078414

+0

Я не знаю, почему вы думаете, что я говорю о «универсальном API» или что-то еще. Я просто предопределяю очень вероятный следующий шаг, который OP может захотеть обработать 16-битный WAV-файл Затем они все равно будут видеть 8-битные байты в данных, но они не будут полезны до тех пор, пока не будут восстановлены в 16-битные выборки. Делать это не так сложно. Это все, что я имел в виду. Добро пожаловать! –

0

Смотрите любое хорошее руководство по WAVE для получения информации о формате образцов в порции данных, таких, как этот, я нашел: http://www.neurophys.wisc.edu/auditory/riff-format.txt

Соответствующие отрывки:

В одноканальном WAVE-файле образцы сохраняются последовательно. Для стерео WAVE-файлов, канал 0 представляет левый канал, а канал 1 представляет правый канал. Отображение положения динамиков для более , чем два канала, в настоящее время не определено. В многоканальных файлах WAVE образцы чередуются.

Формат данных из образцов

Каждый образец содержится в целое число я. Размер i - это наименьшее количество байтов, необходимых для хранения указанного образца . Сначала запоминается младший байт. Биты, которые представляют амплитуду выборки, сохраняются в наиболее значимых битах i, а остальные биты устанавливаются на ноль.

Например, если размер выборки (записанный в nBitsPerSample) равен 12 бит, то каждый образец хранится в двухбайтовом целом. Наименьшее значение значащих четырех бит первого (младшего значащего) байта устанавливается равным ноль.

Формат данных и максимальное и минимумы значение для сигнала PCM образцов различных размеров следующим образом:

Sample Size Data Format Maximum Value Minimum Value 

One to  Unsigned 255 (0xFF)  0 
eight bits integer 

Nine or  Signed  Largest  Most negative more bits 
integer i positive value of i 
      value of i 

NB: Даже если файл> 8 битых аудио разрешения, вы должны прочитать файл в виде массива unsigned char и создать более крупные образцы вручную в соответствии с приведенной выше спецификацией. Не делайте, попробуйте сделать что-нибудь вроде чтения образцов непосредственно над массивом родных C int s, так как их макет и размер зависят от платформы и поэтому не должны опираться ни на какой код.

Следует также отметить, что заголовок не гарантированно 44 байта длиной: How can I detect whether a WAV file has a 44 or 46-byte header? Вы должны прочитать длину и обработать заголовок, основываясь на том, что, не любое предположение.