Получение «UnsupportedFileException» при воспроизведении wav-файла с URL-адреса в Java

Мне нужно воспроизвести файл .wav с URL-адреса, но я получаю UnsupportedFileException.

Ниже приведен код.

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;
    }
}

Ниже приведено исключение:

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)

Когда я помещаю указанный выше 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

Теперь указанная выше ссылка размещается в браузере для загрузки файла.

но когда я запускаю программу, теперь получаю новое исключение.

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)

Заранее спасибо.


person developer    schedule 10.01.2013    source источник
comment
Чем мы можем помочь? Я получаю экран входа в систему при вызове URL-адреса из браузера.   -  person home    schedule 10.01.2013


Ответы (2)


WAV — это контейнерный формат (так же, как zip-файл — это контейнер из множества разных файлов), поэтому нет фактического формата WAV Audio (наиболее распространен LPCM). В этом случае ваш WAV содержит формат под названием «CCITT u-Law», который широко не поддерживается (он используется для телефонов Cisco VoIP). Я не видел библиотеки Java, которая могла бы ее прочитать, но, возможно, знание того, что искать, поможет.

person Jason Sperske    schedule 10.01.2013
comment
Может ли это помочь? docjar.com/html/api/com/ солнце/медиа/звук/UlawCodec.java.html - person Jason Sperske; 10.01.2013
comment
Я должен проголосовать, потому что без вашего объяснения я не буду пытаться преобразовать формат u-law в точный формат файла wav. Спасибо приятель. - person developer; 11.01.2013

Ссылка ниже помогла мне, и теперь я могу воспроизводить файл wav.

Как воспроизвести wav-файл в формате CCITT u -Закон

Редактировать

Согласно комментариям Millimoose, я вставляю часть кода из приведенной выше ссылки, чтобы помочь другим.

Я меняю формат файла wav с CCITT U-Law to PCM_SIGNED, который является точным форматом wav.

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();
person developer    schedule 10.01.2013
comment
Эта ветка начинается с диких массовых догадок, и неясно, каково было решение. Вы должны включить в свой ответ что из этого помогло, и предпочтительно, почему это помогло. - person millimoose; 11.01.2013