呼叫API實現錄音
應一個朋友委託,做一個錄音程式.
我原本以為要用direct來做,先是在google上搜尋了一把,收穫不大。後來在codeproject上發現一篇文章A full-duplex audio player in C# using the waveIn/waveOut APIs ,原來可以很簡單。在System32下原來有一個多媒體處理的API,winmm.dll,發現之非常興奮,哈哈。
原來微軟已經提供了一系列的wavein 和waveout方法,參考了裡面一些東西做法。做了一些修改。由於我以前對音訊並不怎麼了解,特地查了一下音訊的有關知識,不瞭解的朋友也可以瞭解一下,呵呵,知識共享拉。
其中音訊取樣率(位/bit),取樣率包括32000Hz,44100Hz,48000Hz3種,取樣大小分為16位和8位,聲道通常就是2(立體聲)和1(單聲道)了。其中有一個重要的資料叫取樣速率,計算公式為取樣速率=取樣率×取樣大小×聲道。我們通常比較熟悉的128K的MP3就是44100×16×2=1411.2Kb/s,這樣的音訊很大,通常10秒種就有1M多。而如果使用模擬訊號的話並非取樣率越高越好,只會盲目的增加我們檔案的大小,只有數字訊號的時候才會提高我們的效果。
對於音訊這一塊,希望其他朋友能提供給一些更多的知識與技術。特別是音訊對比和頻譜圖等等。
那麼我們往下看。
long chunksize = fs.Length + 36;
WriteChars(bw, "RIFF");//格式
bw.Write((int)chunksize);//檔案長度(要加上頭的36位元組)
WriteChars(bw, "WAVE");//標示
WriteChars(bw, "fmt ");//fmt
bw.Write((int)16);//fmt長度
bw.Write(m_Format.wFormatTag);//壓縮模式
bw.Write(m_Format.nChannels);//聲道
bw.Write(m_Format.nSamplesPerSec);//取樣率包含:32000Hz,44100Hz,48000Hz.
bw.Write(m_Format.nAvgBytesPerSec);//每秒播放位元組
bw.Write(m_Format.nBlockAlign);//位速
bw.Write(m_Format.wBitsPerSample);//取樣大小
WriteChars(bw,"data");//data標誌
bw.Write(fs.Length);//音訊長度
這就是我們需要給wave檔案寫上的頭。
大家查一下winmm.dll就會發現,裡面提供了很多有用的API,非常的棒。
[DllImport(mmdll)]
public static extern int waveInGetNumDevs();
[DllImport(mmdll)]
public static extern int waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, int cbwh);
[DllImport(mmdll)]
public static extern int waveInClose(IntPtr hwi);
[DllImport(mmdll)]
public static extern int waveInOpen(out IntPtr phwi, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags);
[DllImport(mmdll)]
public static extern int waveInPrepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);
[DllImport(mmdll)]
public static extern int waveInUnprepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);
[DllImport(mmdll)]
public static extern int waveInReset(IntPtr hwi);
[DllImport(mmdll)]
public static extern int waveInStart(IntPtr hwi);
[DllImport(mmdll)]
public static extern int waveInStop(IntPtr hwi);
{
try
{
if (m_RecBuffer == null || m_RecBuffer.Length < size)
{
m_RecBuffer = new byte[size];
}
System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size);
bw_tmp.Write(m_RecBuffer);
_recordSize+=m_RecBuffer.Length;
}
catch(Exception e)
{
return;
}
}
裡面我加入了一些功能,包括開始,停止,暫停,繼續等等。
在此,我想問一下其他朋友,音訊的頻譜圖是基於怎樣的演算法呢?如何畫的?這個我很想了解,有這方面知識的朋友望能告知,給點參考。在此謝過。
Source
參考:
A full-duplex audio player in C# using the waveIn/waveOut APIs
PCM編碼及其技術
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14766526/viewspace-563282/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實現呼叫API介面API
- 呼叫通訊錄實現思路
- 頁面錄製服務上線:RESTful API 呼叫實現,所見所錄即所得RESTAPI
- 如何實現前端錄音功能前端
- 一個BUTTON,實現點選播放錄音,長按錄音
- C#實現錄音錄影錄屏原始碼C#原始碼
- vue實現錄音功能(pc端)Vue
- TouchEvent實現前端錄音打分功能前端
- QQ音樂API koa2實現 - 全介面實現API
- 基於網頁呼叫錄音功能網頁
- 仿QQ錄音以及振幅動畫實現動畫
- js實現網頁端錄音功能JS網頁
- 5分鐘實現呼叫ChatGPT介面API實現多輪問答ChatGPTAPI
- uniapp 實現打電話錄音功能APP
- Android音訊開發之AudioRecord錄音實現Android音訊
- 用opencv實現的PCA演算法,非API呼叫OpenCVPCA演算法API
- 呼叫 Rational CM API 實現 Rational ClearQuest 的相關操作API
- nodejs呼叫cmd命令實現複製目錄NodeJS
- web技術支援| Web 客戶端實現錄音、錄影Web客戶端
- Android中實現錄製內建聲音Android
- 如何在測試環境中實現 API 模擬呼叫API
- 一個利用windows api控制放音音量和錄音麥克風音量實現類(c++程式碼)WindowsAPIC++
- Android 音視訊錄製硬編碼實現Android
- 如何呼叫第三方API實現圖片上傳。API
- API商品資料介面呼叫實戰API
- Android WebView 實現檔案選擇、拍照、錄製視訊、錄音AndroidWebView
- 對接網易雲信音視訊2.0呼叫元件整合到vue中,實現web端呼叫app,視訊語音通話。元件VueWebAPP
- H5實現移動端語音錄製功能H5
- 微信小程式如何呼叫API實現資料請求-wx.request()微信小程式API
- ASP.NET Web API 自定義MediaType實現jsonp跨域呼叫ASP.NETWebAPIJSON跨域
- Java大作業:AI千戀萬花(呼叫api實現)附專案)JavaAIAPI
- api呼叫方式API
- Vue結合HTML5拖放API 實現目錄拖拽~VueHTMLAPI
- 淘寶API介面呼叫:案例分析與實踐API
- 音訊_錄音音訊
- 用python呼叫百度語音識別api批量處理本地語音檔案PythonAPI
- RestSharp編寫api介面測試,並實現非同步呼叫(不卡頓)RESTAPI非同步
- 呼叫鏈系列(2):輕呼叫鏈實現