java播放声音 AudioStream.getData()异常

  最近在写个小应用,用到了java用来播放声音的类库,网上有许多例子,于是就去找了一个。

 

 

code from http://dracularking.iteye.com/blog/738917 

 

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;

public class MusicPlay {
	private AudioStream as; // 单次播放声音用
	ContinuousAudioDataStream cas;// 循环播放声音

	// 构造函数
	public MusicPlay(URL url) {
		try {
			// 打开一个声音文件流作为输入
			as = new AudioStream(url.openStream());
		} catch(FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch(IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 一次播放 开始
	public void start() {
		if(as == null) {
			System.out.println("AudioStream object is not created!");
			return;
		} else {
			AudioPlayer.player.start(as);
		}
	}

	// 一次播放 停止
	public void stop() {
		if(as == null) {
			System.out.println("AudioStream object is not created!");
			return;
		} else {
			AudioPlayer.player.stop(as);
		}
	}

	// 循环播放 开始
	public void continuousStart() {
		// Create AudioData source.
		AudioData data = null;
		try {
			data = as.getData();
		} catch(IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// Create ContinuousAudioDataStream.
		cas = new ContinuousAudioDataStream(data);

		// Play audio.
		AudioPlayer.player.start(cas);
	}

	// 循环播放 停止
	public void continuousStop() {
		if(cas != null) {
			AudioPlayer.player.stop(cas);
		}
	}

}

 

不幸的是,在使用过程中,在使用循环播放时创建ContinuousAudioDataStream类时, data = as.getData() 这一句出现了异常java.io.IOException: could not create AudioData object。

 

上网搜了好多资料都没有解决,有说音频文件格式不对,有说类库有问题,但是都没有解决,后来查看了AudioStream类源文件里的getData函数后发现,getData()对音频文件的长度是有限制的,不能超过1M, 终于找到原因了, nnd这种原因导致的异常真是悲剧,网上完全找不到这种情况,javaDoc里也没有说明。。。

 

http://www.docjar.com/html/api/sun/audio/AudioStream.java.html

  102       public AudioData getData() throws IOException {
  103           int length = getLength();
  104   
  105           //limit the memory to 1M, so too large au file won't load
  106           if (length < 1024*1024) {
  107               byte [] buffer = new byte[length];
  108               try {
  109                   ais.read(buffer, 0, length);
  110               } catch (IOException ex) {
  111                   throw new IOException("Could not create AudioData Object");
  112               }
  113               return new AudioData(format, buffer);
  114           }
  115   
  116           /*              acis.setData();
  117   
  118                           if (acis.stream instanceof ByteArrayInputStream) {
  119                           Format[] format = acis.getFormat();
  120                           byte[] bytes = acis.getBytes();
  121                           if (bytes == null)
  122                           throw new IOException("could not create AudioData object: no data received");
  123                           return new AudioData((AudioFormat)format[0], bytes);
  124                           }
  125           */
  126   
  127           throw new IOException("could not create AudioData object");
  128       }

 另外,播放声音的代码上面还是有问题的,应当参考一下的链接 http://www.java2s.com/Code/JavaAPI/sun.audio/newAudioStreamInputStreamarg0.htm

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值