質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Watson

Watsonは、IBMが開発した質問応答・意思決定支援を行うシステムです。人口知能と言われることもあるが、IBMは自然言語処理と機械学習を用いて人間の意思決定を支援するコグニティブコンピューティングプラットホームと呼んでいます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

5488閲覧

Javaでwavファイルを分割して書き出す方法

norishide

総合スコア8

Watson

Watsonは、IBMが開発した質問応答・意思決定支援を行うシステムです。人口知能と言われることもあるが、IBMは自然言語処理と機械学習を用いて人間の意思決定を支援するコグニティブコンピューティングプラットホームと呼んでいます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/02/03 03:25

###前提・実現したいこと
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に再度読ませる良い方法がわからずにおります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

コードを拝見するとwavファイルの出力は波形データのみを出力していますので先頭にヘッダーが付きませんね。

wavファイルの先頭には例えば次のようなヘッダーが入っていてサンプリングレートなど、このwavファイルの内容の諸元が記録されています。これがないため再生できないのだと思います。

52 49 46 46 60 9F 03 00 57 41 56 45 66 6D 74 20
10 00 00 00 01 00 01 00 80 BB 00 00 00 77 01 00
02 00 10 00 64 61 74 61 ...

AudioFileWriterを使って出力すると再生できる形式にできる気がします。

ちなみに自分は過去にAutioFileWriterを使ったことがないのでコードまではご紹介できません。自分がやったことがあるのは特定の形式を仮定し、サンプリングレート、ビット幅、負号、エンディアンなどは全部プログラムで固定的な値として生の波形データのみを使ってJavaプログラム内から再生・録音するといったことだけです。つまりAudioInputStreamなどは自前で実装しておりWavファイルもヘッダーのついていない生データを使ってしまってました。(インチキな方法といえます)

AudioFileWriterのリファレンスを見る限りではそれほど複雑なインターフェースでもなさそうなのでトライしてみてはいかがでしょうか。

投稿2017/02/03 04:03

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問