Что и как происходит кодирование необработанного (без заголовка) аудиофайла?

8

Я сделал это:

me@riverbrain:~/sgf$ echo "test" | text2wave -otype raw -F 16000 >> test.raw

который произвел аудиофайл без заголовка. Замечательная вещь в этом файле заключается в том, что его можно объединить (используя cat, например, текст) с другим необработанным аудиофайлом.

Конечно, у меня есть проблема. Проблема в том, что я пока не могу играть.

me@riverbrain:~/sgf$ play test.raw 

play FAIL formats: bad input format for file `test.raw': sampling rate was not specified

а также при указании частоты дискретизации

me@riverbrain:~/sgf$ play -r 16000 test.raw 
play FAIL formats: bad input format for file `test.raw': data encoding was not specified

Когда я посмотрел какую-то информацию «кодирования», у меня возникло ощущение, что это во многом связано с архитектурой вашего процессора, но, возможно, я ошибаюсь. Во всяком случае, я не могу найти никакой документации о том, как «спросить» компьютер, какова кодировка данных необработанного аудиофайла. И я также знаю, что такое частота дискретизации, из-за ее настройки, но это насколько я могу получить.

ixtmixilix
источник
2
Нет стандартного необработанного формата. Вам необходимо выяснить, какие параметры использовало приложение, которое его произвело. К сожалению, это не всегда хорошо документировано.
Жиль "ТАК - перестань быть злым"

Ответы:

8

Он может варьироваться, но, по крайней мере, для меня text2wave создает 1-канальный 16-разрядный целочисленный PCM со знаком. Это вполне нормально - и это будет очень ясно, когда вы их правильно сделаете (например, если вы по ошибке приписали целое число без знака, вы получите чрезвычайно искаженный звук)

С игрой это выглядит так:

play -r 16000 -b 16 -c 1 -e signed-integer /tmp/foo.raw
play -r 16000 -2 -s -c 1 /tmp/foo.raw # obsolete way for older versions of Sox

Подозреваю, что эти параметры настраиваются где-то в Фестивале. Некоторые из них также могут быть жестко закодированы.

Единственная архитектурно-зависимая вещь, с которой вы можете столкнуться - это big против little endian; на моей машине с прямым порядком байтов пишется little-endian; если бы я переместил этот файл на машину с прямым порядком байтов, мне, вероятно, нужно было бы добавить -L. Если бы text2wavони запускались на машине с прямым порядком байтов, я не уверен, что они будут записывать данные с прямым или прямым порядком байтов.

derobert
источник
благодарю вас. все эти ответы были великолепны, но это решение, которое я в итоге использовал.
ixtmixilix
2

Вы, вероятно, можете создать свой собственный заголовок RIFF. Немного избиения должно сделать это .. и просто присоединить заголовок к другим вашим частям ...

Эта ссылка показывает макет заголовка: формат файла Canonical WAVE

Существует также ссылка на SO: преобразование аудиоданных в формате RAW в WAV с использованием сценариев , но ответы mplayer / mencoder имеют нулевой счет разметки. Тем не менее, кажется, что SoX работает.

SoX упоминается в обеих вышеуказанных ссылках и доступен в репозитории Ubuntu; Я полагаю, что это в других тоже.

PS ... Я просто попытался использовать play(не знал, что он существует) и обнаружил, что это SoX! ... Ссылка SO дает пример, скопированный сюда:sox -r 44100 -e unsigned -b 8 -c 1 <RAW_FILE> <TARGET_FILE>

Если вы не можете заставить его работать с sox , возможно, mplayer / mencoder или заголовок RIFF помогут вам.

Peter.O
источник
2

Используйте aplayвместо playвоспроизведения необработанного файла, таким образом вы можете указать, что это необработанный звук, с помощью ключа -t:

aplay -q -c 2 -t raw -f s16 test.raw
neuron34
источник