3

Я пытаюсь объединить 15 аудио-файлов WAV, записанных в формате 24-бит, 96 кГц, линейный PCM. Я провел эксперименты с ffmpeg, shntool и sox, с разными результатами.

Файлы были созданы рекордером Zoom H2n, который разделил ~ 15 часов непрерывной записи на несколько файлов (в режиме реального времени) для соответствия спецификации карты памяти SD.

Первые 14 файлов имеют размер 2 147 385 344 байта (1:02:08.04 по времени), а последний файл - 1 838 248 046 байт (53:11,35 по времени). Исходные файлы сообщают о скорости передачи данных 4608 кбит / с (используя ffmpeg -i).

Использование ffmpeg

Создайте текстовый файл с именами файлов:

printf "file '%s'\n" ./*.WAV > mylist.txt

Объединить файлы:

ffmpeg -f concat -i mylist.txt -c copy output-ffmpeg.wav

Это создает файл размером 31 901 151 444 байта, но со временем 53:08. ffmpeg -i сообщает о битрейте 80,049 кбит / с, что намного выше, чем первоначальные 4608 кбит / с.

Использование shntool

Присоединяйтесь к файлам:

shntool join -r none 01.wav 02.wav [etc]

Это создает файл, который составляет 31 901 151 386 байт - отличается от сцепления ffmpeg - но также сообщает как 53:08.16 по времени. Опять же, ffmpeg -i сообщает о битрейте 80,049 кбит / с, что намного выше, чем первоначальные 4608 кбит / с.

Используя Sox

Объединить файлы:

sox 01.wav 02.wav [etc] output-sox.wav

Это создает файл, который составляет 31 901 151 422 байта - отличается от ffmpeg и shntool - но сообщает как 01:02:08.26 во времени. ffmpeg -i сообщает о скорости передачи битов 68 452 кбит / с, что намного выше, чем исходные 4608 кбит / с, но отличается от конверсий ffmpeg или shntool.

Вопросы

1) Как я могу сделать так, чтобы файл отражал его фактическое время? Перенос этой записи со скоростью 31 Гб / ~ 15 часов в аудиопрограмму, которая считает, что она длится всего ~ 53 минуты, может быть проблематичной.

2) Почему три объединения отличаются по размеру файла? Есть ли флаг или настройка, которую я должен использовать, например, чтобы дополнить длину по какой-то причине? Являются ли файлы разных размеров ключом к пониманию того, почему файлы думают, что они имеют длину только 53:08 или 01:02:08?

Когда я впервые увидел 53:08, я подумал:«Ах, он записывает длительность окончательного файла в заголовок - но длительность окончательного файла на самом деле составляет 53:11». Когда я впервые увидел 01:02:08.26, я подумал:«Ах, он пишет продолжительность файла FIRST, но, к сожалению, нет (близко, но не точно).

Кажется, моя лучшая подсказка - неправильная (?) битрейт объединенных файлов. Я удивлен, что потоковая копия или конкатенация файлов изменяет это. Возможно, это просто ошибка метаданных?

1 ответ1

3

.wav - это формат файла RIFF (msdn)

Размер данных фрагмента RIFF хранится в 32 битах. (макс. значение без знака 4 294 967 295)

RIFF ограничен ~ 4,2 ГБ на файл.

Когда программное обеспечение создает очень большой блок RIFF, его размер сохраняется в 32-битном значении.

В какой-то момент происходит целочисленное переполнение и отбрасываются старшие биты числа:

Файл примера: 6,220 ГБайт / 3:00:00 / 96000 Гц / 24 бит / 2 канала / 4608 кбит / с

Real file size(hex):              01 72 C9 E0 86  (6 220 800 134)
Readed from RIFF header(hex) :       72 C9 E0 7E  (1 925 832 830)

Real file size(binary):            1 01110010 11001001 11100000 10000110  //33 bits
Readed from RIFF header(binary):     01110010 11001001 11100000 01111110  //32 bits

01 здесь опущена часть.

Отчет ffprobe:

Duration: 00:55:43.46, bitrate: 14884 kb/s
 Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, 2 channels, s32 (24 bit), 4608 kb/s

FFprobe неверная длительность / битрейт

FFprobe не может найти какие-либо метаданные в файле и пытается вычислить их на основе достоверных данных:

  1. Один поток с битрейтом: 4608 кбит / с (96000 Гц * 24 бита * 2 канала)
  2. Размер куска RIFF: 1 925 832 830 (верно, но неправильно: D)

Длительность будет (размер всего блока, деленный на битрейт):

1 925 832 830 / (4 608 000 / 8) = 3343.459 seconds

/ 8 потому что битрейт бит в секунду (один байт 8 бит)

3343.459 - это точно 00:55:43.459

(Средний?) Битрейт для всего файла - SizeOfFile / TotalSeconds:

6 220 800 134 / 3343,459 = 1860588,1316 байт / с (14884705,053 бит / с)


Как получить один большой файл?

Используйте другие форматы для хранения, например:

FLAC / .rf64 / .w64 / и т.д.

Чтобы объединить файлы с помощью ffmpeg(FFmpeg Wiki Page Concatenate):

ffmpeg -f concat -i mylist.txt -c:a flac output-ffmpeg.flac

где mylist.txt

file '/path/to/file1.wav'
file '/path/to/file2.wav'
file '/path/to/file3.wav'

Уже есть большой файл WAV?

Вы можете играть в это. Все. С приколом.
Мы установим размер блока данных RIFF равным 0 . Это вызовет некоторые (?) аудиоплееры для чтения всего блока данных (до конца файла ?).

Отчет FFprobe из отредактированного файла:

Duration: 03:00:00.00, bitrate: 4608 kb/s
 Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, 2 channels, s32 (24 bit), 4608 kb/s

ПРИМЕЧАНИЕ. Перезапись полного файла не требуется при сохранении файла в HEX-редакторе.

  1. Загрузите бесплатный редактор HEX (например, HxD)
  2. Сделать скриншот или копию помеченных байтов. (В качестве резервной копии)
  3. Заполните это с 00 .
  4. При использовании HxD: нажмите « save затем немедленно нажмите кнопку « Cancel (чтобы не создавать полную резервную копию)
  5. Открыто. (Проверено в VLC / MPC-HC . Но WMP не удалось: D)большой WAV в шестнадцатеричном редакторе


Также FLAC может конвертировать его используя опцию --ignore-chunk-sizes

Но FLAC выдаст ошибку, если.WAV имеет некоторые метаданные в конце файла.
Протестировано с Audacity. Проверяется с помощью HEX-редактора и находит метаданные в конце файла.

FLAC: ERROR: got partial sample
Но файл с длиной 2:59:59 секунд. И без контрольной суммы md5.
Это означает, что у нас нет истинного файла flac(чтение повреждено).
Но читабельно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .