Avatar billede kasperbn Nybegynder
15. juli 2002 - 00:27 Der er 3 kommentarer og
1 løsning

JavaSound

Hvorfor er det nu lige at sun har gjort det så pissehamrende besværligt at have med lyd at gøre i Java???????

latterligt....
Avatar billede r9 Nybegynder
15. juli 2002 - 09:02 #1
denne virker:


/*
*    SimpleAudioPlayer.java
*
*    This file is part of the Java Sound Examples.
*/

/*
*  Copyright (c) 1999 - 2001 by Matthias Pfisterer <Matthias.Pfisterer@web.de>
*
*
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU Library General Public License as published
*  by the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU Library General Public License for more details.
*
*  You should have received a copy of the GNU Library General Public
*  License along with this program; if not, write to the Free Software
*  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/


import    java.io.File;
import    java.io.IOException;

import    javax.sound.sampled.AudioFormat;
import    javax.sound.sampled.AudioInputStream;
import    javax.sound.sampled.AudioSystem;
import    javax.sound.sampled.DataLine;
import    javax.sound.sampled.LineUnavailableException;
import    javax.sound.sampled.SourceDataLine;


public class SimpleAudioPlayer
{
    private static final int    EXTERNAL_BUFFER_SIZE = 128000;



    public static void main(String[] args)
    {
        /*
          We check that there is exactely one command-line
          argument.
          If not, we display the usage message and exit.
        */



/*        if (args.length != 1)
        {
            System.out.println("SimpleAudioPlayer: usage:");
            System.out.println("\tjava SimpleAudioPlayer <soundfile>");
            System.exit(1);
        }

        */




        /*
          Now, that we're shure there is an argument, we
          take it as the filename of the soundfile
          we want to play.
        */
        String strFilename = "c:\\joke.wav";
        //String    strFilename = args[0];
        File    soundFile = new File(strFilename);

        /*
          We have to read in the sound file.
        */
        AudioInputStream    audioInputStream = null;
        try
        {
            audioInputStream = AudioSystem.getAudioInputStream(soundFile);
        }
        catch (Exception e)
        {
            /*
              In case of an exception, we dump the exception
              including the stack trace to the console output.
              Then, we exit the program.
            */
            e.printStackTrace();
            System.exit(1);
        }

        /*
          From the AudioInputStream, i.e. from the sound file,
          we fetch information about the format of the
          audio data.
          These information include the sampling frequency,
          the number of
          channels and the size of the samples.
          These information
          are needed to ask Java Sound for a suitable output line
          for this audio file.
        */
        AudioFormat    audioFormat = audioInputStream.getFormat();

        /*
          Asking for a line is a rather tricky thing.
          We have to construct an Info object that specifies
          the desired properties for the line.
          First, we have to say which kind of line we want. The
          possibilities are: SourceDataLine (for playback), Clip
          (for repeated playback)    and TargetDataLine (for
          recording).
          Here, we want to do normal playback, so we ask for
          a SourceDataLine.
          Then, we have to pass an AudioFormat object, so that
          the Line knows which format the data passed to it
          will have.
          Furthermore, we can give Java Sound a hint about how
          big the internal buffer for the line should be. This
          isn't used here, signaling that we
          don't care about the exact size. Java Sound will use
          some default value for the buffer size.
        */
        SourceDataLine    line = null;
        DataLine.Info    info = new DataLine.Info(SourceDataLine.class,
                            audioFormat);
        try
        {
            line = (SourceDataLine) AudioSystem.getLine(info);

            /*
              The line is there, but it is not yet ready to
              receive audio data. We have to open the line.
            */
            line.open(audioFormat);
        }
        catch (LineUnavailableException e)
        {
            e.printStackTrace();
            System.exit(1);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }

        /*
          Still not enough. The line now can receive data,
          but will not pass them on to the audio output device
          (which means to your sound card). This has to be
          activated.
        */
        line.start();

        /*
          Ok, finally the line is prepared. Now comes the real
          job: we have to write data to the line. We do this
          in a loop. First, we read data from the
          AudioInputStream to a buffer. Then, we write from
          this buffer to the Line. This is done until the end
          of the file is reached, which is detected by a
          return value of -1 from the read method of the
          AudioInputStream.
        */
        int    nBytesRead = 0;
        byte[]    abData = new byte[EXTERNAL_BUFFER_SIZE];
        while (nBytesRead != -1)
        {
            try
            {
                nBytesRead = audioInputStream.read(abData, 0, abData.length);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            if (nBytesRead >= 0)
            {
                int    nBytesWritten = line.write(abData, 0, nBytesRead);
            }
        }

        /*
          Wait until all data are played.
          This is only necessary because of the bug noted below.
          (If we do not wait, we would interrupt the playback by
          prematurely closing the line and exiting the VM.)

          Thanks to Margie Fitch for bringing me on the right
          path to this solution.
        */
        line.drain();

        /*
          All data are played. We can close the shop.
        */
        line.close();

        /*
          There is a bug in the jdk1.3.
          It prevents correct termination of the VM.
          So we have to exit ourselves.
        */
        System.exit(0);
    }
}



/*** SimpleAudioPlayer.java ***/
Avatar billede r9 Nybegynder
15. juli 2002 - 09:05 #2
du skal blot have en audio fil på din hd.
Jeg kan kun få det til at virke med en .wav fil

du angiver filnavnet i denne linje:
String strFilename = "c:\\joke.wav";
Avatar billede r9 Nybegynder
17. juli 2002 - 15:26 #3
virker det?
Avatar billede r9 Nybegynder
19. juli 2002 - 01:41 #4
du kan også hente en komplet java mp3 player her:
http://www.javazoom.net/jlgui/sources.html

incl. sourcen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester