可以。
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、貴定網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為貴定等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
需求:
1.實(shí)現(xiàn)可以從麥克風(fēng)進(jìn)行錄音
2.可以停止錄音
3.實(shí)現(xiàn)播放錄音內(nèi)容
4.并將所錄的mp3文件全部存到F:/語(yǔ)音文件夾,語(yǔ)音的文件名以當(dāng)前時(shí)間命名(java中是換算成秒),其中文件夾程序自己創(chuàng)建,不用擔(dān)心出錯(cuò)
程序如下:
span style="font-size:18px;"import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;
public class MyRecord extends JFrame implements ActionListener{
//定義錄音格式
AudioFormat af = null;
//定義目標(biāo)數(shù)據(jù)行,可以從中讀取音頻數(shù)據(jù),該 TargetDataLine 接口提供從目標(biāo)數(shù)據(jù)行的緩沖區(qū)讀取所捕獲數(shù)據(jù)的方法。
TargetDataLine td = null;
//定義源數(shù)據(jù)行,源數(shù)據(jù)行是可以寫(xiě)入數(shù)據(jù)的數(shù)據(jù)行。它充當(dāng)其混頻器的源。應(yīng)用程序?qū)⒁纛l字節(jié)寫(xiě)入源數(shù)據(jù)行,這樣可處理字節(jié)緩沖并將它們傳遞給混頻器。
SourceDataLine sd = null;
//定義字節(jié)數(shù)組輸入輸出流
ByteArrayInputStream bais = null;
ByteArrayOutputStream baos = null;
//定義音頻輸入流
AudioInputStream ais = null;
//定義停止錄音的標(biāo)志,來(lái)控制錄音線程的運(yùn)行
Boolean stopflag = false;
//定義所需要的組件
JPanel jp1,jp2,jp3;
JLabel jl1=null;
JButton captureBtn,stopBtn,playBtn,saveBtn;
public static void main(String[] args) {
//創(chuàng)造一個(gè)實(shí)例
MyRecord mr = new MyRecord();
}
//構(gòu)造函數(shù)
public MyRecord()
{
//組件初始化
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
//定義字體
Font myFont = new Font("華文新魏",Font.BOLD,30);
jl1 = new JLabel("錄音機(jī)功能的實(shí)現(xiàn)");
jl1.setFont(myFont);
jp1.add(jl1);
captureBtn = new JButton("開(kāi)始錄音");
//對(duì)開(kāi)始錄音按鈕進(jìn)行注冊(cè)監(jiān)聽(tīng)
captureBtn.addActionListener(this);
captureBtn.setActionCommand("captureBtn");
//對(duì)停止錄音進(jìn)行注冊(cè)監(jiān)聽(tīng)
stopBtn = new JButton("停止錄音");
stopBtn.addActionListener(this);
stopBtn.setActionCommand("stopBtn");
//對(duì)播放錄音進(jìn)行注冊(cè)監(jiān)聽(tīng)
playBtn = new JButton("播放錄音");
playBtn.addActionListener(this);
playBtn.setActionCommand("playBtn");
//對(duì)保存錄音進(jìn)行注冊(cè)監(jiān)聽(tīng)
saveBtn = new JButton("保存錄音");
saveBtn.addActionListener(this);
saveBtn.setActionCommand("saveBtn");
this.add(jp1,BorderLayout.NORTH);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
jp3.setLayout(null);
jp3.setLayout(new GridLayout(1, 4,10,10));
jp3.add(captureBtn);
jp3.add(stopBtn);
jp3.add(playBtn);
jp3.add(saveBtn);
//設(shè)置按鈕的屬性
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//設(shè)置窗口的屬性
this.setSize(400,300);
this.setTitle("錄音機(jī)");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("captureBtn"))
{
//點(diǎn)擊開(kāi)始錄音按鈕后的動(dòng)作
//停止按鈕可以啟動(dòng)
captureBtn.setEnabled(false);
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//調(diào)用錄音的方法
capture();
}else if (e.getActionCommand().equals("stopBtn")) {
//點(diǎn)擊停止錄音按鈕的動(dòng)作
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
saveBtn.setEnabled(true);
//調(diào)用停止錄音的方法
stop();
}else if(e.getActionCommand().equals("playBtn"))
{
//調(diào)用播放錄音的方法
play();
}else if(e.getActionCommand().equals("saveBtn"))
{
//調(diào)用保存錄音的方法
save();
}
}
//開(kāi)始錄音
public void capture()
{
try {
//af為AudioFormat也就是音頻格式
af = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class,af);
td = (TargetDataLine)(AudioSystem.getLine(info));
//打開(kāi)具有指定格式的行,這樣可使行獲得所有所需的系統(tǒng)資源并變得可操作。
td.open(af);
//允許某一數(shù)據(jù)行執(zhí)行數(shù)據(jù) I/O
td.start();
//創(chuàng)建播放錄音的線程
Record record = new Record();
Thread t1 = new Thread(record);
t1.start();
} catch (LineUnavailableException ex) {
ex.printStackTrace();
return;
}
}
//停止錄音
public void stop()
{
stopflag = true;
}
//播放錄音
public void play()
{
//將baos中的數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)據(jù)
byte audioData[] = baos.toByteArray();
//轉(zhuǎn)換為輸入流
bais = new ByteArrayInputStream(audioData);
af = getAudioFormat();
ais = new AudioInputStream(bais, af, audioData.length/af.getFrameSize());
try {
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, af);
sd = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sd.open(af);
sd.start();
//創(chuàng)建播放進(jìn)程
Play py = new Play();
Thread t2 = new Thread(py);
t2.start();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關(guān)閉流
if(ais != null)
{
ais.close();
}
if(bais != null)
{
bais.close();
}
if(baos != null)
{
baos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//保存錄音
public void save()
{
//取得錄音輸入流
af = getAudioFormat();
byte audioData[] = baos.toByteArray();
bais = new ByteArrayInputStream(audioData);
ais = new AudioInputStream(bais,af, audioData.length / af.getFrameSize());
//定義最終保存的文件名
File file = null;
//寫(xiě)入文件
try {
//以當(dāng)前的時(shí)間命名錄音的名字
//將錄音的文件存放到F盤(pán)下語(yǔ)音文件夾下
File filePath = new File("F:/語(yǔ)音文件");
if(!filePath.exists())
{//如果文件不存在,則創(chuàng)建該目錄
filePath.mkdir();
}
file = new File(filePath.getPath()+"/"+System.currentTimeMillis()+".mp3");
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file);
} catch (Exception e) {
e.printStackTrace();
}finally{
//關(guān)閉流
try {
if(bais != null)
{
bais.close();
}
if(ais != null)
{
ais.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//設(shè)置AudioFormat的參數(shù)
public AudioFormat getAudioFormat()
{
//下面注釋部分是另外一種音頻格式,兩者都可以
AudioFormat.Encoding encoding = AudioFormat.Encoding.
PCM_SIGNED ;
float rate = 8000f;
int sampleSize = 16;
String signedString = "signed";
boolean bigEndian = true;
int channels = 1;
return new AudioFormat(encoding, rate, sampleSize, channels,
(sampleSize / 8) * channels, rate, bigEndian);
// //采樣率是每秒播放和錄制的樣本數(shù)
// float sampleRate = 16000.0F;
// // 采樣率8000,11025,16000,22050,44100
// //sampleSizeInBits表示每個(gè)具有此格式的聲音樣本中的位數(shù)
// int sampleSizeInBits = 16;
// // 8,16
// int channels = 1;
// // 單聲道為1,立體聲為2
// boolean signed = true;
// // true,false
// boolean bigEndian = true;
// // true,false
// return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,bigEndian);
}
//錄音類(lèi),因?yàn)橐玫組yRecord類(lèi)中的變量,所以將其做成內(nèi)部類(lèi)
class Record implements Runnable
{
//定義存放錄音的字節(jié)數(shù)組,作為緩沖區(qū)
byte bts[] = new byte[10000];
//將字節(jié)數(shù)組包裝到流里,最終存入到baos中
//重寫(xiě)run函數(shù)
public void run() {
baos = new ByteArrayOutputStream();
try {
System.out.println("ok3");
stopflag = false;
while(stopflag != true)
{
//當(dāng)停止錄音沒(méi)按下時(shí),該線程一直執(zhí)行
//從數(shù)據(jù)行的輸入緩沖區(qū)讀取音頻數(shù)據(jù)。
//要讀取bts.length長(zhǎng)度的字節(jié),cnt 是實(shí)際讀取的字節(jié)數(shù)
int cnt = td.read(bts, 0, bts.length);
if(cnt 0)
{
baos.write(bts, 0, cnt);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關(guān)閉打開(kāi)的字節(jié)數(shù)組流
if(baos != null)
{
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
td.drain();
td.close();
}
}
}
}
//播放類(lèi),同樣也做成內(nèi)部類(lèi)
class Play implements Runnable
{
//播放baos中的數(shù)據(jù)即可
public void run() {
byte bts[] = new byte[10000];
try {
int cnt;
//讀取數(shù)據(jù)到緩存數(shù)據(jù)
while ((cnt = ais.read(bts, 0, bts.length)) != -1)
{
if (cnt 0)
{
//寫(xiě)入緩存數(shù)據(jù)
//將音頻數(shù)據(jù)寫(xiě)入到混頻器
sd.write(bts, 0, cnt);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
sd.drain();
sd.close();
}
}
}
}/span
你確定這個(gè)東西是播放的嗎?我感覺(jué)她應(yīng)該是存儲(chǔ)到緩存當(dāng)中了啊
去oracle官方下載java多媒體支持庫(kù) java media framework 安裝完后自帶的有例子,可以播放mp3,可以做視頻監(jiān)控,可以播放常規(guī)格式的電影文件
頁(yè)面上錄音,那你的就是web程序,除非是applet程序,但是這樣就有局限性,客戶(hù)端必須安裝jdk. flex+java好像可以, 你可以研究下flex.