Wave PCM fichier de stéréo à mono
J'ai un fichier audio stéréo. Est convertir en mono juste une affaire de sauter tous les autres octets (après l'en-tête)? Il est codé en 16 bits signé au format PCM. J'ai javax.sound.sampled
disponibles.
Voici le code que j'ai essayé cela ne fonctionne pas:
WaveFileWriter wfw = new WaveFileWriter();
AudioFormat format = new AudioFormat(Encoding.PCM_SIGNED, 44100, 16, 2, 2, 44100, false);
AudioFormat monoFormat = new AudioFormat(Encoding.PCM_SIGNED, 44100, 16, 1, 2, 44100, false);
byte[] audioData = dataout.toByteArray();
int length = audioData.length;
ByteArrayInputStream bais = new ByteArrayInputStream(audioData);
AudioInputStream stereoStream = new AudioInputStream(bais,format,length);
AudioInputStream monoStream = new AudioInputStream(stereoStream,format,length/2);
wfw.write(monoStream, Type.WAVE, new File(Environment.
getExternalStorageDirectory().getAbsolutePath()+"/stegDroid/un-ogged.wav"));
Ce code est utilisé après la lecture d'un .ogg
fichier à l'aide de Jorbis pour le convertir en données PCM. Le seul problème est que le résultat est stéréo et j'ai besoin d'être mono, donc si il y a une autre solution, je suis heureux de l'entendre!
OriginalL'auteur fredley | 2011-01-17
Vous devez vous connecter pour publier un commentaire.
Presque vous souhaitez ignorer tous les autres échantillon, pas d'un octet. Dans votre cas, il ressemble chaque échantillon est de taille 16 bits = 2 octets. Si vous voulez prendre 2 octets, sauter 2 octets, prendre 2 octets, et ainsi de suite.
Cela ressemble à la juste écrire de la première moitié du fichier au lieu d'écrire tous les autres échantillons. Aussi, vous devez fixer le WAV en-tête, pour spécifier un canal unique (voir votre
monoFormat
).OriginalL'auteur BrokenGlass
Prendre un coup d'oeil à ce code. Il m'a aidé quand j'avais besoin de jouer avec les octets dans un fichier wav.
OriginalL'auteur user489041
De répondre à cette en 2018. J'ai une situation similaire, et a réalisé une flagrante erreur que j'ai faite. Votre "format" paramètres " dans l'argument du constructeur ne sont pas correct.
Le cinquième paramètre (dans votre cas, le deuxième "2") représente la taille de l'image. Taille de l'image = taille de l'Échantillon * les Canaux. Parce que votre profondeur de bits est de 16, votre taille de l'échantillon est de 2 octets.
La taille de l'échantillon = 2
Canaux = 2
Taille de l'image = Taille de l'Échantillon * les Canaux = 4
Donc, votre ligne de code devrait lire
Aussi, avez-vous essayé d'utiliser le FormatConversionProvider?
https://docs.oracle.com/javase/tutorial/sound/converters.html
Ce tutoriel m'a aidé un tas, mais je crois qu'il suppose que vous avez déjà importé ladite classe.
Je n'ai pas vu ces solutions postées sur ce fil, mais peut-être que vous avez déjà pensé à elle. En tout cas, espérons que cette aide!
Haha, j'ai pensé, mais peut-être que cette réponse va aider quelqu'un à sa recherche dans l'avenir. Je suis content que vous avez compris. Ça peut être un mal de tête. Je suis encore tout à fait le bébé à la programmation, mais j'aime à penser que je suis quelque part.
OriginalL'auteur David Boudreaux