本文目錄一覽:
- 1、java通過JACOB實現TTS.如何實現錄音
- 2、大家好,我現在想用java在頁面上實現一下錄音和播放功能,想問下各位高手有啥好方法沒?
- 3、javacv怎麼調用音頻錄製
- 4、java實現 mp3格式轉換wav
java通過JACOB實現TTS.如何實現錄音
第一就是運用JMF。錄製系統的發音。但是這樣的開發太過於牽強,萬一系統還在放歌,或者其他聲音,那豈不是一起錄製了。
第二,其實問題沒有那麼複雜,用IO流來實現。不過不知道能否實現。
大家好,我現在想用java在頁面上實現一下錄音和播放功能,想問下各位高手有啥好方法沒?
頁面上錄音,那你的就是web程序,除非是applet程序,但是這樣就有局限性,客戶端必須安裝jdk.
flex+java好像可以, 你可以研究下flex.
javacv怎麼調用音頻錄製
Adobe Audition3.0(簡稱AA),先下載伴奏,打開AA,,點文件,新建,確定。點視圖,選多軌,在第一音軌點右鍵插入音頻,找到你的伴奏插入,點第二音軌的R鍵開啟錄音狀態,點左下的紅色圓圈錄製就行了,錄製完成後雙擊音軌2的波形,進入編輯視圖,這裡可以進行人聲效果的處理,可以到百度搜索一下相關教程,很多的,如降噪、混響、均衡等都在這裡處理,處理完成後返回多軌視圖,聽一下,如果聲音大小與伴奏不協調可以在編輯視圖的效果》壓限》標準化進程里調節音量。都做好後在多軌視圖裡點右鍵混縮到文件里的第一項,就把伴奏和人聲混合起來了,點文件》另存,保存成WAV或MP3隨便,完成了。
java實現 mp3格式轉換wav
/*
* 實現錄音機的功能
*/
package com.liuyun.MyRecord1;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;
import java.lang.*;
public class MyRecord extends JFrame implements ActionListener{
//定義錄音格式
AudioFormat af = null;
//定義目標數據行,可以從中讀取音頻數據,該 TargetDataLine 接口提供從目標數據行的緩衝區讀取所捕獲數據的方法。
TargetDataLine td = null;
//定義源數據行,源數據行是可以寫入數據的數據行。它充當其混頻器的源。應用程序將音頻位元組寫入源數據行,這樣可處理位元組緩衝並將它們傳遞給混頻器。
SourceDataLine sd = null;
//定義位元組數組輸入輸出流
ByteArrayInputStream bais = null;
ByteArrayOutputStream baos = null;
//定義音頻輸入流
AudioInputStream ais = null;
//定義停止錄音的標誌,來控制錄音線程的運行
Boolean stopflag = false;
//記錄開始錄音的時間
long startPlay;
//定義所需要的組件
JPanel jp1,jp2,jp3;
JLabel jl1=null;
JButton captureBtn,stopBtn,playBtn,saveBtn;
public static void main(String[] args) {
//創造一個實例
MyRecord mr = new MyRecord();
}
//構造函數
public MyRecord()
{
//組件初始化
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
//定義字體
Font myFont = new Font(“華文新魏”,Font.BOLD,30);
jl1 = new JLabel(“錄音機功能的實現”);
jl1.setFont(myFont);
jp1.add(jl1);
captureBtn = new JButton(“開始錄音”);
//對開始錄音按鈕進行註冊監聽
captureBtn.addActionListener(this);
captureBtn.setActionCommand(“captureBtn”);
//對停止錄音進行註冊監聽
stopBtn = new JButton(“停止錄音”);
stopBtn.addActionListener(this);
stopBtn.setActionCommand(“stopBtn”);
//對播放錄音進行註冊監聽
playBtn = new JButton(“播放錄音”);
playBtn.addActionListener(this);
playBtn.setActionCommand(“playBtn”);
//對保存錄音進行註冊監聽
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);
//設置按鈕的屬性
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//設置窗口的屬性
this.setSize(400,300);
this.setTitle(“錄音機”);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals(“captureBtn”))
{
//點擊開始錄音按鈕後的動作
//停止按鈕可以啟動
captureBtn.setEnabled(false);
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//調用錄音的方法
capture();
//記錄開始錄音的時間
startPlay = System.currentTimeMillis();
}else if (e.getActionCommand().equals(“stopBtn”)) {
//點擊停止錄音按鈕的動作
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
saveBtn.setEnabled(true);
//調用停止錄音的方法
stop();
//記錄停止錄音的時間
long stopPlay = System.currentTimeMillis();
//輸出錄音的時間
System.out.println(“Play continues ” + (stopPlay-startPlay));
}else if(e.getActionCommand().equals(“playBtn”))
{
//調用播放錄音的方法
play();
}else if(e.getActionCommand().equals(“saveBtn”))
{
//調用保存錄音的方法
save();
}
}
//開始錄音
public void capture()
{
try {
//af為AudioFormat也就是音頻格式
af = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class,af);
td = (TargetDataLine)(AudioSystem.getLine(info));
//打開具有指定格式的行,這樣可使行獲得所有所需的系統資源並變得可操作。
td.open(af);
//允許某一數據行執行數據 I/O
td.start();
//創建播放錄音的線程
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中的數據轉換為位元組數據
byte audioData[] = baos.toByteArray();
//轉換為輸入流
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();
//創建播放進程
Play py = new Play();
Thread t2 = new Thread(py);
t2.start();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關閉流
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;
//寫入文件
try {
//以當前的時間命名錄音的名字
//將錄音的文件存放到F盤下語音文件夾下
File filePath = new File(“F:/語音文件”);
if(!filePath.exists())
{//如果文件不存在,則創建該目錄
filePath.mkdir();
}
long time = System.currentTimeMillis();
file = new File(filePath+”/”+time+”.wav”);
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file);
//將錄音產生的wav文件轉換為容量較小的mp3格式
//定義產生後文件名
String tarFileName = time+”.mp3″;
Runtime run = null;
try {
run = Runtime.getRuntime();
long start=System.currentTimeMillis();
//調用解碼器來將wav文件轉換為mp3文件
strongspan style=”color:#ff0000;”Process p=run.exec(filePath+”/”+”lame -b 16 “+filePath+”/”+file.getName()+” “+filePath+”/”+tarFileName); //16為碼率,可自行修改
/span/strong//釋放進程
p.getOutputStream().close();
p.getInputStream().close();
p.getErrorStream().close();
p.waitFor();
long end=System.currentTimeMillis();
System.out.println(“convert need costs:”+(end-start)+”ms”);
//刪除無用的wav文件
if(file.exists())
{
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//最後都要執行的語句
//run調用lame解碼器最後釋放內存
run.freeMemory();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//關閉流
try {
if(bais != null)
{
bais.close();
}
if(ais != null)
{
ais.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//設置AudioFormat的參數
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);
// //採樣率是每秒播放和錄製的樣本數
// float sampleRate = 16000.0F;
// // 採樣率8000,11025,16000,22050,44100
// //sampleSizeInBits表示每個具有此格式的聲音樣本中的位數
// 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);
}
//錄音類,因為要用到MyRecord類中的變量,所以將其做成內部類
class Record implements Runnable
{
//定義存放錄音的位元組數組,作為緩衝區
byte bts[] = new byte[10000];
//將位元組數組包裝到流里,最終存入到baos中
//重寫run函數
public void run() {
baos = new ByteArrayOutputStream();
try {
stopflag = false;
while(stopflag != true)
{
//當停止錄音沒按下時,該線程一直執行
//從數據行的輸入緩衝區讀取音頻數據。
//要讀取bts.length長度的位元組,cnt 是實際讀取的位元組數
int cnt = td.read(bts, 0, bts.length);
if(cnt 0)
{
baos.write(bts, 0, cnt);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關閉打開的位元組數組流
if(baos != null)
{
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
td.drain();
td.close();
}
}
}
}
//播放類,同樣也做成內部類
class Play implements Runnable
{
//播放baos中的數據即可
public void run() {
byte bts[] = new byte[10000];
try {
int cnt;
//讀取數據到緩存數據
while ((cnt = ais.read(bts, 0, bts.length)) != -1)
{
if (cnt 0)
{
//寫入緩存數據
//將音頻數據寫入到混頻器
sd.write(bts, 0, cnt);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
sd.drain();
sd.close();
}
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/159331.html
微信掃一掃
支付寶掃一掃