中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用java實現錄音播放功能

發布時間:2022-08-08 15:06:08 來源:億速云 閱讀:171 作者:iii 欄目:開發技術

這篇“怎么使用java實現錄音播放功能”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么使用java實現錄音播放功能”文章吧。

需求:

1.實現可以從麥克風進行錄音

2.可以停止錄音

3.實現播放錄音內容

4.并將所錄的mp3文件全部存到F:/語音文件夾,語音的文件名以當前時間命名(java中是換算成秒),其中文件夾程序自己創建,不用擔心出錯

程序如下:

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;
    //定義目標數據行,可以從中讀取音頻數據,該 TargetDataLine 接口提供從目標數據行的緩沖區讀取所捕獲數據的方法。
    TargetDataLine td = null;
    //定義源數據行,源數據行是可以寫入數據的數據行。它充當其混頻器的源。應用程序將音頻字節寫入源數據行,這樣可處理字節緩沖并將它們傳遞給混頻器。
    SourceDataLine sd = null;
    //定義字節數組輸入輸出流
    ByteArrayInputStream bais = null;
    ByteArrayOutputStream baos = null;
    //定義音頻輸入流
    AudioInputStream ais = null;
    //定義停止錄音的標志,來控制錄音線程的運行
    Boolean stopflag = false;
    
    
    //定義所需要的組件
    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();
        }else if (e.getActionCommand().equals("stopBtn")) {
            //點擊停止錄音按鈕的動作
            captureBtn.setEnabled(true);
            stopBtn.setEnabled(false);
            playBtn.setEnabled(true);
            saveBtn.setEnabled(true);
            //調用停止錄音的方法     
            stop();
            
        }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();
            }
            file = new File(filePath.getPath()+"/"+System.currentTimeMillis()+".mp3");      
            AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file);
        } 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 {
                System.out.println("ok3");
                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();
            }
            
            
        }        
    }    
}

怎么使用java實現錄音播放功能

以上就是關于“怎么使用java實現錄音播放功能”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤城市| 洛南县| 喀什市| 天长市| 牡丹江市| 娄烦县| 克拉玛依市| 子长县| 东兰县| SHOW| 商丘市| 永德县| 娄烦县| 青阳县| 来宾市| 顺义区| 普兰店市| 新乡县| 施甸县| 阿图什市| 抚顺市| 厦门市| 如皋市| 即墨市| 武宁县| 保德县| 辛集市| 育儿| 青铜峡市| 阿拉尔市| 宜兰市| 乡城县| 宁明县| 绥滨县| 阿克| 石首市| 临猗县| 韶关市| 岫岩| 华安县| 中江县|