程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 學做網頁Applet錄音機

學做網頁Applet錄音機

編輯:JAVA編程入門知識

  網絡多媒體是目前Web應用的一個發展方向。在網頁上錄音,並發給朋友,相信他們收到你的聲音一定非常高興。如今這已經是一項很普通的多媒體應用技術,筆者使用Java語言開發出了能夠嵌入Web頁面上的Applet錄音機(界面外觀如下圖所示)。如果你有編程的興趣,不妨試試。在此,我將這種技術介紹給各位編程愛好者。

  多媒體基本概念及常識

  開發多媒體音頻軟件,必須了解一些多媒體基本概念,諸如采樣、量化、量化位、采樣頻率、單雙聲道、音頻編解碼、音頻壓縮格式等概念。采樣是把時間上連續的模擬信號變成時間上離散的、有限個樣值的信號。量化是在幅度上把連續值的模擬信號變為離散值的數字信號。在時間軸上已變為離散的樣值脈沖,在幅度軸上仍會在動態范圍內有連續值,可能出現任意幅值,即在幅度軸上仍是模擬信號的性質,因此必須用有限個電平等級來代表實際量值。量化位是每個采樣點能夠表示的數據范圍,經常采用的有8、12和16位。采樣頻率是將模擬聲音波形轉換為數字時,每秒鐘所抽取聲波幅度樣本的次數,采樣頻率的計算單位是Hz(赫茲)。根據采樣理論,為了保證聲音不失真,采樣頻率應為聲音頻率的兩倍左右。記錄聲音時,如果每次生成一個聲波數據,稱為單聲道;每次生成二個聲波數據,成為立體聲(雙聲道)。量化位和采樣頻率越高,音質就越好。

  正常人耳聽覺的聲音頻率范圍大約在20Hz至20KHz之間,人的語音頻率大概在300Hz至3.4KHz之間。對於語音來說,采用8KHz的采樣頻率已經足夠了。所以我們采用8KHz采樣頻率、16位量化位、單聲道來記錄和播放語音,就可以滿足網頁上的語音需求了。

  網頁錄音機的制作過程

  了解了以上常識,下面來看看錄音機的制作過程。

  首先要碰到的是音頻采集。音頻采集有很多種,JDK 1.3中構建TargetDataLine類實例來實現聲音數據采集。在此例中,我采用Visual J++的J/Direct調用Windows API函數來實現聲音的采集。

  聲音俘獲主要由AudioCapture、AudioDataEvent、AudioDataListener三個類組成。我們依次按照0.1秒時間采樣數據塊的大小(即1600字節)作為所送出到系統的錄音數據緩沖區大小,這樣也就相當於每隔0.1秒聲卡提交給我們一次聲音數據。另外,使用Windows API方式聲音采集有一個好處,錄音過程不需要建立單獨的線程。這是因為有回調函數的巨大作用,這樣節省了系統資源,提高了程序的穩定性。

  

//聲音俘獲類:
...
public class AudioCapture{
...
public AudioCapture(){
...
waveincaps=new WAVEINCAPS();
wavehdr=new WAVEHDR[bufferlen];
}
public void addAudioDataListener(AudioDataListener lter){
listeners.addElement(lter);
}
void applyBuffer(){
for(int i=0;i<bufferlen;i++){
wavehdr[i]=new WAVEHDR();
int
adr=dlllib.addrOfPinnedObject(dlllib.getPinnedHandle(data[i]));
wavehdr[i].lpData=adr;
...
}
}
int chkData(byte[] a){//將整型低16位高低位交叉並轉為字節
...
}
public void close(){
if(!useful)return;
isclose=true;
waveInStop(deviceid[0]);
...
}
...
synchronized void notifyListener(int minValue,byte[] audioData){
AudioDataEvent evt=new AudioDataEvent(this,minValue,audioData);
For(Enumeration enu=listeners.elements();enu.hasMoreElements();)
((AudioDataListener)enu.nextElement()).onAudioDataArrived(evt);
}
...
public void setMuteValue(int muteValue){
this.muteValue=muteValue;
}
/**@dll.import("WINMM",auto)*/
...
public static native int waveInReset(int hwi);
private class c extends Callback{
AudioCapture record;
c(AudioCapture tt){
record=tt;
}
...
}
}
//緩沖數據提交事件類:
import java.util.EventObject;
public class AudioDataEvent extends EventObject{
...
}
//事件偵聽接口
import java.util.EventListener;
public interface AudioDataListener extends EventListener{
public abstract void onAudioDataArrived(AudioDataEvent evt);
}

  第二步,數據的編碼壓縮存儲。由聲卡采集的數據是一連串16位脈沖編碼調制(PCM格式)的數據,數據量很大,如果不采取壓縮處理,不利於文件的存儲和傳輸。所以要進行數據的壓縮編碼,這就是我們會碰到的聲音編碼數據格式。壓縮編碼方法有很多種,有GSM、IAM4、AU格式編碼等,這些壓縮算法比較簡單,可以在很多網站上獲得壓縮和解壓縮的源代碼。筆者對這幾種壓縮格式進行了測試,其主要參數及品質對比見上表。

  • 首頁
  • 上一頁
  • 1
  • 2
  • 下一頁
  • 尾頁
  • 共2頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved