利用java录制音频文件
本文主要使用javax.sound.sample的类和接口来实现录制音频的功能。并给出一个实例。(实例参考自jsresources.org)
@Author:JZhang
E-mail:zhangjunhd@gmail.com
Blog: http://blog.csdn.net/zhangjunhd/
AudioSystem类write方法:
Public static int write(AudioInputSystem stream,AudioFileFormat.Type fileType,File out)
Throws IOException
将表示指定文件类型的音频文件的字节流写入所提供的外部文件。
参数:
stream----包含要写入文件的音频数据的音频输入流
fileType----要写入的音频文件的种类
out----应将文件数据写入其中的外部文件
实现具体步骤:
1. 指定一个待存储音频数据的音频文件
File outputFile=new File(“文件名”);
2. 指定待存储的音频数据的格式
AudioFormat audioFormat=new AudioFormat(“指定一种编码格式”);
3. 创建一个目标数据行,并指定音频数据相关格式
TargetDataLine targetDataLine=null;
DataLine.Info info=new DataLine.Info(TargetDataLine.class,audioFormat);
targetDataLine =(TargetDataLine)AudioSystem.getLine(info);
4. 定义音频文件类型
AudioFileFormat.Type targetType=AudioFileFormat.Type.WAVE;
5. 调用write方法
具体流程
一个实例
/* * Copyright (c) 1999 - 2001 by Matthias Pfisterer * All rights reserved.*/import java.io.IOException;
import java.io.File;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.AudioFileFormat;
public class SimpleAudioRecorder
extends Thread
{
private TargetDataLine m_line;
private AudioFileFormat.Type m_targetType;
private AudioInputStream m_audioInputStream;
private File m_outputFile;
public SimpleAudioRecorder(TargetDataLine line,
AudioFileFormat.Type targetType,
File file)
{
m_line = line;
m_audioInputStream = new AudioInputStream(line);
m_targetType = targetType;
m_outputFile = file;
}
public void start()
{
m_line.start();
super.start();
}
public void stopRecording()
{
m_line.stop();
m_line.close();
}
public void run()
{
try
{
AudioSystem.write(
m_audioInputStream,
m_targetType,
m_outputFile);
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
if (args.length != 1 || args[0].equals("-h"))
{
printUsageAndExit();
}
String strFilename = args[0];
File outputFile = new File(strFilename);
/*使用编码格式: PCM 44.1 kHz, 16 bit signed,
stereo.
*/
AudioFormat audioFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
TargetDataLine targetDataLine = null;
try
{
targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(audioFormat);
}
catch (LineUnavailableException e)
{
out("unable to get a recording line");
e.printStackTrace();
System.exit(1);
}
AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
SimpleAudioRecorder recorder = new SimpleAudioRecorder(
targetDataLine,
targetType,
outputFile);
/* 用户按下回车,开始录音。
*/
out("Press ENTER to start the recording.");
//由于键盘输入ENTER将返回两个值,分别为13,10.所以执行两次System.in.read();
try
{
/*int s=*/System.in.read();
//System.out.println("test1:"+s);
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
/*int s=*/System.in.read();
//System.out.println("test1:"+s);
}
catch (IOException e)
{
e.printStackTrace();
}
/* 此处,开始录音。
*/
recorder.start();
out("Recording...");
/*用户按下回车,停止录音。
*/
out("Press ENTER to stop the recording.");
try
{
int s=System.in.read();
System.out.println("test2"+s);
}
catch (IOException e)
{
e.printStackTrace();
}
recorder.stopRecording();
out("Recording stopped.");
}
private static void printUsageAndExit()
{
out("SimpleAudioRecorder: usage:");
out("\tjava SimpleAudioRecorder -h");
out("\tjava SimpleAudioRecorder <audiofile>");
System.exit(0);
}
private static void out(String strMessage)
{
System.out.println(strMessage);
}
}