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?
Respuestas:
.wav
es unRIFF
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)
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 :
01
Aquí se deja caer parte.informe ffprobe:
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 :
La duración será (tamaño del fragmento entero dividido por la tasa de bits):
/ 8
es 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:
¿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 ):
donde
mylist.txt
esta¿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:
00
.save
continuaciónCancel
botón inmediatamente (para evitar la creación de copia de seguridad completa)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.
fuente