オーディオファイルの書き出しのプログラム

469 views
Skip to first unread message

Atsutoshi Murata

unread,
Aug 13, 2013, 3:27:01 AM8/13/13
to android-g...@googlegroups.com
オーディオデータにエフェクトかけたいので、手始めにWAVEファイルを読み込んで
そのまま保存するプログラムを作ってみましたが、②の場合に同じファイルになりません。

いろいろ調べてみましたが、どこが間違っているのか分かりません。
どうすれば動くようになるのかご教授願います。

①次のコードの場合には、全く同じファイルができます。

    String infile = "D:\\Android\\sample.wav";
    AudioInputStream ais = AudioSystem.getAudioInputStream(new File(infile));
    AudioFormat fmt = ais.getFormat();

    String outfile = "D:\\Android\\sample2.wav";
    AudioSystem.write(ais, AudioFileFormat.Type.WAVE, new File(outfile));
    ais.close();

②byteデータを取り出して保存するプログラムに変更してみたところ、同じデータになりません。

    String infile = "D:\\Android\\sample.wav";
    AudioInputStream ais = AudioSystem.getAudioInputStream(new File(infile));
    AudioFormat fmt = ais.getFormat();
    int length = ais.available();
    byte[] data = new byte[length];

    // byteデータにエフェクト処理予定

    InputStream in = new ByteArrayInputStream(data);
    AudioInputStream out = new AudioInputStream(in, fmt, length);

    String outfile = "D:\\Android\\sample2.wav";
    AudioSystem.write(out, AudioFileFormat.Type.WAVE, new File(outfile));
    out.close();
    in.close();

同じファイルができるだろうと思っていたのですが、Windows Media Playerで再生すると、
「ファイルを再生できません。プレイヤーがそのファイルの種類をサポートしていないか…」という
メッセージが出ます。
バイナリエディタのBzで見たところ、WAVEフォーマットのヘッダのチャンクサイズ部分が違っています。
sample.wavのRIFFの後には、  24 98 07 00
sample2.waveのRIFFの後には、24 60 1E 00

となっています。どうすれば同じファイルになるのでしようか?
よろしくお願いします。

Makoto Yamazaki

unread,
Aug 13, 2013, 3:52:57 AM8/13/13
to android-g...@googlegroups.com
zaki です。

data に読み込んでないからではないでしょうか。


2013/8/13 Atsutoshi Murata <app.co...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
YAMAZAKI Makoto

太田 満

unread,
Aug 13, 2013, 4:12:04 AM8/13/13
to android-g...@googlegroups.com
はじめまして、太田と申します。
すみませんが
Javaの配列の代入が違っているように思われますが
いかがでしょうか。

太田 満

unread,
Aug 13, 2013, 4:56:02 AM8/13/13
to android-g...@googlegroups.com
zakiさんのレスどおりです。
 
文法の誤りではないですが、
dataに何も入れていません。

Atsutoshi Murata

unread,
Aug 13, 2013, 10:59:27 AM8/13/13
to android-g...@googlegroups.com
ご回答頂いた皆さん、すいません。
コピペミスして読み込み部分が抜けていました。

    // WAVファイルの読み込み

    String infile = "D:\\Android\\sample.wav";
    AudioInputStream ais = AudioSystem.getAudioInputStream(new File(infile));
  // WAVフォーマットの取得
    AudioFormat fmt = ais.getFormat();
  // バッファの確保

    int length = ais.available();
    byte[] data = new byte[length];

    // 読み込み部分
    int result = ais.read(data);
    // バッファ分読み込んだかどうかを確認。
    // 実際にバッファに確保したサイズが戻り値に入っていた。
     System.out.println(result);
     ais.close();
   
  // byteデータにエフェクト処理予定

  // バイトデータをAudioInputStreamに変換

    InputStream in = new ByteArrayInputStream(data);
    AudioInputStream out = new AudioInputStream(in, fmt, length);
  // WAVファイルに出力

    String outfile = "D:\\Android\\sample2.wav";
    AudioSystem.write(out, AudioFileFormat.Type.WAVE, new File(outfile));
    out.close();
    in.close();
  // sample.wavとsample2.wavのファイルサイズはぴったり同じです。

ごめんなさい。ちゃんと読み込めているので、入力と出力のファイルサイズは同じです。
しかし、再生エラーとなるので、バイナリエディタで見ると、WAVファイルのヘッダ部分の
チャンクサイズが違っていた次第です。
データ部分は同じです。

どうしてそうなるのか分かりません。

2013年8月13日火曜日 17時56分02秒 UTC+9 鶴太田:
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

Shin Miyazaki

unread,
Aug 14, 2013, 10:25:58 PM8/14/13
to android-g...@googlegroups.com
こんにちは、みやざきです。

見たところ、androidに実装する前にPCで動作確認をされているようですが、
そもそもandroidのフレームワークにjavax.sound.sampledパッケージは
含まれていません。
JelleyBean以降であれば、MediaExtracor(+MediaCodec)で同じようなことが
できるようですが、それ以前も対象にするならば、自前でRIFFを解釈しながら
読み書きするなり、javax.sound.sampledに変わるような実装を探してくるなり
しなければならないかと。


2013年8月13日 23:59 Atsutoshi Murata <app.co...@gmail.com>:
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

Atsutoshi Murata

unread,
Aug 15, 2013, 10:13:52 AM8/15/13
to android-g...@googlegroups.com
みやざきさま

そうですね~。正攻法で駄目なら別の方法を考えます。
ヘッダ部分は自分で作れば良いわけですが、ちょっと不可解だったので質問した次第です。

ありがとうございました。

2013年8月15日木曜日 11時25分58秒 UTC+9 shinm:
このグループに投稿するには、android-group-jap...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-jap...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages