Getting 'UnsupportedFileException' when pl

2019-04-16 05:00发布

问题:

I have to play a .wav file from URL but getting UnsupportedFileException.

Below is the code.

public class LoopSound {
    public static void main(String[] args) throws Exception {
        HostnameVerifier hv = new HostnameVerifier() {

            @Override
            public boolean verify(String urlHostName, SSLSession session) {
                System.out.println("Warning: URL Host: " + urlHostName
                        + " vs. " + session.getPeerHost());
                return true;
            }
        };
        // Now you are telling the JRE to trust any https server.
        // If you know the URL that you are connecting to then this should
        // not be a problem
        try {
            trustAllHttpsCertificates();
        } catch (Exception e) {
            System.out.println("Trustall" + e.getStackTrace());
        }
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        URL url = new URL(
          "https://74.127.51.154/SiPbx/playback.php?access=subscriber&login=501%40mix&domain=mix.nms.mixnetworks.net&user=501&type=vmail&file=vm-20130109213353000125_netsapiens_com.wav&time=20130110170638&auth=de5dda39287604a88fc4b80c467e161d&submit=PLAY");
        Clip clip = AudioSystem.getClip();
        AudioInputStream ais = AudioSystem.
          getAudioInputStream( url );
        clip.open(ais);
        clip.loop(0);
        javax.swing.JOptionPane.
          showMessageDialog(null, "Close to exit!");
      }

     private static void trustAllHttpsCertificates() throws Exception {

            // Create a trust manager that does not validate certificate chains:

            javax.net.ssl.TrustManager[] trustAllCerts =

            new javax.net.ssl.TrustManager[1];

            javax.net.ssl.TrustManager tm = new TempTrustedManager();

            trustAllCerts[0] = tm;

            javax.net.ssl.SSLContext sc =

            javax.net.ssl.SSLContext.getInstance("SSL");

            sc.init(null, trustAllCerts, null);

            javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(

            sc.getSocketFactory());

        }
     public static class TempTrustedManager implements
        javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public boolean isServerTrusted(
            java.security.cert.X509Certificate[] certs) {
        return true;
    }

    public boolean isClientTrusted(
            java.security.cert.X509Certificate[] certs) {
        return true;
    }

    public void checkServerTrusted(
            java.security.cert.X509Certificate[] certs, String authType)
            throws java.security.cert.CertificateException {
        return;
    }

    public void checkClientTrusted(
            java.security.cert.X509Certificate[] certs, String authType)
            throws java.security.cert.CertificateException {
        return;
    }
}

Below is the exception getting:

Exception in thread "main" javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input URL
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at LoopSound.main(LoopSound.java:35)

When I place the above URL in a browser's address bar, I'm able to download the file but I'm unable to play pro-grammatically. How can I solve this ?

EDIT

I changed the link to

https://74.127.51.154/SiPbx/playback.php?access=subscriber&login=501%40mix&domain=mix.nms.mixnetworks.net&user=501&type=vmail&file=vm-20130109213353000125_netsapiens_com.wav&time=20130110170638&auth=de5dda39287604a88fc4b80c467e161d&submit=PLAY

Now the above link is placed on the browser its downloading the file.

but when i execute the program getting new exception now.

Exception in thread "main" javax.sound.sampled.LineUnavailableException: line with format ULAW 8000.0 Hz, 8 bit, mono, 1 bytes/frame,  not supported.
    at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(Unknown Source)
    at com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(Unknown Source)
    at com.sun.media.sound.AbstractDataLine.open(Unknown Source)
    at com.sun.media.sound.DirectAudioDevice$DirectClip.open(Unknown Source)
    at com.sun.media.sound.DirectAudioDevice$DirectClip.open(Unknown Source)
    at LoopSound.main(LoopSound.java:36)

Thanks in advance.

回答1:

WAV is a container format (like a zip file is a container of many different files) so there is no actual WAV Audio format (LPCM is the most common). In this case your WAV contains a format called "CCITT u-Law" which isn't widely supported (its used for Cisco VoIP phones). I haven't seen a Java Library that can read it, but maybe knowing what to look for will help.



回答2:

below link helped me and iam able to play the wav file now.

how to play wav file with format CCITT u-Law

Edit
As per Millimoose comments iam pasting some of the code from the above link to make others who read the link to understand

iam changing format of the wav file from CCITT U-Law to PCM_SIGNED which is the exact wav format

URL url = new URL(
                          "https://sssss/xxxxx/playback.php?access=subscriber&login=501%40mix&domain=mix.nms.mixnetworks.net&user=501&type=vmail&file=vm-20130109213243000082_mixnetworks_net.wav&time=20130110170638&auth=c43ff32546e126be9b895bbf225b2e75&submit=PLAY");
                 AudioInputStream fis =
                  AudioSystem.getAudioInputStream(url);
                 System.out.println("File AudioFormat: " + fis.getFormat());
                 AudioInputStream ais = AudioSystem.getAudioInputStream(
                  AudioFormat.Encoding.PCM_SIGNED,fis);
                 AudioFormat af = ais.getFormat();
                 System.out.println("AudioFormat: " + af.toString());

                 int frameRate = (int)af.getFrameRate();
                 System.out.println("Frame Rate: " + frameRate);
                 int frameSize = af.getFrameSize();
                 System.out.println("Frame Size: " + frameSize);

                 SourceDataLine line = AudioSystem.getSourceDataLine(af);
                 line.addLineListener(new MyLineListener());

                 line.open(af);
                 int bufSize = line.getBufferSize();
                 System.out.println("Buffer Size: " + bufSize);

                 line.start();

                 byte[] data = new byte[bufSize];
                 int bytesRead;

                 while ((bytesRead = ais.read(data,0,data.length)) != -1)
                     line.write(data,0,bytesRead);

                 line.drain();
                 line.stop();
                 line.close();


标签: java audio wav