Comment puis-je combiner/fusionner deux fichiers wav en un fichier wav?
Comment puis-je fusionner deux fichiers wav à l'aide de java?
J'ai essayé cette mais il ne fonctionne pas correctement, c'est leur toute autre façon de faire?
- Comment ne pas fonctionner correctement? Quel est le problème?
- Le fichier de résultat sont trop court. Vous devez considérer que chacun des fichiers que j'essaie de fusionner prend 1 sec ou même moins. C'est peut-être la cause.
- Ainsi, chaque fichier est de 1 seconde ou moins? Le maximum de la durée de la chanson sera de 2 secondes alors? N'est-ce pas ce que le vôtre est en train de faire?
- Je pense que je sais ce qui est le problème. Comment puis-je ajouter 1 sec (ou plus) de audio vide entre ces deux fichiers?
Vous devez vous connecter pour publier un commentaire.
Si vous travaillez avec les octets d'un fichier wav directement, vous pouvez utiliser la même stratégie dans tout langage de programmation. Pour cet exemple, je vais assumer les deux fichiers ont le même débit/numchannels et sont de la même longueur.
(si non, vous pouvez probablement les modifier avant de commencer la fusion).
Premier coup d'oeil sur l'wav specificaiton, j'ai trouvé un bon à une stanford site internet du cours:
En-tête commun des longueurs de 44 ou 46 octets.
Si vous voulez concaténer deux fichiers (c'est à dire jouer un wav puis l'autre dans un seul fichier):
créer un nouveau fichier et le bâton de l'un des en-têtes de dans que.
nouveau fichier wav = {header} = {44/46} octets de long
ajouter les deux parties des données à partir des fichiers originaux
nouveau fichier wav = {en-tête + données 1 + 2 } = {44/46 + taille(data1) + taille(data2)} octets de long
modifier votre tête à deux endroits afin de refléter la nouvelle longueur du fichier.
un. modifier les octets 4+4 (ie. 4 octets commençant à l'offset 4).
La nouvelle valeur doit être un nombre hexadécimal représentant la taille du nouveau fichier wav en octets {44/46 + taille(data1) + taille(data2)} - 8bytes.
b. modifier les octets 40+4 ou 42+4 (les 4 octets commençant à l'offset 40 ou 42, selon si vous avez un 44byte en-tête ou de 46 octets d'en-tête).
La nouvelle valeur doit être un nombre hexadécimal représentant le total de la taille du nouveau fichier wav. ie {44/46 + taille(data1) + taille(data2)}
Si vous voulez, au lieu de fusionner ou de mélanger les deux fichiers (afin qu'ils jouent tous les deux en même temps à l'époque):
de départ à l'octet 44/46 vous aurez à modifier chaque échantillon à la valeur données1 + la valeur données2.
ainsi par exemple, si votre taux d'échantillonnage était de 8 bits, vous modifiez 1 octet, si votre taux d'échantillonnage a été 16bits, vous modifiez 2 octets.
le reste du fichier est juste des Échantillons de 1/2bytes stocker un int valeur qui représente la forme d'onde du son de l'époque.
un. Pour chacun des échantillons restants dans le fichier de saisir la 1/2 octet hex chaîne et obtenir la valeur int à partir de deux fichiers de données data1 et data2.
b. ajouter la 1/2 octets entiers ensemble
convertir le résultat en hexadécimal et utiliser cette valeur dans le fichier de sortie.
c. Vous avez normalement à diviser ce nombre par 2 pour obtenir une valeur moyenne qui s'adapte à l'arrière à l'original 1/2byte bloc de l'échantillon. J'ai été faire de la distorsion quand je l'ai essayé en objc(probablement lié à l'signé ou non signé ints) et simplement ignoré la division de la partie puisqu'il ne peut être un problème si vous êtes à la fusion des sons très forts ensemble.
c'est à dire quand data1 + 2 est plus grand que 1/2 octets, le son clip. Il y avait une discussion sur le problème de clipping ici et vous pouvez essayer l'une de ces techniques de détourage.
De fusion implique le mélange, mais il semble que vous dire de concaténation ici.
Pour concaténer avec le silence dans le milieu, vous devez insérer un nombre de trames de silence dans le fichier. Un silence cadre est celui où chaque canal a un "0" - si vous utilisez signé des échantillons de ce qui est littéralement un 0, pour non signé, il est maxvalue/2.
Chaque image aura un échantillon pour chaque canal. Donc, pour générer une seconde de silence en format CD, vous insérez 44100 (hz) * 2 (canaux par image) = 88200 16 bits signé ints avec une valeur de 0 chaque. Je ne suis pas sûr de savoir comment accéder au fichier raw abstrait par l'Java audio abstractions, mais que les données à insérer.