请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 5724|回复: 8

用Java实现动态录音

  [复制链接]
发表于 2011-5-3 10:03:55 | 显示全部楼层 |阅读模式
发表于 2011-5-4 00:03:39 | 显示全部楼层
这个看上去有难度哦。帮顶一下。
回复

使用道具 举报

发表于 2011-5-4 00:25:26 | 显示全部楼层
可以考虑使用JMF。
下面一段程序示范了如何录音:

  1. import java.io.*;
  2. import javax.sound.sampled.AudioSystem;
  3. import javax.sound.sampled.AudioInputStream;
  4. import javax.sound.sampled.AudioFormat;
  5. import javax.sound.sampled.SourceDataLine;
  6. import javax.sound.sampled.DataLine;
  7. import javax.sound.sampled.FloatControl;
  8. import javax.sound.sampled.TargetDataLine;
  9. public class RecordAndPlay {
  10.     static volatile boolean stop=false;
  11.     public static void main(String[] args) {
  12.         Play();
  13.     }
  14.     //播放音频文件
  15.     public static void Play() {

  16.         try {
  17.             AudioFormat audioFormat =
  18. //                    new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100F,
  19. //                    8, 1, 1, 44100F, false);
  20.              new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F, 16, 2, 4,
  21.              44100F, true);
  22.             DataLine.Info info = new DataLine.Info(TargetDataLine.class,
  23.                     audioFormat);
  24.             TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
  25.             targetDataLine.open(audioFormat);
  26.             final SourceDataLine sourceDataLine;
  27.             info = new DataLine.Info(SourceDataLine.class, audioFormat);
  28.             sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);
  29.             sourceDataLine.open(audioFormat);
  30.             targetDataLine.start();
  31.             sourceDataLine.start();
  32.             FloatControl fc=(FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
  33.             double value=2;
  34.             float dB = (float)
  35.                   (Math.log(value==0.0?0.0001:value)/Math.log(10.0)*20.0);
  36.             fc.setValue(dB);
  37.             int nByte = 0;
  38.             final int bufSize=4*100;
  39.             byte[] buffer = new byte[bufSize];
  40.             while (nByte != -1) {
  41.                 //System.in.read();
  42.                 nByte = targetDataLine.read(buffer, 0, bufSize);
  43.                 sourceDataLine.write(buffer, 0, nByte);
  44.             }
  45.             sourceDataLine.stop();

  46.         } catch (Exception e) {
  47.             e.printStackTrace();
  48.         }
  49.     }
  50. }
复制代码
运行上面程序后,该程序可以实时地从麦克风录音,并执行输出。
回复

使用道具 举报

发表于 2011-5-4 20:42:05 | 显示全部楼层
顶了,学习了。
这个很有价值啊。
回复

使用道具 举报

发表于 2011-5-5 12:54:32 | 显示全部楼层
是啊 多谢nosorry兄, 周末一定回家调试
回复

使用道具 举报

 楼主| 发表于 2011-5-6 08:33:05 | 显示全部楼层
感谢nosorry的回复,非常有价值,
但还有一个问题,不知道程序是否可以判断系统是否有声音进来,
因为我的项目需要当有声音进来时就开始录制,因此程序要使用一个类似于监听器的东西来监听来自外部的声音。
回复

使用道具 举报

发表于 2011-5-8 18:16:21 | 显示全部楼层
其实我觉得程序应该采用一个机制去判断声音大小,根据声音大小来决定是否要录音即可。

因为你很难决定何为有声音,何为没有声音啊。
回复

使用道具 举报

发表于 2011-5-29 15:41:23 | 显示全部楼层
呵呵,有收获
回复

使用道具 举报

发表于 2011-8-22 13:06:59 | 显示全部楼层
高手如云的社区,我喜欢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满
微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2019-3-20 04:51 , Processed in 0.260472 second(s), 7 queries , File On.

快速回复 返回顶部 返回列表