• ベストアンサー

自作した波形データを Wave 形式で保存する

realmarchの回答

  • realmarch
  • ベストアンサー率10% (1/10)
回答No.1

そもそもWMPで音が鳴らないということは、ファイルが きちんと生成できていないのではないでしょうか? エンディアンはあっていますか? そのせいで、データ長がマイナスとかなってたりしませんか? あと、ByteInputStreamで配列をラップしてAudioInputストリームに流し込むのが楽だと 思います。

noname#15728
質問者

補足

 回答有難うございます。  WMP が撥ねるときのメッセージに「サポートしていない」云々の文言がありますから、ファイルが正常に生成されていない点はその通りだと思います。第一、TargetDataLine を使うと WMP マークのファイルは生成してくれるのですが、プログラム自体は終了しないので(タスクマネジャを見るとダイナミックストップでは無さそうなのですが)明らかに上手く行っていません。  データ長がマイナスという点は大丈夫です。念の為 System.out.println(); で出力させてみると 70400 という数値が出ました。それにプログラム中の配列 wave[] に SourceDataLine を繋げばちゃんと音になりますので。  ByteInputStream というのは ByteArrayInputStream のことでしょうか。それなら一応使ってはみました。けれどもオーディオとしての情報を附随させる方法がどうしても分らず、諦めてしまったのです。  御教示を承けてもう一度試みましたが、やはり上手く行きませんでした。

