Speichern von audio-byte [], um eine wav-Datei
Wurden mit ein wenig Mühe in den letzten Tagen versucht, diese zu arbeiten. Aber was ich sagen will ist, wir haben eine Anwendung, die sendet roh-Daten über das Netzwerk. Dann Las ich diese Binärdaten in und möchten, speichern Sie es in wav(alle audio) Datei. Aussehen könnte bei der Kompression höher.
Also den problematischen code:
byte[] allBytes = ...
InputStream b_in = new ByteArrayInputStream(allBytes);
try
{
AudioFormat format = new AudioFormat(8000f, 16, 1, true, true);
AudioInputStream stream = new AudioInputStream(b_in, format, allBytes.length);
//AudioInputStream stream = AudioSystem.getAudioInputStream(b_in);
Haben versucht, die obige Aussage als gut, aber ich bekomme die Ausnahme: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from stream
. Also, was ich denke passiert, ist, dass, weil mein stream ist raw-audio-Daten und nicht über einen wave-header dies ist eine Ausnahme zu werfen?
File newPath = new File(SystemConfiguration.getLatest().voiceNetworkPathDirectory + currentPhoneCall.fileName);
if (!AudioSystem.isFileTypeSupported(Type.WAVE, stream))
{
Logger.error("Audio System file type not supported");
}
AudioSystem.write(stream, Type.WAVE, newPath);
Die Datei ist erfolgreich zu schreiben, aber es ist alles statische, brauche ich zum erstellen einer wave-header in die Ausgabe mit dem so etwas wie diese. Wenn ich mir den ausgegebenen wav-Datei in Editor, und es scheint, ein Kopf, Sie beginnt mit 'RIFF'.
Muss ich hinzufügen gefälschte header in mein input-stream? Sollte ich einfach meine eigenen Ausgabe-header und speichern Sie ihn einfach mit einem binären Schriftsteller?
- Etwas ist falsch mit Ihrem post. Sie sind fehlende Daten/formatieren.
- Wie etwa im Vergleich zu anderen gültigen WAVE-Dateien? Wenn Sie eines von Ihnen auswählen, kopieren der Daten nach dem header und dann die raw-Daten auf code, um das array allBytes. Nach der Ausführung Ihres Codes können Sie einfach vergleichen die 2 wave-Dateien. Wenn es nicht die selbe ist, dann ist entweder der code ist schlecht oder Sie brauchen, um zu verstehen, wave-format beter.
- die
length
argument im Konstruktor vonAudioInputStream
sollte eine frame-Länge-Wert anstelle der Daten die Länge.frame-length = data-length / channel / sample-size-in-byte
- Hallo Liu Yan. Ich habe versucht, den Rahmen der Länge, aber es machte es noch schlimmer. Es endete etwas wie nichts, außer den Kopf in die wav-Datei, wobei die binären Daten. Hätten Sie etwas dagegen, setzen Sie Klammern. ist es : frame-Länge = ( Daten-Länge / Kanal ) / sample-size-in-bytes oder frame-Länge = ( Daten-Länge * sample-size-in-bytes) / Kanal
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, ich landete immer es funktioniert, nicht wirklich sicher, warum, aber dies ist der code, der funktioniert:
So muss es gewesen meiner signed/unsigned/little-endian-Einstellungen. Was ich am Ende tun war das speichern der Daten in eine binäre Datei. Dann importieren Sie diese Datei als raw-Daten in audacity. Diese sagten mir alles, außer die rate, die ich schon neue.
Die einzige Frage, die ich jetzt haben, ist zu tun mit der Kopf-Berechnung. Ich Speichere die binären Daten, die generiert eine 4 Sekunden lange wav -, sondern es immer nur 2 Sekunden sound. Es ist, als wenn es berechnet mein header falsch. Ich bin mir nicht sicher, ob es hat zu tun mit der frame-Länge, die in LiuYan erwähnt.
Wenn ich ein array der Länge 160. Bedeutet das ich habe einen framelength von 10? 160 /1 /16.
Wenn ich dies Tue, dann habe ich nur store 10 bytes an Daten in meine Binär-Datei.
Es ist schwer zu wissen, aus Ihrer Beschreibung, wo der Fehler ist, aber um Ihre Fragen zu beantworten, wenn Sie sehen, 'RIFF', wenn Sie die Datei öffnen, dass bedeutet es hat einen header. Versuchen, erstellen Sie eine eigene header-möglich ist aber ein bisschen zeitaufwendig, (und unnötig, weil Sie einen haben).
Nun, beim Lesen, ist es am sichersten, das format aus der Datei selbst, anstatt zu versuchen, um dieses manuell einzugeben-das wird sein, weniger Fehler anfällig. Es gibt Beispielcode für das hier:
http://www.jsresources.org/examples/SimpleAudioPlayer.java.html
Beim schreiben, sagen Sie: "Die Datei ist erfolgreich zu schreiben, aber es ist alles statisch" - haben Sie bestätigt, dass Sie mit etwas anderen als Ihren eigenen java-code? Vielleicht bin ich nicht zu verstehen, richtig, aber es klingt wie Sie versuchen, die Aufzeichnung und Wiedergabe WAV-Dateien mit frischen java-code, und wenn das der Fall ist, ist es schwer zu sagen, wenn etwas schief geht mit der Aufnahme oder der Wiedergabe.
Beginnen sollte man mit einer Vanille-format (16BIT, stereo, unkomprimiert, 44,100 kHz), so dass Sie können öffnen Sie die Datei im media player oder quicktime oder so, und stellen Sie sicher, dass die Aufnahme funktionierte. Sobald das funktioniert, können Sie versuchen, ändern Sie den SR und so weiter. Hier finden Sie einige Beispiel-code für die Aufnahme. Starten Sie mit, stellen Sie sicher, dass es funktioniert, und bewegen Sie dann auf etwas komplexer:
http://www.jsresources.org/examples/SimpleAudioRecorder.java.html
Versuchen Sie, die Codierung und die frame-Größe und frame-rate AudioFormat.