Linux Audio 程式設計

2021-06-01 08:25:17 字數 2814 閱讀 2022

雖然目前linux的優勢主要體現在網路服務方面,但事實上同樣也有著非常豐富的**功能,本文就是以多**應用中最基本的聲音為物件,介紹如何在linux平台下開發實際的音訊應用程式,同時還給出了一些常用的音訊程式設計框架。
一、數字音訊

音訊訊號是一種連續變化的模擬訊號,但計算機只能處理和記錄二進位制的數碼訊號,由自然音源得到的音訊訊號必須經過一定的變換,成為數字音訊訊號之後,才能送到計算機中作進一步的處理。

數字音訊系統通過將聲波的波型轉換成一系列二進位制資料,來實現對原始聲音的重現,實現這一步驟的裝置常被稱為模/數轉換器(a/d)。a/d轉換器以每秒鐘上萬次的速率對聲波進行取樣,每個取樣點都記錄下了原始模擬聲波在某一時刻的狀態,通常稱之為樣本(sample),而每一秒鐘所取樣的數目則稱為取樣頻率,通過將一串連續的樣本連線起來,就可以在計算機中描述一段聲音了。對於取樣過程中的每乙個樣本來說,數字音訊系統會分配一定儲存位來記錄聲波的振幅,一般稱之為取樣分辯率或者取樣精度,取樣精度越高,聲音還原時就會越細膩。

數字音訊涉及到的概念非常多,對於在linux下進行音訊程式設計的程式設計師來說,最重要的是理解聲音數位化的兩個關鍵步驟:取樣和量化。取樣就是每隔一定時間就讀一次聲音頻號的幅度,而量化則是將取樣得到的聲音頻號幅度轉換為數字值,從本質上講,取樣是時間上的數位化,而量化則是幅度上的數位化。下面介紹幾個在進行音訊程式設計時經常需要用到的技術指標:

取樣頻率

取樣頻率是指將模擬聲音波形進行數位化時,每秒鐘抽取聲波幅度樣本的次數。取樣頻率的選擇應該遵循奈奎斯特(harry nyquist)取樣理論:如果對某一模擬訊號進行取樣,則取樣後可還原的最高訊號頻率只有取樣頻率的一半,或者說只要取樣頻率高於輸入訊號最高頻率的兩倍,就能從取樣訊號系列重構原始訊號。正常人聽覺的頻率範圍大約在20hz~20khz之間,根據奈奎斯特取樣理論,為了保證聲音不失真,取樣頻率應該在40khz左右。常用的音訊取樣頻率有8khz、11.025khz、22.05khz、16khz、37.8khz、44.1khz、48khz等,如果採用更高的取樣頻率,還可以達到***的音質。

量化位數

量化位數是對模擬音訊訊號的幅度進行數位化,它決定了模擬訊號數位化以後的動態範圍,常用的有8位、12位和16位。量化位越高,訊號的動態範圍越大,數位化後的音訊訊號就越可能接近原始訊號,但所需要的存貯空間也越大。

聲道數

聲道數是反映音訊數位化質量的另乙個重要因素,它有單聲道和雙聲道之分。雙聲道又稱為立體聲,在硬體中有兩條線路,音質和音色都要優於單聲道,但數位化後佔據的儲存空間的大小要比單聲道多一倍。

回頁首

二、音效卡驅動

出於對安全性方面的考慮,linux下的應用程式無法直接對音效卡這類硬體裝置進行操作,而是必須通過核心提供的驅動程式才能完成。在linux上進行音訊程式設計的本質就是要借助於驅動程式,來完成對音效卡的各種操作。

對硬體的控制涉及到暫存器中各個位元位的操作,通常這是與裝置直接相關並且對時序的要求非常嚴格,如果這些工作都交由應用程式設計師來負責,那麼對音效卡的程式設計將變得異常複雜而困難起來,驅動程式的作用正是要遮蔽硬體的這些底層細節,從而簡化應用程式的編寫。目前linux下常用的音效卡驅動程式主要有兩種:oss和alsa。

最早出現在linux上的音訊程式設計介面是oss(open sound system),它由一套完整的核心驅動程式模組組成,可以為絕大多數音效卡提供統一的程式設計介面。oss出現的歷史相對較長,這些核心模組中的一部分(oss/free)是與linux核心原始碼共同免費發布的,另外一些則以二進位制的形式由4front technologies公司提供。由於得到了商業公司的鼎力支援,oss已經成為在linux下進行音訊程式設計的事實標準,支援oss的應用程式能夠在絕大多數音效卡上工作良好。

雖然oss已經非常成熟,但它畢竟是乙個沒有完全開放源**的商業產品,alsa(advanced linux sound architecture)恰好彌補了這一空白,它是在linux下進行音訊程式設計時另乙個可供選擇的音效卡驅動程式。alsa除了像oss那樣提供了一組核心驅動程式模組之外,還專門為簡化應用程式的編寫提供了相應的函式庫,與oss提供的基於ioctl的原始程式設計介面相比,alsa函式庫使用起來要更加方便一些。alsa的主要特點有:

alsa和oss最大的不同之處在於alsa是由志願者維護的自由專案,而oss則是由公司提供的商業產品,因此在對硬體的適應程度上oss要優於alsa,它能夠支援的音效卡種類更多。alsa雖然不及oss運用得廣泛,但卻具有更加友好的程式設計介面,並且完全相容於oss,對應用程式設計師來講無疑是乙個更佳的選擇。

回頁首

三、程式設計介面

如何對各種音訊裝置進行操作是在linux上進行音訊程式設計的關鍵,通過核心提供的一組系統呼叫,應用程式能夠訪問音效卡驅動程式提供的各種音訊裝置介面,這是在linux下進行音訊程式設計最簡單也是最直接的方法。

3.1 訪問音訊裝置

無論是oss還是alsa,都是以核心驅動程式的形式執行在linux核心空間中的,應用程式要想訪問音效卡這一硬體裝置,必須借助於linux核心所提供的系統呼叫(system call)。從程式設計師的角度來說,對音效卡的操作在很大程度上等同於對磁碟檔案的操作:首先使用open系統呼叫建立起與硬體間的聯絡,此時返回的檔案描述符將作為隨後操作的標識;接著使用read系統呼叫從裝置接收資料,或者使用write系統呼叫向裝置寫入資料,而其它所有不符合讀/寫這一基本模式的操作都可以由ioctl系統呼叫來完成;最後,使用close系統呼叫告訴linux核心不會再對該裝置做進一步的處理。

3.2 音訊裝置檔案

對於linux應用程式設計師來講,音訊程式設計介面實際上就是一組音訊裝置檔案,通過它們可以從音效卡讀取資料,或者向音效卡寫入資料,並且能夠對音效卡進行控制,設定取樣頻率和聲道數目等等。

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...

LINUX程式設計 socket程式設計

什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...