関連するQ&A

  • ワードデータを画像データで保存したい!

    はじめまして。よろしくお願いします。 ワードのテキストデーターを 画像ファイルで保存したいです。 困っています。 テキストを画像データにするフリーソフト2つありましたが、 うまくできませんでした。 http://search.vector.co.jp/search?query=%83e%83L%83X%83g%81%40%89%E6%91%9C http://www.greenspace.info/tepa/index.html 何かいい方法ありますでしょうか? ゆ

  • スレッドの自動終了について。

    スレッドの自動終了について。 クリップをファイルから取得し、[1]キーが押されるとクリップが再生され、クリップ再生中の場合は ファイル名を表示したラベルに色を着けるプログラムを作ってみたのですが 1度のみなら正しく作動するのですが、2回目にキーを押そうとすると、クリップだけ再生しラベルの色は黒いままです。 そして、3回目以降はキーをいくら押してもクリップが再生されません。 これを正しく動作させるにはどのようにしたらよいでしょうか。 キーリスナ、スレッド、アクションリスナの内容を記載しますので、ご指導頂けたらと思います。 class ClipWatching extends Thread { public ClipWatching() { } public void run() { while(clip1.isRunning()) { lb1.setForeground(Color.red); } lb1.setForeground(Color.black); thread = false; } } class SampleKeyListener implements KeyListener { public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_1) { try{ if(thread == false) { cw.join(); } clip1.start(); cw.start(); thread = true; } catch(Exception uu) { } } } public void keyReleased(KeyEvent e){ } public void keyTyped(KeyEvent e){ } } class SampleActionListener implements ActionListener { public void shori() { } public void actionPerformed(ActionEvent e) { try { if(e.getSource() == bt1) { fl1 = new File("001.wav"); lb1.setText(fl1 + ""); ais1 = AudioSystem.getAudioInputStream(fl1); format1 = ais1.getFormat(); info1 = new DataLine.Info(Clip.class, format1); clip1 = (Clip) AudioSystem.getLine(info1); clip1.open(ais1); } } catch(Exception ex) { } }

  • Java で MP3 (JMF + MP3plugin)

    JAVAでMP3Playerを作ろうとしていて格闘中の者です JavazoomでのMP3プラグインではなく JMFのMP3プラグインをつかって作ろうとしているのですが。 Exception in thread "main" javax.sound.sampled.UnsupportedAudioFileException: co uld not get audio input stream from input file at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java: 786) に悩まされています。 CLASSPATHにjmf.jar,sound.jar,mp3plugin.jarは指定してあり、 JMStudioで再生できるMP3で、 ソースは、 import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.DataLine; import java.io.File; public class Player2 { private static final int BUFFER_SIZE = 176400; // 44100 x 16 x 2 / 8 public static void main(String[] args) throws Exception { byte[] buffer = new byte[BUFFER_SIZE]; AudioInputStream in = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, AudioSystem.getAudioInputStream(new File (args[0]))); AudioFormat audioFormat = in.getFormat(); SourceDataLine line = (SourceDataLine) AudioSystem.getLine(new DataLine.Info(SourceDataLine.class, audioFormat)); line.open(audioFormat); line.start(); while (true) { int n = in.read(buffer, 0, buffer.length); if (n < 0) { break; } line.write(buffer, 0, n); } line.drain(); line.close(); } } です よろしくお願いします。

    • ベストアンサー
    • Java
  • BufferedReaderで配列のデータを取り出したい

    PrintWriterで配列のデータを書き込み、 BufferedReaderで書き込んだデータを呼び出したい のですが、下記のソースで書き込むと [Ljava.lang.String;@1add2dd のように表示されてしまいます。 テキストファイルに 1,Server1 のような感じで 書き込んで読み込むにはどのようにしたら いいでしょうか? すみません、ご教授下さい。 よろしくお願いします。 import java.io.*; public class IOTest { public static void main(String[] args) { try{ PrintWriter pr = new PrintWriter( new BufferedWriter(new FileWriter("test.txt")),true); String index = "1"; String serverName = "Server1"; String Server [] = {index, serverName}; pr.println(Server); System.out.println("登録したデータは:" + Server + "です。\n"); BufferedReader br = new BufferedReader( new FileReader("test.txt")); String line; while((line = br.readLine()) != null){ System.out.println("取り出したデータは:" + line + "です。"); } }catch(Exception e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • AWKの配列内データの処理について

    AWKを使用して入力ファイルの1行内の単語に対して条件チェックするには for( i=1 ; i<= NF i++ ){    if( $I == chek_word )       処理 } とすればできるのはわかるのですが、 一旦、配列の中に格納した文字列に対して上記の処理と同様の処理をするにはどのようにすればいいのでしょうか? 例えば data_line[$1] = $0; として配列data_lineに格納した1行そのままのデータに対して1番上の行全体にわたる単語の条件チェック をおこないたいのですが、どのようにすればいいのかよくわかりません。 どなたかご存知の方アドバイスをお願いします。

  • javascriptの配列をPHPで読み込みたいのですが・・・

    javascriptの配列を記述してあるファイル info.js があるとします data = new array(); data[0] = new array("data1","data2","data3"); data[1] = new array("data1","data2","data3"); data[2] = new array("data1","data2","data3"); ・ ・ ・ 上記の文で書かれた配列データを、PHP上で読み込み、新着一覧のような形でhtmlで表示したいのですが、方法が分かりません。 分かる方がいらっしゃいましたら教えて下さい。

    • ベストアンサー
    • PHP
  • ギブアップ!!

    お世話になります。 よっしです。 VBSで以下のことをしたいのですが、うまくいきません! ご存知の方教えてください。 ・2個のテキストファイル(Text1、Text2(改行あり))の文字列を比較し、同じものが無い場合にその文字列を別ファイルにWriteしたい。 Text1の内容例  Line1  Line2  Line3  Line4 Text2の内容例  Line2  Line3 この場合新規ファイルには以下のように記述したいです。  Line1  Line4 配列を使用してちょちょっとできると思ったらなかなか上手くいかず、配列と文字列のFilterをしたら"True"の場合を指定するとエラーが出てしまいます。 一次元の配列のはずなんですが・・・ 何か上手くいく方法があれば教えてください!

  • JSPのcharAt()について

    JSPです。text1.txtをBufferedReaderで読み込んで、一文字ごとにchar型のline[]という配列に入れようとしています。 しかし、l.charAt();の部分でエラー起きてしまいます。 原因は何なのでしょう? 文字列をString型に直接(String l = "aaaaaa";のように)書き込むと動くようです。 String path = getServletContext().getRealPath("/WEB-INF/text1.txt"); BufferedReader br = new BufferedReader(new FileReader(path)); String l = ""; char line[]; while((l = br.readLine()) != null){ line = new char[l.length()]; for(int j=0; j <= l.length(); j++){ line[j] = l.charAt(j); out.print(l.charAt(j)); } } どこがおかしいのか、原因がわかる方教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • バイナリ読み込み時のデータ受け渡しについて

    質問させていただきます。 XMLファイルを圧縮後にバイナリ読み込みし、long*に設定してそれを4バイトのlong配列に格納したいと考えています。 ファイルを読み込む際にはデータ数が解らないので、ループを回したいと思っています。 以下に一部記載します。 これでpBinaryには正常にバイナリデータが入るのでしょうか? わかる方がいれば教えてください。 ****************************************** FILE *pFile = NULL; pFile = fopen("XMLFile.xml", "rb"); int iRet = 0; int iSize = 0; bool bRet = false; long *pBinary = new long; while(bRet != true) { /* 4バイトずつ読み込みpBinaryに設定する */ fread(pBinary, sizeof(4), 1, pFile); if(iRet != 1) { bRet = true; } else { iSize++; } }

  • 読み込んだデータの表示

    読み込んだデータを指定したインターバルごとにラベルに表示したいのですが,作成したプログラムを実行すると,配列の1番目しか表示されません.なにがいけないのでしょうか.Visual Basic6.0を使用しております. ' 共通変数 Dim yy() As Double Private Sub Command1_Click() ' ダイアログのタイトルを設定する CommonDialog1.DialogTitle = "データ保存" ' 初期表示するディレクトリを設定する If strCurDir = "" Then CommonDialog1.InitDir = Mid$(strStartDir, 1, 3) Else CommonDialog1.InitDir = strCurDir End If ' ダイアログ設定 Call SetDialog ' エラーをトラップしない On Error Resume Next ' ダイアログを表示する Me.CommonDialog1.ShowOpen ' [キャンセル] ボタンが選択されなかった場合は、選択したファイル名を表示する If Err.Number = ErrorConstants.cdlCancel Then On Error GoTo 0 Exit Sub End If ' エラー処理を通常のロジックに戻す On Error GoTo 0 ' FileSystemObject (FSO) の新しいインスタンスを生成する Dim cFso As FileSystemObject Set cFso = New FileSystemObject ' カレントドライブ設定 strCurDir = cFso.GetParentFolderName(CommonDialog1.FileName) FileNumber = FreeFile Open CommonDialog1.FileName For Input As #FileNumber Dim n As Integer ' カウンタ Dim i As Integer Dim intN As Integer ' 最初の配列数 Dim nn As Integer ' 配列の増分量 ' データ数のカウンタ n = 0 i = 0 ' 最初の配列数 '  配列の上限を上げる処理は何回でも出来ますが、その処理を繰り返す ' ことより同じデータ数の場合には処理時間はかかります。 '  ですから、読み取りデータ数の上限が分かっている場合は、その数を ' intN に指定してください。この場合には配列の上限を判断するプログラム ' 部分を省くことができます。 intN = 500 ' 配列の増分量 '  データ数が未定のときは、なるべく配列の上限を増やす処理を少なく ' する配列数を指定してください。 nn = 200 ' 最初の配列数設定 ReDim yy(intN) Do While Not EOF(1) ' ファイルの終端までループを繰り返します。 ' 配列増分処理 If n > intN Then ReDim Preserve yy(UBound(yy) + nn) intN = intN + nn End If ' データ読み取り Input #FileNumber, yy(n) ' データ配列に代入します。 n = n + 1 Loop Close #FileNumber ' 配列のサイズを揃える ReDim Preserve yy(n - 1) blnGetData = True ' データ取得 End Sub ' ダイアログの設定 Private Sub SetDialog() ' 初期表示するファイル名を設定する CommonDialog1.FileName = "Data.txt" ' ファイルのフィルタを設定する CommonDialog1.Filter = "テキスト ファイル|*.txt|すべてのファイル|*.*" ' ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) CommonDialog1.FilterIndex = 1 ' 存在しているファイルを指定した場合は、上書きするかどうかの問い合わせを表示する CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNOverwritePrompt ' 存在しないパスを指定した場合は警告を表示する CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNPathMustExist ' 有効な Win32 ファイル名でなくとも返す (検証しない) 'CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNNoValidate ' [読み取り専用] チェックボックスを非表示にする ' (省略しても表示はされませんが、ダイアログの大きさが変わります) CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNHideReadOnly ' 長いファイル名を使用する CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNLongNames ' [キャンセル] ボタンを選択した場合はエラーを発生させる CommonDialog1.CancelError = True ' エラーをトラップしない On Error Resume Next End Sub Private Sub Command2_Click() Timer1.Enabled = True End Sub Private Sub Command3_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Label1.Caption = yy(i) i = i + 1 End Sub