###前提・実現したいこと
wavファイル分割で質問です。
以下のフローでコードを書いていますが、2の部分でつまづいています。
1.wavファイルをByte配列に格納
2.指定された長さのByte配列をFileインスタンスに書き込む(またはtemp.wavとしてファイルに書き出す)
###発生している問題・エラーメッセージ
下記コードのようにFileOutputStreamで書き出したwavファイルは
が音声ファイルとして再生できません(最初から32kBまで指定しているので、wavヘッダは含まれているはずですが)。
###該当のソースコード
Java
1public class playground { 2 3 String fileName = ""; 4 static AudioInputStream audioIn = null; 5 static AudioFormat format = null; 6 static long nBytesRead = 0; 7 static long frameSize; 8 static long frameLength; 9 static byte[] buf; 10 static SourceDataLine line = null; 11 static DataLine.Info info; 12 13 public static void readWavFile(File file) { 14 try { 15 if (!file.exists()) { 16 return; 17 } 18 19 FileInputStream fileIn = new FileInputStream(file); 20 InputStream bufferedIn = new BufferedInputStream(fileIn); 21 audioIn = AudioSystem.getAudioInputStream(bufferedIn); 22 buf = new byte[audioIn.available()]; 23 System.out.println(audioIn.available() + " " + buf.length); 24 audioIn.read(buf, 0, buf.length); //バイト配列にAudioInputStreamを格納 25 format = audioIn.getFormat(); 26 frameSize = format.getFrameSize(); 27 frameLength = audioIn.getFrameLength(); 28 nBytesRead = frameSize * frameLength; 29 System.out.println( 30 "Frame Size: " + frameSize + "\nFrame Length: " + frameLength + "\nnBytesRead: " + nBytesRead); 31 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 37 public static void lineOutAudio() { 38 try { 39 // Construct a DataLine.Info object from the format. 40 info = new DataLine.Info(SourceDataLine.class, format); 41 line = (SourceDataLine) AudioSystem.getLine(info); 42 // Open and start the line. 43 line.open(format); 44 line.start(); 45 46 line.write(buf, 0, 32000); // Write the data out to the line. 47 try { 48 Thread.sleep(3000); 49 System.out.println("waiting."); 50 } catch (InterruptedException e) { 51 e.printStackTrace(); 52 } 53 54 line.write(buf, 32000, 32000); 55 try { 56 Thread.sleep(3000); 57 System.out.println("waiting."); 58 } catch (InterruptedException e) { 59 e.printStackTrace(); 60 } 61 62 line.drain(); 63 System.out.println("End of line out."); 64 } 65 catch (LineUnavailableException e) { e.printStackTrace(); } 66 finally { line.close(); } 67 } 68 69 public static void writeAudio() { 70 FileOutputStream fos = null; 71 BufferedOutputStream bos = null; 72 try { 73 fos = new FileOutputStream("file/temp.wav"); 74 bos = new BufferedOutputStream(fos); 75 bos.write(buf, 0, 32000); 76 bos.flush(); 77 System.out.println("Write arbital byte length of audio"); 78 } 79 catch (IOException e) { e.printStackTrace(); } 80 finally { try {bos.close();} catch (IOException e) { } } 81 } 82 83 public static void main(String[] args) { 84 85 String wavFileName = "file/inputSKR-6.wav"; 86 File wavFile = new File(wavFileName); 87 if (wavFile.isFile() == false || wavFileName.endsWith("wav") == false) { 88 System.err.println("break"); 89 return; 90 } 91 System.out.println("wavFileName: " + wavFile); 92 93 // Read wav format file. 94 readWavFile(wavFile); 95 96 lineOutAudio(); 97 98 // 指定された長さのByteArrayをFileに書き込む. 99 writeAudio(); 100 101 System.exit(0); 102 } 103}
###試したこと
javax.sound.sampled.AudioSystemクラスの
AudioSystem.write(audioInputStream, Type.WAVE, outputFile)を使ってみましたがバイト配列を指定した長さとともにAudioInputStreamに再度読ませる良い方法がわからずにおります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。