python實現錄音小程序 界面_小程序如何實現錄音 播放功能

第二步:編輯文件首先在src下創建一個test包并在test包下新建一個類MyRecord具體步驟代碼如下所示:

package test;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.io.*;

import javax.sound.sampled.*;

public class MyRecord extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;

// 定義錄音格式

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);

}

// 錄音類,因為要用到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();

}

}

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

織夢php網站修改教程,織夢DEDEcms織夢軟件模型增加圖集功能教程(含修改文件下載)...

這篇文章主要為大家詳細介紹了織夢DEDEcms織夢軟件模型增加圖集功能教程(含修改文件下載),具有一定的參考價值,感興趣的小伙伴們可以參考一下,有需要的朋友可以收藏方便以后借鑒。織夢DEDEcms織夢軟件模型增加圖集功能,這是今天361模板要給大家分享的。下…

python自動截圖發送郵件_PhantomJS按尺寸截取頁面,并用python發送郵件

前言:當前有個任務是要把幾個網站的日志返回狀態碼進行匯總,用餅圖展示,并每天發送郵件。一、分析問題畫出餅圖,這個我用kibana給畫出來了,下面不做講解;截取餅圖,因為kibana是用js展示出來的&a…

nikita popov php,PHP中對performance的考慮點

Nikita Popov 在他的演講中談了幾個PHP 程序中和performance相關的point。1.PHP使用shared memory, preload的方式事先分配,而只有在所有的處理結束之后,share memory 才會斷開和所有進程或者thread之間的聯系。光是opcode,FPM的設定還不足以…

python建模仿真 matlab_清華大學出版社-圖書詳情-《仿真建模與MATLAB實用教程》

MATLAB語言是目前世界上最為流行的科學計算語言之一,它的特點是能夠快速地完成諸如矩陣運算、微分、尋優等計算任務。由于它配備了很多應用領域的專業工具箱,諸如金融、信號處理、圖像處理、神經網絡、嵌入式系統、仿真建模等,而且每個工具箱都包含了該應…

java web使用jquery,JAVA_Web_JQuery

簡介:jquery 全稱 javaScript Query.是js的一個框架。本質上仍然是js。特點:支持各種主流的瀏覽器、使用特別簡單、擁有便捷的插件擴展機制和豐富的插件。一、JQuery內部封裝原理介紹:匿名閉包。下面這兩行代碼是jquery包下的已經封裝的代碼&…

python語法學習_Python學習1——語法

Python語法包括了行、縮進、注釋、標識符、保留關鍵字等方面。打印語句:>>> print(hello,world!)hello,world!輸入語句:>>> input(請輸入你的名字:)請輸入你的名字:哈哈#”哈哈”是你自己輸入的名字哈哈 #打印出…

java 兩個頁面傳遞數據,請問Cookie怎么在兩個頁面間傳遞數據?

參考代碼如下://如果請求的Cookie對象為空if (Request.Cookies["userCookie"] null){//創建一個Cookie對象HttpCookie userCookie new HttpCookie("userCookie");//給對象賦值userCookie.Values["userName"] userInfo.UserName.ToS…

優化matlab作業,現代設計優化算法MATLAB實現

