Неправильный заголовок wav, сгенерированный sox

Я использовал sox для преобразования 2-канального, 48000 Гц, 24-битного wav-файла (new.wav) в монофонический wav-файл (post.wav). Вот соответствующие команды и выходные данные:

[Farmer@Ubuntu recording]$ soxi new.wav 
Input File     : 'new.wav'
Channels       : 2
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:01.52 = 72901 samples ~ 113.908 CDDA sectors
File Size      : 447k
Bit Rate       : 2.35M
Sample Encoding: 24-bit Signed Integer PCM

[Farmer@Ubuntu recording]$ sox new.wav -c 1 post.wav 
[Farmer@Ubuntu recording]$ soxi post.wav 

Input File     : 'post.wav'
Channels       : 1
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:01.52 = 72901 samples ~ 113.908 CDDA sectors
File Size      : 219k
Bit Rate       : 1.15M
Sample Encoding: 24-bit Signed Integer PCM

Это выглядит хорошо. Но давайте проверим заголовок post.wav:

[Farmer@Ubuntu recording]$ xxd post.wav | head -10
00000000: 5249 4646 9856 0300 5741 5645 666d 7420  RIFF.V..WAVEfmt 
00000010: 2800 0000 feff 0100 80bb 0000 8032 0200  (............2..
00000020: 0300 1800 1600 1800 0400 0000 0100 0000  ................
00000030: 0000 1000 8000 00aa 0038 9b71 6661 6374  .........8.qfact
00000040: 0400 0000 c51c 0100 6461 7461 4f56 0300  ........dataOV..

Это стандартная структура заголовка wav-файла.

Первая строка без проблем.

Вторая строка 2800 0000 показывает размер подчанка fmt, он должен быть 0x00000028 (так как это прямой порядок следования байтов) = 40 байт. Но есть 54 байта (перед подфрагментом fmt и подфрагментом данных).

Третья строка показывает, что ExtraParamSize равен 0x0018 = 22 байта. Но на самом деле это 36 байт (от 1600 третьей строки до 0100 5-й строки). Предыдущие 16 байтов являются стандартными.

Так что за лишние 36 байт?


person FarmerLi    schedule 26.06.2018    source источник
comment
Одна путаница может возникнуть из-за того, что xxd по умолчанию выводит обратный порядок байтов. Вам нужно указать переключатель -e, чтобы он отображал обратный порядок байтов. (подсказка: вы, вероятно, также хотите -g2 с -e)   -  person Thor    schedule 03.04.2019


Ответы (1)


Хорошо, я нашел ответ.
Посмотрите на вторую строку, мы можем обнаружить, что аудиоформат "feff", фактическое значение равно 0xFFFE, так что это не стандартный волновой формат PCM, а расширяемый формат.

Подробное введение в заголовок Wav можно найти по этой ссылке. Статья хорошо написана и спасибо автору.

Так как это формат wav, отличный от PCM, пространство фрагмента «fmt», занимающее 40 байт, не является проблемой, за которым следует фрагмент «fact», а затем фрагмент «data», так что все имеет смысл.

person FarmerLi    schedule 02.07.2018