java錄音,錄音的錄的

本文目錄一覽:

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-hant/n/159331.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 18:58
下一篇 2024-11-19 18:58

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論