開篇語前陣子做現代設計方法的時候,發現網上很是缺乏這種作業形式的簡易算法實現,所以特地來簡書寫一篇。有兩份,一份是我的(說來慚愧,我的大部分都是在網上找的代碼,然后在自己的電腦上跑一次,跑出來了就行…

怎樣用python畫玫瑰花的簡筆畫_玫瑰花簡筆畫素描作品圖片

玫瑰原產是中國。在古時的漢語,“玫瑰”一詞原意是指紅色美玉。玫瑰花這么漂亮,素描怎么畫得好看呢?你知道玫瑰花的簡筆畫素描是怎樣的嗎?今天先和學習啦小編一起欣賞這些玫瑰花簡筆畫素描圖片,希望你會有所收獲的。玫瑰花簡筆畫素描圖片欣…

多因子選選股MATLAB代碼,金工研報:利用卷積神經網絡進行多因子選股

首先,我們先來看一下通過卷積神經網絡選股模型的整體流程,然后再根據每一步流程進行介紹,具體如下圖所示:1、數據獲取用于歷史回測數據來自所有A股股票,其中剔除了ST股以及上市3個月的股票,另外&#xff0c…

python list tuple 打包 解包_python的打包與解包

python的*與**,在函數的定義與調用過程中,有著不同的作用打包參數:一、函數定義時,形參前加*號(如:*args):收集實參中所有的位置參數,打包成新元組并將該元組賦值給args變量實參位置參數&#x…

python 成員函數 泛型函數_【一點資訊】白學這么多年 Python?連泛型函數都不會寫? www.yidianzixun.com...

泛型,如果你嘗過java,應該對他不陌生吧。但你可能不知道在 Python 中(3.4 ),也可以實現 簡單的泛型函數。在Python中只能實現基于單個(第一個)參數的數據類型來選擇具體的實現方式,官方名稱 是single-dispatch。你或許聽不懂&…

matlab bad apple,【bad apple】matlab制作矩陣蘋果~

有屏幕的地方就有bad apple那么作為一名工科生,熟練的操♂作馬桶蘿卜(matlab)是一項基本技能下面開始講解如何用matlab制作別具一格的“矩陣蘋果”~實驗環境matlab R2018a原版bad apple視頻技術要求可以即時演算圖形可以將處理后的每幀圖形合并成新的視頻先上代碼%t…

服務器ip直接訪問php怎么寫,php - 如何實現用公網ip訪問到服務器上的網頁?

服務器系統是Windows Server 2012 R2,已經部署了IIS、PHP和MySQL,能夠在云服務器上通過localhost打開php網頁,(放在服務器wwwroot上的index.php)已在ISS管理器中添加網站,但編輯網站綁定時,在ip地址中填入了服務器的公…

vb6 打印選項對話框_圖紙打印次數太多,不知道哪次才是最新的?用打印戳記區分效果好...

原創:就說我在開發區使用AutoCAD從事設計工作的朋友們不知道有沒遇到過這種情況:圖紙在反復修改打印的過程中,由于圖紙內容高度相似,往往搞不清究竟哪個才是最新版本的圖紙了。這種情況下,細致入微地去核對非常麻煩&am…

安卓文本編輯器php cpp,用安卓原生控件封裝一個簡易的富文本編輯器

最近接到項目需求:移動端原生寫一個富文本編輯器。 ( ⊙ o ⊙ )從沒遇到過富文本要用原生寫的,然后就查閱各種資料。然后結合自己的思路:其實安卓的富文本編輯器就是一個 “容器”。那么接下來我就帶給大家說一說我自定義這個富文本編…

python和nltk自然語言處理書評_Python和NLTK自然語言處理

模塊1 NLTK基礎知識第 1章 自然語言處理簡介 31.1 為什么要學習NLP 41.2 從Python的基本知識開始 71.2.1 列表 71.2.2 自助 81.2.3 正則表達式 91.2.4 詞典 111.2.5 編寫函數 111.3 NLTK 131.4 試一試 181.5 本章小結 18第 2章 文本的整理和清洗 192.…

vue tab切換_iviewUITabs選項卡切換組件

概述 選項卡切換組件,常用于平級區域大塊內容的的收納和展現。源碼地址:https://github.com/iview/iview/tree/2.0/src/components/tabs使用: 標簽一的內容標簽二的內容標簽三的內容標簽二的內容在源碼的tabs文件下有三個文件:ind…

java biginteger 比較大小,java – 打印非常大的BigIntegers

我試圖找出與Java 7 x64中的BigIntegers相關的以下問題.我試圖計算一個極高功率的數字.代碼如下,然后是問題描述.import java.math.BigInteger;public class main {public static void main(String[] args) {// Demo calculation; Desired calculation: BigInteger("4096&…

paypal創建訂單后怎么獲得id_5步創建Facebook商店(最新版教程)學習如何在Facebook上賣貨...

請按照以下步驟設置Facebook商店:步驟1:轉到您的Facebook頁面并配置Shop頁面。步驟2:設置您的商店詳細信息。步驟3:配置付款。步驟4:將產品添加到您的Facebook商店。步驟5:管理您的訂單。步驟6:…