Корень проблемы в том, что все мои ogg имеют serial
, например, результат ogginfo
:
Note: Stream 1 has serial number 0, which is legal but may cause problems with some tools.
New logical stream (#1, serial: 00000000): type vorbis
Vorbis headers parsed for stream 1, information follows...
Version: 0
Vendor: ffmpeg
Channels: 1
Rate: 22050
Nominal bitrate: 35.333000 kb/s
Upper bitrate not set
Lower bitrate not set
Vorbis stream 1:
Total data length: 2048 bytes
Playback length: 0m:00.415s
Average bitrate: 39.435345 kb/s
Logical stream 1 ended
Для правильной конкатенации Ogg у нас должен быть уникальный serial
для каждого файла с правильным crc
. Я не нашел для этого существующих фрагментов JS (пожалуйста, не стесняйтесь комментировать / ответить вашим JS), только код C для нескольких сотен строк , который вы можете использовать на бэкэнде или скомпилировать в WASM (230K для сгенерированного JS и 59K для wasm
файла) - или я надеюсь, что кто-то перепишет его в JS - я не знаю C.
Исходное сообщение от Ральфа Джайлса в списке рассылки Ogg:
Обратите внимание, что если оба файла имеют одинаковый серийный номер, невозможно
найти точки, где они были объединены путем деления пополам, и большинство
инструменты предполагают, что они нашли все разделы, и рассчитывают
неправильная продолжительность Они все еще могут быть сыграны индивидуально, потому что
в конкретном случае границы конкатенации не найдено.
Если ogginfo показывает один и тот же серийный номер (00000000) для обоих ваших входов
потоки, это, вероятно, проблема. Muxers должен использовать
случайный серийный номер, чтобы сделать конфликты маловероятными. Вы можете исправить их,
переписать серийный номер, чтобы не было конфликтов. В основном вы
изменить поле serialno в заголовке каждой страницы ogg, а затем обновить
СУММЫ.
ОБНОВЛЕНИЕ: Это GIF с сериалами 11111111
и 22222222
- я думаю, что если мы получим Oggs из одного и того же источника в том же формате (например, AWS Polly) - возможно, будет гораздо проще изменить жестко закодированный позиции для серийных и crc32.
ОБНОВЛЕНИЕ: Да, установить уникальный серийный номер для каждого чанка Ogg (для всех «страниц» этого чанка) и установить правильный CRC32 (снова для всех страниц каждого Ogg), см. Документацию для Ogg и Страница Википедии ; также см. этот ответ о том, как собрать CRC32 . И не забывайте, что все гексы должны быть длиной 8 символов, поэтому const hex = crc.toString(16).padStart(8, '0')