4 votes

Concaténation de plusieurs fichiers audio wav 24 bits 96 kHz avec ffmpeg, shntool et sox

J'essaie de concaténer 15 fichiers audio wav, enregistrés en 24 bits, 96 kHz, PCM linéaire. J'ai fait des expériences avec ffmpeg, shntool, et sox, avec des résultats différents.

Les fichiers ont été créés par un enregistreur Zoom H2n, qui a divisé les ~15 heures d'enregistrement continu en plusieurs fichiers (en temps réel) pour s'adapter aux spécifications de la carte mémoire SD.

Les 14 premiers fichiers font chacun 2 147 385 344 octets (1:02:08.04 dans le temps) et le dernier fichier fait 1 838 248 046 octets (53:11.35 dans le temps). Les fichiers originaux ont un débit binaire de 4 608 kb/s (en utilisant ffmpeg -i).

Utilisation de ffmpeg

Créez un fichier texte avec les noms de fichiers :

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

Concaténer les fichiers :

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

Cela génère un fichier de 31 901 151 444 octets, mais qui n'indique que 53:08 dans le temps. ffmpeg -i indique un débit binaire de 80 049 kb/s, bien plus élevé que les 4 608 kb/s d'origine.

Utilisation de shntool

Joignez les dossiers :

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

Cela génère un fichier de 31 901 151 386 octets -- différent de la concaténation de ffmpeg -- mais qui indique également une durée de 53:08.16. Encore une fois, ffmpeg -i rapporte un débit binaire de 80 049 kb/s, bien plus élevé que les 4 608 kb/s d'origine.

Utilisation de Sox

Concaténer les fichiers :

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

Cela génère un fichier de 31 901 151 422 octets -- différent de celui de ffmpeg et de shntool -- mais qui indique 01:02:08.26. ffmpeg -i indique un débit binaire de 68 452 kb/s, bien plus élevé que les 4 608 kb/s d'origine mais différent des conversions de ffmpeg ou de shntool.

Questions

1) Comment puis-je faire en sorte que le fichier reflète l'heure réelle ? Introduire cet enregistrement de 31 Go / ~15 heures dans un logiciel audio qui pense qu'il ne dure que ~53 minutes risque d'être problématique.

2) Pourquoi les trois concaténations diffèrent-elles en termes de taille de fichier ? Existe-t-il un drapeau ou un paramètre que je devrais utiliser pour, par exemple, compléter la longueur pour une raison quelconque ? Les différences de taille de fichier sont-elles un indice de la raison pour laquelle les fichiers pensent qu'ils ne font que 53:08 ou 01:02:08 ?

Quand j'ai vu pour la première fois le 53:08, j'ai pensé, Ah, c'est l'écriture de la durée du fichier final dans l'en-tête -- mais la durée du fichier final est en fait 53:11. Quand j'ai vu la première fois le 01:02:08.26, j'ai pensé, Ah, c'est l'écriture de la durée du PREMIER fichier, mais malheureusement, non (proche, mais pas exact).

Il semble que mon meilleur indice soit le débit binaire incorrect ( ?) des fichiers concaténés. Je suis surpris qu'une copie de flux ou une concaténation de fichiers change cela. Peut-être s'agit-il simplement d'une erreur de métadonnées ?

3voto

befzz Points 401

.wav est un RIFF Format du fichier (msdn)

La taille des données du fragment RIFF est stockée sur 32 bits. (la valeur non signée maximale est de 4 294 967 295).

RIFF est limité à ~4.2 GBytes par fichier.

Lorsque le logiciel crée un très gros morceau RIFF, il stocke la taille en valeur 32 bits.

A un moment donné dépassement d'un nombre entier se produit et les bits supérieurs du nombre est abandonné :

Exemple de fichier : 6.220 GBytes / 3:00:00 / 96000 Hz / 24 bit / 2 canaux / 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 voici la partie abandonnée.

Rapport de 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 durée / débit erroné

FFprobe ne peut pas trouver de métadonnées dans le fichier et essaie de les calculer à partir des données suivantes sincère données :

  1. Un flux avec le débit binaire : 4608 kbit/s (96000 Hz * 24 bit * 2 chan)
  2. Taille des morceaux de RIFF : 1 925 832 830 (vrai, mais faux :D)

La durée sera (taille du morceau entier divisée par le débit binaire) :

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

/ 8 c'est parce que le débit binaire est bits par seconde (un octet correspond à 8 bits)

3343.459 est exactement 00:55:43.459

( Moyenne ? ) Le débit binaire pour l'ensemble du fichier est SizeOfFile / TotalSeconds :

6 220 800 134 / 3343.459 = 1860588.1316 Octet s/s ( 14884705.053 bit s/s )


Comment obtenir un gros fichier ?

Utilisez d'autres formats pour le stocker, comme :

FLAC / .rf64 / .w64 / Etc.

Pour concaténer des fichiers en utilisant ffmpeg( Concaténation de la page Wiki de FFmpeg ):

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

mylist.txt ist

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

Vous avez déjà un gros fichier WAV ?

Vous pouvez jouer il. Entier. Avec un tour.
Nous définirons la taille du fragment de données RIFF comme suit 0 . Cela provoquera des ( ?) les lecteurs audio lisent l'ensemble des données (jusqu'à la fin du fichier). ? ).

Rapport FFprobe à partir du fichier édité :

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

NOTE : La réécriture du fichier complet est pas nécessaire lors de l'enregistrement du fichier dans l'éditeur HEX.

  1. Télécharger un éditeur HEX gratuit (HxD par exemple)
  2. Faites une capture d'écran ou une copie des octets marqués (comme sauvegarde).
  3. Remplissez-le avec 00 .
  4. Si vous utilisez HxD : Appuyez sur save puis Cancel immédiatement (pour éviter de créer une copie de sauvegarde complète)
  5. Ouvrez. (Testé en VLC / MPC-HC . mais WMP a échoué :D) big wav in hex editor

FLAC peut également le convertir en utilisant option --ignore-chunk-sizes

Mais Le FLAC émettra une erreur si les fichiers .WAV ont une certaine métadonnées à la fin du fichier.
Testé avec Audacity. Vérifié avec l'éditeur HEX et trouvé des métadonnées à la fin du fichier.

FLAC : ERROR: got partial sample
Mais le fichier a une durée de 2:59:59 secondes. Et sans somme de contrôle md5.
Cela signifie que nous avons pas vrai fichier flac (lire corrompu ).
Mais lisible.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X