从Java中的URL播放wav文件时获取’UnsupportedFileException’

我必须从URL播放.wav文件,但得到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时。

 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) 

提前致谢。

WAV是一种容器格式(就像zip文件是许多不同文件的容器),因此没有实际的WAV音频格式(LPCM是最常见的)。 在这种情况下,您的WAV包含一种称为“CCITT u-Law”的格式,该格式不受广泛支持(用于Cisco VoIP电话)。 我还没有看到可以读取它的Java库,但也许知道要查找的内容会有所帮助。

下面的链接帮助我和我现在能够播放wav文件。

如何播放格式为CCITT u-Law的wav文件

编辑
根据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();