Concatenación de múltiples archivos de audio wav de 24 bits a 96 kHz usando ffmpeg, shntool y sox

3

Estoy tratando de concatenar 15 archivos de audio wav, grabados como PCM lineal de 24 bits, 96 kHz. He realizado experimentos con ffmpeg, shntool y sox, con diferentes resultados.

Los archivos fueron creados por una grabadora Zoom H2n, que dividió las ~ 15 horas de grabación continua en varios archivos (en tiempo real) para acomodar las especificaciones de la tarjeta de memoria SD.

Los primeros 14 archivos tienen 2,147,385,344 bytes (1: 02: 08.04 en tiempo) y el último archivo tiene 1,838,248,046 bytes (53: 11.35 en tiempo). Los archivos originales informan una tasa de bits de 4,608 kb / s (usando ffmpeg -i).

Usando ffmpeg

Cree un archivo de texto con los nombres de archivo:

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

Concatenar los archivos:

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

Esto genera un archivo que tiene 31,901,151,444 bytes, pero reporta solo 53:08 en el tiempo. ffmpeg -i informa una tasa de bits de 80,049 kb / s, mucho más alta que la original de 4,608 kb / s.

Usando shntool

Únete a los archivos:

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

Esto genera un archivo de 31,901,151,386 bytes, diferente de la concatenación de ffmpeg, pero también se informa como 53: 08.16 a tiempo. Nuevamente, ffmpeg -i informa una tasa de bits de 80,049 kb / s, mucho más alta que la original de 4,608 kb / s.

Usando Sox

Concatenar los archivos:

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

Esto genera un archivo que tiene 31,901,151,422 bytes, diferente de ffmpeg y shntool, pero se informa como 01: 02: 08.26 a tiempo. ffmpeg -i informa una tasa de bits de 68,452 kb / s, mucho más alta que la original de 4,608 kb / s pero diferente a las conversiones de ffmpeg o shntool.

Preguntas

1) ¿Cómo puedo hacer que el archivo refleje que es tiempo real? Llevar esta grabación de 31 Gb / ~ 15 horas al software de audio que cree que solo tiene una duración de ~ 53 minutos probablemente sea problemático.

2) ¿Por qué las tres concatenaciones difieren en el tamaño del archivo? ¿Hay una bandera o configuración que debería usar para, por ejemplo, rellenar la longitud por alguna razón? ¿Los diferentes tamaños de archivo son una pista de por qué los archivos piensan que solo tienen 53:08 o 01:02:08 de largo?

Cuando vi por primera vez el 53:08 pensé: Ah, está escribiendo la duración del archivo final en el encabezado, pero la duración del archivo final es en realidad 53:11. Cuando vi por primera vez el 01: 02: 08.26 pensé, Ah, está escribiendo la duración del PRIMER archivo, pero lamentablemente, no (cerca, pero no exacto).

Parece que mi mejor pista es la tasa de bits incorrecta (?) De los archivos concatenados. Me sorprende que una copia de flujo o concatenación de archivos cambie esto. ¿Quizás es solo un error de metadatos?

Michael J.
fuente
Sé que esto no es una respuesta, pero ¿qué pasa con simplemente lanzarlos a cualquier cosa, desde Audacity a Pro Tools, editarlos a tope y guardar el resultado?
Tetsujin
Bueno, podría ir a copiar / pegar, pero hay dos conjuntos de 15, y tendré que tener cuidado con la alineación precisa de los segmentos, por lo que llevará mucho tiempo. Sin embargo, es mi solución alternativa, ¡y posiblemente consuma menos tiempo que ejecutar los experimentos y escribir esta pregunta! :)
Michael J.
2
wav está limitado a 2/4 GBytes en.wikipedia.org/wiki/WAV#Limitations
antes del
1
Ok, esto funciona muy bien: "ffmpeg -f concat -i mylist.txt -c: a flac output-ffmpeg.flac" Duración: 15: 23: 03.94, velocidad de bits: 3198 kb / s, tamaño de archivo: 22,144,074,469. (Mac OS X, ffmpeg instalado a través de homebrew.) ¡Gracias @befzz!
Michael J.
1
Como eso funciona, usted o @befzz deben escribirlo como respuesta y aceptarlo, tal como está, está enterrado en los comentarios. ¡Y es una excelente pregunta con una respuesta (relativamente) simple que vale la pena compartir!
bertieb

Respuestas:

3

.waves un RIFF formato de archivo (msdn)

El tamaño de los datos del fragmento RIFF se almacena en 32 bits. (el valor máximo sin signo es 4 294 967 295)

RIFF está limitado a ~ 4.2 GBytes por archivo.

Cuando el software crea un fragmento RIFF muy grande, su tamaño de almacenamiento es de 32 bits.

En algún momento se produce un desbordamiento de enteros y se eliminan bits de número más altos :

Archivo de ejemplo: 6.220 GBytes / 3:00:00 / 96000 Hz / 24 bit / 2 canales / 4608 kbit / s

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 Aquí se deja caer parte.

informe 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

FF Sonda duración / velocidad de bits incorrecta

FFprobe no puede encontrar ningún metadato en el archivo e intenta calcularlo a partir de datos veraces :

  1. Una transmisión con velocidad de bits: 4608 kbit / s (96000 Hz * 24 bit * 2 chan)
  2. Tamaño del fragmento RIFF: 1 925 832 830 (verdadero, pero incorrecto: D)

La duración será (tamaño del fragmento entero dividido por la tasa de bits):

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

/ 8es porque la tasa de bits es bits por segundo (un byte es 8 bits)

3343.459 es exactamente 00: 55: 43.459

( ¿Promedio? ) La tasa de bits para todo el archivo es SizeOfFile / TotalSeconds:

2220800134 / 3343.459 = 1860588.1316 Byte s / s (14884705.053 bit s / s)


¿Cómo obtener un archivo grande?

Use otros formatos para almacenarlo, como:

FLAC / .rf64 / .w64 / Etc.

Para concatenar archivos con ffmpeg ( FFmpeg Wiki Page Concatenate ):

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

donde mylist.txtesta

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

¿Ya tienes un gran archivo WAV?

Puedes jugarlo . Todo. Con un truco.
Estableceremos el tamaño del fragmento de datos RIFF como 0. Esto hará que algunos (?) Reproductores de audio lean fragmentos de datos completos (¿hasta el final del archivo ? ).

Informe de FFprobe del archivo editado:

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

NOTA: No es necesario reescribir el archivo completo al guardar el archivo en el editor HEX.

  1. Descargue un editor HEX gratuito (HxD por ejemplo)
  2. Haga una captura de pantalla o una copia de los bytes marcados. (Como copia de seguridad)
  3. Llénalo con 00.
  4. Si se utiliza HxD: Prensa savecontinuación Cancelbotón inmediatamente (para evitar la creación de copia de seguridad completa)
  5. Abierto. (Probado en VLC / MPC-HC . Pero WMP falló: D) gran wav en editor hexadecimal


También FLAC puede convertirlo usando la opción --ignore-chunk-tamaños

Pero FLAC dejará caer un error si .WAV tiene algunos metadatos al final del archivo.
Probado con Audacity. Comprobado con el editor HEX y encontrado metadatos al final del archivo.

FLAC: ERROR: got partial sample
Pero archivo con 2:59:59 segundos de duración. Y sin md5 suma de comprobación.
Esto significa que no tenemos un archivo flac verdadero (lectura corrupta ).
Pero legible.

befzz
fuente