sipphone中播放声音文件
来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 11:58 点击:次
在这一篇里记录下在Java sip softphone的基础上添加播放音乐文件的功能。前面介绍了几款sipphone,发现Java sip softphone这款开源软件功能简单易于修改,根据自己的需要选择是否保留其GUI,然后修改少部分代码即可实现在拨号后播放指定的音乐文件。但是仍然有几个问题有待以后解决:1是对整个源码的框架流程的分析,目前我也只是删除了其GUI部分,而底层的sip rtp传输没有涉及;2是我下载的版本在挂断、远端忙等情况时有问题;3是播放声音文件目前只是使用默认支持的wav格式,其它格式可以扩展,但是我实现的方式应该还是有问题,因为获取发送声音数据的间隔还没有确定,只是自己测试的20ms,后面会看到。
要播放声音文件,首先得找到是从哪里获得数据的。在源码书中看到net.sourceforge.peers.media包,类Capture中看到buffer = soundManager.readData();,进而查看类SoundManager,可以发现:openAndStartLines()、 readData() 、writeData()等函数,正是我们需要的麦克风音频数据的捕获和写入扬声器的方法。查看readData()方法如下:
[java]
1. /**
2. * audio read from microphone, read all available data
3. * @return
4. */
5. public synchronized byte[] readData() {
6. if (targetDataLine == null) {
7. return null;
8. }
9. int ready = targetDataLine.available();
10. while (ready == 0) {
11. try {
12. Thread.sleep(2);
13. ready = targetDataLine.available();
14. } catch (InterruptedException e) {
15. return null;
16. }
17. }
18. if (ready <= 0) {
19. return null;
20. }
21. byte[] buffer = new byte[ready];
22. targetDataLine.read(buffer, 0, buffer.length);
23. if (mediaDebug) {
24. try {
25. microphoneOutput.write(buffer, 0, buffer.length);
26. } catch (IOException e) {
27. logger.error("cannot write to file", e);
28. return null;
29. }
30. }
31. return buffer;
32. }
去掉调试信息,结合类Capture中的代码,发现这里仅是通过buffer将数据获取,然后通过PipedOutputStream类型的rawData将数据发送出去;因此只要在readData()中使bu
要播放声音文件,首先得找到是从哪里获得数据的。在源码书中看到net.sourceforge.peers.media包,类Capture中看到buffer = soundManager.readData();,进而查看类SoundManager,可以发现:openAndStartLines()、 readData() 、writeData()等函数,正是我们需要的麦克风音频数据的捕获和写入扬声器的方法。查看readData()方法如下:
[java]
1. /**
2. * audio read from microphone, read all available data
3. * @return
4. */
5. public synchronized byte[] readData() {
6. if (targetDataLine == null) {
7. return null;
8. }
9. int ready = targetDataLine.available();
10. while (ready == 0) {
11. try {
12. Thread.sleep(2);
13. ready = targetDataLine.available();
14. } catch (InterruptedException e) {
15. return null;
16. }
17. }
18. if (ready <= 0) {
19. return null;
20. }
21. byte[] buffer = new byte[ready];
22. targetDataLine.read(buffer, 0, buffer.length);
23. if (mediaDebug) {
24. try {
25. microphoneOutput.write(buffer, 0, buffer.length);
26. } catch (IOException e) {
27. logger.error("cannot write to file", e);
28. return null;
29. }
30. }
31. return buffer;
32. }
去掉调试信息,结合类Capture中的代码,发现这里仅是通过buffer将数据获取,然后通过PipedOutputStream类型的rawData将数据发送出去;因此只要在readData()中使bu
相关新闻>>
最新推荐更多>>>
热门新闻进入移动开发频道>>
- 发表评论
-
- 最新评论 更多>>