DM6446的音訊編解碼及播放實現
摘要: DM6446核心處理器整合了ARM核心與C64x+ DSP核心,提高了系統整合度和整個系統的運算速度,更加適合實時狀態下的音訊訊號編解碼處理並實現語音播放。本文主要介紹了音訊處理應用程式的構成,著重講述了音訊編解碼及播放過程。
關鍵詞:達芬奇技術;DM6446;音訊編解碼
1基於DaVinci技術的音訊編解碼綜述:
達芬奇(DaVinci)技術是一種專門針對數字音影片應用、基於訊號處理的解決方案,能為音影片裝置製造商提供整合處理器、軟體、工具等支援,以簡化設計程式,加速產品創新。
由於大量的音影片編解碼工作需要一個強勁的DSP處理器作為支撐,所以在本文提出的解決方案中採用了TMS320C64x+ DSP處理器,它是TMS320C6000系列DSP處理器中效能最為優異的定點DSP核。因為其基於第二代先進超長指令字(Very-Long-Instruction-Word,VLIW)結構,能夠很好滿足現場音訊編解碼處理和播放的需求。
2 OSS(開放原始碼軟體)驅動簡介
OSS為多種Unix系統(或Unix相容的作業系統)提供音效卡和其他聲音裝置的驅動。使用OSS應用程式介面(API)的應用程式在移植到不同的Unix系統(或與Unix相容的系統)之前只需要重新編譯,而不必重寫程式碼。OSS支援的主要裝置檔案中有些是和音效卡擁有的裝置如數字聲音裝置(Digitized Voice Device)、混合裝置(mixer)、合成器(synthesizer)等相對應。
2.1 /dev/mixer
混合器裝置檔案和音效卡中的混合器相對應,OSS驅動支援在一個系統中存在多個混合器,不同的混合器被命名為/dev/mixer0、/dev/mixer1等,而裝置檔案/dev/mixer是某個裝置檔案的符號連結(通常是第一個混合器,/dev/mixer0)。
2.2 /dev/sndstat
該裝置檔案不同於其他聲音裝置,它產生可被讀懂的診斷資訊。此裝置列印出所有被OSS檢測到的埠和裝置資訊。執行命令“cat /dev/sndstat”將會顯示裝置配置的有用資訊。
2.3/dev/dsp和/dev/audio
這些裝置是數字音訊應用的主要裝置。任何寫入這個裝置檔案的資料都會透過音效卡中的DAC/PCM DSP裝置播放出來。而從此裝置檔案中讀出的資料就是從當前輸入裝置(預設輸入是麥克風)錄下的音訊資料。
/dev/dsp和/dev/audio裝置非常相似。不同在於,/dev/audio在預設情況下使用對數μ律編碼,而/dev/dsp使用8位無符號線性編碼。μ律編碼會把採集的12位或16位資料轉換成8位資料。在經過資料轉換後,/dev/dsp和/dev/audio對資料的處理是相同的。與裝置/dev/mixer相似,OSS同樣支援在一個系統中存在多個dsp和audio裝置。
3 OSS應用程式設計設計
下面主要講解程式中關於OSS驅動控制程式設計方法。
開啟裝置檔案時使用標誌位O_WRONLY來指示該裝置以只寫的方式開啟。除了標誌位O_WRONLY外,裝置還支援以O_RDONLY(只讀)和O_RDWR(可讀可寫)方式開啟。如下圖所示為開啟音訊裝置程式碼:
#define SOUND_DEVICE“/dev/dsp”
soundFd = (SOUND_DEVICE, O_WRONLY);
設定的引數有資料格式、聲道格式和取樣率。
3.1取樣率配置:
取樣率是音訊播放的重要引數。OSS的API允許設定取樣率為1Hz至2GHz中的任何一個頻率,但是實際應用中只有有限的幾個取樣率被用到。下圖是配置音訊取樣率的程式碼示意:
SNDCTL_DSP_SPEED用於指示ioctl函式對裝置檔案/dev/dsp的取樣率進行配置。
3.2聲道格式設定:
程式中將聲道格式設定為雙聲道立體聲。OSS中預設模式為單聲道,而最多支援16個聲道。聲道格式配置程式碼示意如下圖所示:
SNDCTL_DSP_CHANNELS指示函式ioctl對裝置檔案/dev/dsp的聲道數進行配置。
3.3採集與播放設定:
採集與播放我們透過read與write函式完成。函式中第一個參數列示裝置標識,第二個參數列示快取地址,第三個地址表示地址長度。如下圖所示:
關鍵詞:達芬奇技術;DM6446;音訊編解碼
1基於DaVinci技術的音訊編解碼綜述:
達芬奇(DaVinci)技術是一種專門針對數字音影片應用、基於訊號處理的解決方案,能為音影片裝置製造商提供整合處理器、軟體、工具等支援,以簡化設計程式,加速產品創新。
由於大量的音影片編解碼工作需要一個強勁的DSP處理器作為支撐,所以在本文提出的解決方案中採用了TMS320C64x+ DSP處理器,它是TMS320C6000系列DSP處理器中效能最為優異的定點DSP核。因為其基於第二代先進超長指令字(Very-Long-Instruction-Word,VLIW)結構,能夠很好滿足現場音訊編解碼處理和播放的需求。
2 OSS(開放原始碼軟體)驅動簡介
OSS為多種Unix系統(或Unix相容的作業系統)提供音效卡和其他聲音裝置的驅動。使用OSS應用程式介面(API)的應用程式在移植到不同的Unix系統(或與Unix相容的系統)之前只需要重新編譯,而不必重寫程式碼。OSS支援的主要裝置檔案中有些是和音效卡擁有的裝置如數字聲音裝置(Digitized Voice Device)、混合裝置(mixer)、合成器(synthesizer)等相對應。
2.1 /dev/mixer
混合器裝置檔案和音效卡中的混合器相對應,OSS驅動支援在一個系統中存在多個混合器,不同的混合器被命名為/dev/mixer0、/dev/mixer1等,而裝置檔案/dev/mixer是某個裝置檔案的符號連結(通常是第一個混合器,/dev/mixer0)。
2.2 /dev/sndstat
該裝置檔案不同於其他聲音裝置,它產生可被讀懂的診斷資訊。此裝置列印出所有被OSS檢測到的埠和裝置資訊。執行命令“cat /dev/sndstat”將會顯示裝置配置的有用資訊。
2.3/dev/dsp和/dev/audio
這些裝置是數字音訊應用的主要裝置。任何寫入這個裝置檔案的資料都會透過音效卡中的DAC/PCM DSP裝置播放出來。而從此裝置檔案中讀出的資料就是從當前輸入裝置(預設輸入是麥克風)錄下的音訊資料。
/dev/dsp和/dev/audio裝置非常相似。不同在於,/dev/audio在預設情況下使用對數μ律編碼,而/dev/dsp使用8位無符號線性編碼。μ律編碼會把採集的12位或16位資料轉換成8位資料。在經過資料轉換後,/dev/dsp和/dev/audio對資料的處理是相同的。與裝置/dev/mixer相似,OSS同樣支援在一個系統中存在多個dsp和audio裝置。
3 OSS應用程式設計設計
下面主要講解程式中關於OSS驅動控制程式設計方法。
開啟裝置檔案時使用標誌位O_WRONLY來指示該裝置以只寫的方式開啟。除了標誌位O_WRONLY外,裝置還支援以O_RDONLY(只讀)和O_RDWR(可讀可寫)方式開啟。如下圖所示為開啟音訊裝置程式碼:
#define SOUND_DEVICE“/dev/dsp”
soundFd = (SOUND_DEVICE, O_WRONLY);
設定的引數有資料格式、聲道格式和取樣率。
3.1取樣率配置:
取樣率是音訊播放的重要引數。OSS的API允許設定取樣率為1Hz至2GHz中的任何一個頻率,但是實際應用中只有有限的幾個取樣率被用到。下圖是配置音訊取樣率的程式碼示意:
SNDCTL_DSP_SPEED用於指示ioctl函式對裝置檔案/dev/dsp的取樣率進行配置。
3.2聲道格式設定:
程式中將聲道格式設定為雙聲道立體聲。OSS中預設模式為單聲道,而最多支援16個聲道。聲道格式配置程式碼示意如下圖所示:
SNDCTL_DSP_CHANNELS指示函式ioctl對裝置檔案/dev/dsp的聲道數進行配置。
3.3採集與播放設定:
採集與播放我們透過read與write函式完成。函式中第一個參數列示裝置標識,第二個參數列示快取地址,第三個地址表示地址長度。如下圖所示:
write(soundFd, decodebuffer, BUF_SIZE);
read(soundFd, encodebuffer, BUF_SIZE);
4語音編解碼實現
語音模組需要先透過OSS驅動對語音訊號進行採集,之後放到共享快取中交給DSP做語音壓縮,收到的資料解壓後在透過OSS驅動播放出來。
4.1語音編碼
語音編碼模組收到了採集進來語音資料後,送到編碼快取中對其進行編碼,再在送到傳輸模組將編碼後的資料傳送出去,處理流程如下圖所示:①語音模組首先設定兩個全域性函式--編碼快取和解碼快取,使其可以被傳輸模組直接使用,作為語音模組與傳輸模組之間的資料交流通道;②使用Codec Engine的Engine_open()來建立音訊編碼演算法引擎,返回一個控制程式碼,所有使用相同Engine的模組執行緒都需要單獨的控制程式碼,來確定執行緒的安全;③使用speechEncodeAlgCreate()建立編碼演算法,使用SPHENC_create()裡的靜態引數來建立“g.711enc”語音編碼器;④使用Memory_contigAlloc()函式為編碼快取與原始音訊資料快取分配一段連續的記憶體空間;⑤使用SPHENC_process()函式呼叫G..711演算法對資料進行編碼,而後送到傳輸模組,完成語音編碼任務。
4.2語音解碼
語音模組收到傳輸模組傳來的編碼資料後,先將其解碼而後播放出來。解碼流程如下圖所示:①語音模組首先設定兩個全域性函式--編碼快取和解碼快取,使其可以被傳輸模組直接使用,作為語音模組與傳輸模組之間的資料交流通道;②使用Codec Engine的Engine_open()來建立音訊編碼演算法引擎,返回一個控制程式碼,所有使用相同Engine的模組執行緒都需要單獨的控制程式碼,來確定執行緒的安全;③使用speechDecodeAlgCreate()建立解碼演算法,這包括:a.使用SPHDEC_create()裡的靜態引數來建立“g.711dec”語音解碼器;b.使用SPHDEC_control()和XDM_GETSTATUS來設定動態的語音解碼引數,查詢編解碼緩衝區大小;④使用Memory_contigAlloc()函式為解碼快取分配一段連續的記憶體空間;⑤使用SPHDEC_process()函式呼叫G.711演算法對資料進行解碼,完成解碼任務,而後播放。
小結。DM6446平臺應用達芬奇雙核技術,能夠快速的完成對實時傳輸要求很高的音訊資料處理任務,本設計可以較有效的解決語音抖動和播放延遲的問題,實現音訊編解碼和播放,為在該平臺上開發網路語音通話服務奠定基礎,也為在該平臺上進行其他多媒體應用提供了參考。
read(soundFd, encodebuffer, BUF_SIZE);
4語音編解碼實現
語音模組需要先透過OSS驅動對語音訊號進行採集,之後放到共享快取中交給DSP做語音壓縮,收到的資料解壓後在透過OSS驅動播放出來。
4.1語音編碼
語音編碼模組收到了採集進來語音資料後,送到編碼快取中對其進行編碼,再在送到傳輸模組將編碼後的資料傳送出去,處理流程如下圖所示:①語音模組首先設定兩個全域性函式--編碼快取和解碼快取,使其可以被傳輸模組直接使用,作為語音模組與傳輸模組之間的資料交流通道;②使用Codec Engine的Engine_open()來建立音訊編碼演算法引擎,返回一個控制程式碼,所有使用相同Engine的模組執行緒都需要單獨的控制程式碼,來確定執行緒的安全;③使用speechEncodeAlgCreate()建立編碼演算法,使用SPHENC_create()裡的靜態引數來建立“g.711enc”語音編碼器;④使用Memory_contigAlloc()函式為編碼快取與原始音訊資料快取分配一段連續的記憶體空間;⑤使用SPHENC_process()函式呼叫G..711演算法對資料進行編碼,而後送到傳輸模組,完成語音編碼任務。
4.2語音解碼
語音模組收到傳輸模組傳來的編碼資料後,先將其解碼而後播放出來。解碼流程如下圖所示:①語音模組首先設定兩個全域性函式--編碼快取和解碼快取,使其可以被傳輸模組直接使用,作為語音模組與傳輸模組之間的資料交流通道;②使用Codec Engine的Engine_open()來建立音訊編碼演算法引擎,返回一個控制程式碼,所有使用相同Engine的模組執行緒都需要單獨的控制程式碼,來確定執行緒的安全;③使用speechDecodeAlgCreate()建立解碼演算法,這包括:a.使用SPHDEC_create()裡的靜態引數來建立“g.711dec”語音解碼器;b.使用SPHDEC_control()和XDM_GETSTATUS來設定動態的語音解碼引數,查詢編解碼緩衝區大小;④使用Memory_contigAlloc()函式為解碼快取分配一段連續的記憶體空間;⑤使用SPHDEC_process()函式呼叫G.711演算法對資料進行解碼,完成解碼任務,而後播放。
小結。DM6446平臺應用達芬奇雙核技術,能夠快速的完成對實時傳輸要求很高的音訊資料處理任務,本設計可以較有效的解決語音抖動和播放延遲的問題,實現音訊編解碼和播放,為在該平臺上開發網路語音通話服務奠定基礎,也為在該平臺上進行其他多媒體應用提供了參考。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1040466/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 音視訊入門之音訊採集、編碼、播放音訊
- Android音訊實時傳輸與播放(三):AMR硬編碼與硬解碼Android音訊
- 音訊編解碼標準音訊
- 實現播放視訊及彈幕
- 帶你用AVPlayer實現音訊和視訊播放音訊
- 使用MediaCodec硬解碼h.265視訊及音訊進行播放音訊
- Android MediaCodec硬解碼AAC音訊檔案(實時AAC音訊幀)並播放Android音訊
- 音訊編碼基礎詳解音訊
- Android 音視訊錄製硬編碼實現Android
- 音訊編解碼·實戰篇(1)WAV轉至AAC(AAC編碼)音訊
- 音訊編解碼·實戰篇(1)PCM轉至AAC(AAC編碼)音訊
- Android 音視訊 - MediaCodec 編解碼音視訊Android
- python實現播放音訊和錄音功能示例程式碼Python音訊
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- FFmpeg開發筆記(八):ffmpeg解碼音訊並使用SDL同步音訊播放筆記音訊
- 音訊編解碼-speex庫的使用方法音訊
- 陪玩系統原始碼實現音訊編碼的相關步驟原始碼音訊
- 相親交友原始碼中,音訊AAC解碼的實現程式碼原始碼音訊
- 音視訊同步!RTCP 協議解析及程式碼實現TCP協議
- vue2.x 音訊播放器 使用element ui + Audio實現一款完整的音訊播放器Vue音訊播放器UI
- 視音訊播放音訊
- FFMPEG視音訊編解碼學習(1)音訊
- H5頁面實現滑動控制音訊播放H5音訊
- 11.QT-ffmpeg+QAudioOutput實現音訊播放器QT音訊播放器
- 各種音視訊編解碼學習詳解
- iOS開發:音訊播放、錄音、視訊播放、拍照、視訊錄製iOS音訊
- Camera2錄製視訊(一):音訊的錄製及編碼音訊
- Flutter 實現視訊全屏播放邏輯及解析Flutter
- iOS 9音訊應用播放音訊之iOS 9音訊播放進度iOS音訊
- 各種音訊視訊編碼方法音訊
- Android中SurfaceView視訊播放實現程式碼AndroidView
- iOS開發系列--音訊播放、錄音、視訊播放、拍照、視訊錄製(轉)iOS音訊
- 音訊資料增強及python實現音訊Python
- FFmpeg音訊解碼音訊
- FFmpeg+SDL2實現簡易音視訊同步播放器播放器
- Android音視訊之MediaPlayer音視訊播放Android
- Android音視訊(四)MediaCodec編解碼AACAndroid
- 使用Dplayer實現Vue3中的視訊及彈幕播放Vue