色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式音頻應用開發介紹

Dp1040 ? 來源: liwen01 ? 2023-12-27 09:32 ? 次閱讀

前言

音頻是聲音的一種數字化表示方式,它的應用領域非常多,很多領域的應用技術已經很成熟,比如常見的:通信、娛樂、醫療(超聲)、人機交互等等。就我目前接觸到的消費類嵌入式設備而言,比較多的應用場景是:

語音對講,

音視頻錄像

語音檢測,識別

涉及到的開發技術主要有:

音頻的編碼、解碼

音頻格式封裝、格式轉換

回聲消除

聲音檢測、識別

雖然音頻的應用技術大部分都已經比較成熟了,但是在嵌入式開發中,受限于硬件資源的匱乏,還是會遇到不少的問題。其中涉及到很多的知識和概念,如果不是專業做音視頻的同學,估計也容易弄迷糊。

下面內容是將我自己在實際開發工作中接觸到的音頻相關的知識進行了一個簡單整理歸納,僅供參考。

(一)音頻處理流程介紹

(1)理想處理流程

比較理想的音頻應用處理流程,大概入下圖所示:

01cc228a-a450-11ee-8b88-92fbcf53809c.png

MIC 將聲音震動信號轉換為電(數字/模擬)信號,將其輸入到SOC的AI(音頻輸入模塊)

AI模塊對輸入的信號進行轉換(ADC轉換采樣),輸出為PCM格式的音頻數據

將PCM音頻數據進行壓縮、轉換、封裝成各種格式,比如常見的AAC、MP3等

將壓縮過的音頻文件,與視頻文件一起封裝成音視頻文件,比如MP4文件

(2)實際處理流程

在嵌入式應用中,考慮到系統資源限制、應用場景的不同,實際使用會比較的復雜,主要的受限是:既要支持本地音頻存儲、又要支持網絡傳輸。

PCM是原始音頻數據,一般嵌入式芯片的音頻編碼是可以將PCM數據編碼成G711、G726等格式,但基本上不會支持AAC編碼,主要可能是涉及到版權問題。君正和海思系列的SOC都不能直接支持AAC編碼。

但是從編碼壓縮比例來看,ACC編碼的壓縮比例是比G711、G726的要高的,也就是說在相同條件下,AAC編碼可以存儲時間更加長的音頻信息。另外,很多視頻封裝庫,對AAC的支持都是比較友好。

基于上面這些情況,就會導致在同一個體統中,可能會存在幾種格式的音頻格式數據。比如下圖:

01d163bc-a450-11ee-8b88-92fbcf53809c.png

上圖中,主要的應用場景,一個是音頻網絡傳輸,一個是音頻本地存儲。

路線1:

將AI模塊采集到的PCM直接通過網絡傳輸給IOT平臺

這種方式耗費資源少,但是占用網絡帶寬大

適用于沒有音頻編碼模塊的SOC

路線2:

將PCM格式數據,編碼成G711、G726等格式之后再通過網絡傳輸出去

耗費資源少,網絡帶寬占用的也少,是最優的一個選項

適用于帶音頻編碼的SOC

路線3:

將PCM格式數據,通過軟件編碼的方式編碼成AAC格式,然后再封裝成MP4、AVI等格式

這種方式會占用CPU資源,運行內存RAM,以及Flash空間(AAC編碼庫比較大)

適用于一定需要AAC編碼的場景

路線4:

出現這種使用方式的主要原因是,SOC同一時間只支持一個音頻格式輸出,比如如果要輸出PCM格式,就不能再編碼輸出G711、G726等格式

將編碼輸出的G711、G726格式,進行軟件解碼成PCM格式,在通過軟件壓縮成AAC格式,最后才封裝成mp4格式

這種方式適用于一定要使用AAC格式,但是SOC又不能同時輸出兩種類型音頻格式的場景

耗費的各種資源都是最多的

(二)音頻格式轉換

(1)PCM 與 G711A、G711U

PCM:

設備通過MIC采集音頻信號,MIC分為兩大類,數字MIC和模擬MIC,數字MIC輸出的是已經轉換過的數字信號,但消費類設備中比較常用的是模擬MIC。

PCM數據是將模擬MIC輸入的模擬音頻信號通過ADC轉換為數字信號的二進制序列,它沒有文件頭也沒有結束標志,是一種未壓縮的數據格式。

PCM文件可以通過Audacity Beta (Unicode) 以文件->導入->裸數據 的方式打開,可以進行播放,剪輯,查看等操作

主要的參數有:聲道,采樣頻率,采樣位數

下圖打開的是一個:2聲道,48KHz 采樣頻率,16位深度的PCM文件

01d6c1a4-a450-11ee-8b88-92fbcf53809c.png

G711A與G711U

G711 分為a-law和u-law,通過查表的方式將16位的PCM數據壓縮成8位

G711 它的壓縮率為1:2,1個1M 的PCM文件轉換為G711格式后只有0.5M

G711 中的u-law 即g711u,主要使用在北美和日本

G711 中的a-law 即g711a,主要使用在歐洲及其它地區

如果要直接播放G711 文件音頻,在Linux系統中可以直接使用 ffplay 命令來播放


ffplay -i test.pcm -f s16le -ac 2 -ar 48000 ffplay -i test.g711a -f alaw -ac 2 -ar 48000 ffplay -i test.g711u -f mulaw -ac 2 -ar 48000

-ac: 音頻通道數 -ar:音頻采樣率 -f:文件格式

01dc1a14-a450-11ee-8b88-92fbcf53809c.png

G711與PCM之間的轉換先對來說是比較簡單的,上面我是將一個 48K 16bit 2通道PCM 與G711 格式相互轉換的簡單工程

(三) AAC格式與編碼

01e1cba8-a450-11ee-8b88-92fbcf53809c.png

AAC 相比于G711 要復雜很多,AAC它有很多的版本,編碼器也有很多種,使用比較多的是FAAC(Freeware Advanced Audio Coder),因為它是免費的。

(1)AAC的各種格式

AAC的文件格式有:

ADIF(Audio Data Interchange Format) 只有在文件開頭的位置才有音頻的頭部信息

ADTS(Audio Data Transport Stream) 主要特點是每一幀都帶有頭部信息

文件格式是指主要以文件類型來保存的音頻數據

AAC的流格式:

流格式主要是指用于流媒體傳輸的格式,主要有:

AAC_RAW是指未經過封裝AAC裸數據

AAC_ADTS與文件格式中的ADTS格式相同

AAC_LATM (Low-Overhead Audio Transport Multiplex)AAC音頻的一種傳輸協議。

比較常用的是ADTS格式,因為它在音頻數據文件存儲和流傳輸中都可以使用

(2)ATDS格式介紹

我們看fdk-aac中對ADTS結構的定義

typedefstruct {
 /* ADTS header fields */
 UCHAR mpeg_id;
 UCHAR layer;
 UCHAR protection_absent;
 UCHAR profile;
 UCHAR sample_freq_index;
 UCHAR private_bit;
 UCHAR channel_config;
 UCHAR original;
 UCHAR home;
 UCHAR copyright_id;
 UCHAR copyright_start;
 USHORT frame_length;
 USHORT adts_fullness;
 UCHAR num_raw_blocks;
 UCHAR num_pce_bits;
} STRUCT_ADTS_BS;

這里只是把結構頭部的項列出來了,這里列出來的有15項,整個結構頭的長度有17個字節。

實際ADTS頭結構有兩種長度,包含CRC校驗的是9個字節的長度,沒有CRC校驗的是7個字節,每項的作用與實際長度可以看wiki上的一個定義:https://wiki.multimedia.cx/index.php/ADTS

01e6b9ec-a450-11ee-8b88-92fbcf53809c.png

我們使用Elecard Stream Analyzer 工具打開一個ADTS格式的AAC文件進行查看會更加的清晰:

01f30382-a450-11ee-8b88-92fbcf53809c.png

標簽1隨意點的第四幀,它的偏移地址是0x54a

標簽2處是ADTS 的同步字Syncword,12位,0xFFF

右上的方框,是ADTS各項參數的解析

標簽3處是單前幀(第4幀)的長度,403

標簽4是下一幀的偏移地址0x6dd,正好是上一幀的偏移地址+上一幀的長度 = 0x54a + 403 = 0x6dd

如果是需要自己手動解析AAC的ADTS格式文件,也可以通過上面方式進行解析,先找到幀頭標簽,再逐項的解析各個參數,最后在根據幀長度跳轉到下一幀進行數據解析。

(3)AAC格式編碼

主要的AAC編碼器有:FhG、Nero AAC、QuickTime/iTunes、FAAC、DivX AAC,在嵌入式中比較常用的是FAAC。

基于FAAC的編碼工具和庫,比較常用的有:

FFMPEG:它可以集成多種編碼器

fdk-aac:同時集成了faac編解碼

faac:aac 編碼庫

faad:aac 解碼庫

上面介紹的幾種AAC封裝庫,都可以在github上下載到源碼:

https://github.com/mstorsjo/fdk-aac https://github.com/knik0/faac https://github.com/knik0/faad2

(4) fdk-aac移植

github 上下載源碼https://github.com/mstorsjo/fdk-aac

可以通過tag選擇不同版本進行下載,tag中的一般都是比較穩定的發布版本

如果要將fdk-aac移植到君正的T31設備上,可以按下面命令進行交叉編譯:


mkdir _install_uclibc ./autogen.sh CFLAGS+=-muclibc LDFLAGS+=-muclibc CPPFLAGS+=-muclibc CXXFLAGS+=-muclibc ./configure --prefix=$PWD/_install_uclibc --host=mips-linux-gnu make -j4 make install

交叉編譯的文件放置在_install_uclibc文件夾下,可以通過下面命令確定編譯使用的編譯工具鏈:file libfdk-aac.so.2.0.2


biao@ubuntu:~/test/fdk-aac-master/_install_uclibc/lib$ file libfdk-aac.so.2.0.2 libfdk-aac.so.2.0.2: ELF 32-bit LSB shared object, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, not stripped

如果要直接在PC上編譯測試,可以使用下面命令:


mkdir _install_linux_x86 ./autogen.sh ./configure --prefix=$PWD/_install_linux_x86 make -j4 make install

(5) fdk-aac應用

這里簡單介紹如何使用fdk-aac將PCM文件編碼成AAC格式文件,然后再通過fdk-aac將AAC解碼成PCM格式數據。

fdk-aac源碼下有個test-encode-decode.c文件,它是以wav格式的文件為基礎的一個demo,如果PCM和AAC數據是以wav的格式存儲的,可以直接參考官方demo。

我這里使用的是上面有介紹的PCM裸流進行編碼和解碼。

(a) PCM編碼成AAC

因為我們使用的是PCM裸流,從文件中是無法讀取出流的任何信息,所以PCM流的信息是需要我們自己填寫的:


int aot, afterburner, eld_sbr, vbr, bitrate, adts, sample_rate, channels,mode; /**參數設置**/ aot = 2; /**Audio object type 2 MPEG-4 AAC Low Complexity.**/ afterburner = 0; /**是否啟用分析合成算法,可提高編碼質量,但是會耗資源**/ eld_sbr = 0 ; /**Spectral Band Replication 頻譜顯示**/ vbr = 0; /**可變碼率配置**/ bitrate = 48000; /**編碼碼率**/ adts = 1; /**是否可傳輸**/ sample_rate = 48000; /**采樣率**/ channels = 2; /**通道**/

通過aacEncoder_SetParam(encoder, AACENC_TRANSMUX, 2)可以設定需要編碼成的AAC格式,它支持的格式有:


- 0: raw access units - 1: ADIF bitstream format - 2: ADTS bitstream format - 6: Audio Mux Elements (LATM) withmuxConfigPresent = 1 - 7: Audio Mux Elements (LATM) withmuxConfigPresent = 0, out of band StreamMuxConfig - 10: Audio Sync Stream (LOAS) */

(b) AAC解碼成PCM

我們這里介紹將ADTS格式編碼的AAC文件解壓成PCM

要解碼AAC文件,首先需要能夠檢測到AAC文件中音頻幀的位置及長度,所以我們首先需要解析AAC 的ADTS頭信息,頭結構定義如下:


typedefstruct adts_fixed_header { unsigned short syncword:12; unsignedchar id: 1; unsignedchar layer:2; unsignedchar protection_absent: 1; unsignedchar profile: 2; unsignedchar sampling_frequency_index: 4; unsignedchar private_bit: 1; unsignedchar channel_configuration:3; unsignedchar original_copy:1; unsignedchar home: 1; } adts_fixed_header; // length : 28 bits typedefstruct adts_variable_header { unsignedchar copyright_identification_bit:1; unsignedchar copyright_identification_start:1; unsigned short aac_frame_length:13; unsigned short adts_buffer_fullness:11; unsignedchar number_of_raw_data_blocks_in_frame:2; } adts_variable_header; // length : 28 bits

解析方法如下:


memset(&fixed_header, 0, sizeof(adts_fixed_header)); memset(&variable_header, 0, sizeof(adts_variable_header)); get_fixed_header(headerBuff, &fixed_header); get_variable_header(headerBuff, &variable_header);

解碼的時候,還需要注意需要使用aacDecoder_ConfigRaw 配置PCM的信息,demo 是通過info.confBuf來獲取,這個值是在編碼的時候才會有,所以這個值需要根據實際參數來設置:


unsignedchar conf[] = {0x11, 0x90}; //AAL-LC 48kHz 2 channle unsignedchar* conf_array[1] = { conf }; unsignedint length = 2; if (AAC_DEC_OK != aacDecoder_ConfigRaw(decoder, conf_array, &length)) { printf("error: aac config fail "); exit(1); }

完整工程文件如下:


biao@ubuntu:~/test/faac/fdk-aac-x86$ tree . ├── 48000_16bits_2ch.pcm ├── adts.c ├── adts.h ├── decode_48000_16bits_2ch.pcm ├── include │ └── fdk-aac │ ├── aacdecoder_lib.h │ ├── aacenc_lib.h │ ├── FDK_audio.h │ ├── genericStds.h │ ├── machine_type.h │ └── syslib_channelMapDescr.h ├── lib │ ├── libfdk-aac.a │ ├── libfdk-aac.la │ ├── libfdk-aac.so -> libfdk-aac.so.2.0.2 │ ├── libfdk-aac.so.2 -> libfdk-aac.so.2.0.2 │ ├── libfdk-aac.so.2.0.2 │ └── pkgconfig │ └── fdk-aac.pc ├── Makefile ├── out.aac ├── out_ADIF.aac ├── out_adts.aac ├── out_RAW.aac └── test_faac.c 4 directories, 22 files biao@ubuntu:~/test/faac/fdk-aac-x86$

結尾

嵌入式音頻開發涉及到的內容很多,每個功能單獨拉出來都會涉及到很多的知識點。

上面只是簡單的介紹了一下它們的概念,以簡單使用。如有錯誤,歡迎批評指正。

來源: 本文轉載自liwen01公眾號

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 人機交互
    +關注

    關注

    12

    文章

    1206

    瀏覽量

    55382
  • 嵌入式
    +關注

    關注

    5082

    文章

    19104

    瀏覽量

    304829
  • 音頻
    +關注

    關注

    29

    文章

    2868

    瀏覽量

    81496
  • adc
    adc
    +關注

    關注

    98

    文章

    6495

    瀏覽量

    544468
收藏 人收藏

    評論

    相關推薦

    SPB嵌入式音頻處理系統設計

    的軟件構架。SPB中的軟件IP模塊可以屏蔽底層細節,為FPGA嵌入式設計的快速開發提供便利,提高研發效率。介紹了基于SPB的FPGA嵌入式設計關鍵技術,并在智能
    發表于 05-06 10:58 ?1506次閱讀
    SPB<b class='flag-5'>嵌入式</b><b class='flag-5'>音頻</b>處理系統設計

    SPB嵌入式音頻處理系統該怎么設計?

    的軟件構架.SPB中的軟件IP模塊可以屏蔽底層細節,為FPGA嵌入式設計的快速開發提供便利,提高研發效率.介紹了基于SPB的FPGA嵌入式設計關鍵技術,并在智能
    發表于 09-18 06:09

    基于SPB怎么實現嵌入式音頻處理系統設計?

    的軟件構架。SPB中的軟件IP模塊可以屏蔽底層細節,為FPGA嵌入式設計的快速開發提供便利,提高研發效率。介紹了基于SPB的FPGA嵌入式設計關鍵技術,并在智能
    發表于 03-11 07:12

    基于嵌入式系統的音頻點播系統

    摘要:介紹一種基于嵌入式系統的C/S結構音頻點播系統.它將MP3音頻文件集中存儲在網絡服務器上,利用自主開發的MP3播放終端進行網絡點播.并
    發表于 12-23 20:40 ?32次下載

    嵌入式LINUX開發基礎知識

    嵌入式LINUX簡介,嵌入式LINUX開發平臺簡介,嵌入式LINUX開發流程,建立嵌入式LINU
    發表于 07-31 21:34 ?261次下載

    嵌入式開發

    嵌入式開發就是指在嵌入式操作系統下進行開發嵌入式Linux是以Linux為基礎的嵌入式作業系統。這里提供了
    發表于 12-20 13:21
    <b class='flag-5'>嵌入式開發</b>

    嵌入式系統開發圣經

    本書內容主要包含嵌入式系統介紹嵌入式Soc硬件系統概論、嵌入式系統軟件開發等等。
    發表于 03-22 16:30 ?5次下載

    基于SPB的FPGA嵌入式音頻處理系統的設計

    的軟件構架。SPB中的軟件IP模塊可以屏蔽底層細節,為FPGA嵌入式設計的快速開發提供便利,提高研發效率。介紹了基于SPB的FPGA嵌入式設計關鍵技術,并在智能
    發表于 10-26 16:39 ?17次下載
    基于SPB的FPGA<b class='flag-5'>嵌入式</b><b class='flag-5'>音頻</b>處理系統的設計

    什么是嵌入式開發板_學嵌入式用什么開發

    本文首先介紹嵌入式開發板的功能作用,其次闡述了學嵌入式用什么開發板,分別推薦了fs4412開發板、mini2440
    發表于 05-18 11:14 ?7159次閱讀

    嵌入式Linux開發教程之嵌入式系統介紹資料免費下載

    本文檔的主要內容詳細介紹的是嵌入式Linux開發教程之嵌入式系統介紹資料免費下載包括了:1.了解嵌入式
    發表于 05-14 18:12 ?15次下載
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>開發</b>教程之<b class='flag-5'>嵌入式</b>系統<b class='flag-5'>介紹</b>資料免費下載

    嵌入式開發的產品有哪些_嵌入式開發的流程

    本文主要闡述了嵌入式開發的產品,其次介紹嵌入式開發的流程。
    發表于 08-31 15:38 ?1.1w次閱讀

    嵌入式軟件的開發流程_嵌入式軟件的調試

    本文首先介紹嵌入式軟件的發展,其次闡述了嵌入式軟件的開發流程,最后介紹嵌入式軟件的調試。
    發表于 08-31 16:02 ?6288次閱讀

    視頻教程-嵌入式Linux開發基礎-嵌入式

    嵌入式Linux開發基礎 嵌入式工程師、嵌入式講師、10多年
    發表于 11-02 13:21 ?30次下載
    視頻教程-<b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>開發</b>基礎-<b class='flag-5'>嵌入式</b>

    嵌入式音頻開發(基礎篇)之 1.2 音頻開發的主要應用場景

    查看本系列全部文章請點擊:嵌入式音頻開發系列匯總(持續更新
    發表于 11-03 14:06 ?16次下載
    <b class='flag-5'>嵌入式</b>端<b class='flag-5'>音頻</b><b class='flag-5'>開發</b>(基礎篇)之 1.2 <b class='flag-5'>音頻</b><b class='flag-5'>開發</b>的主要應用場景

    嵌入式音頻處理流程開發詳細介紹

    雖然音頻的應用技術大部分都已經比較成熟了,但是在嵌入式開發中,受限于硬件資源的匱乏,還是會遇到不少的問題。其中涉及到很多的知識和概念,如果不是專業做音視頻的同學,估計也容易弄迷糊。
    發表于 12-27 09:33 ?1353次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>音頻</b>處理流程<b class='flag-5'>開發</b>詳細<b class='flag-5'>介紹</b>
    主站蜘蛛池模板: 精品伊人久久| 夜夜穞狠狠穞| 97视频在线免费播放| 国产精品JIZZ在线观看A片| 久久亚洲AV成人无码国产漫画| 手机看片国产免费久久网| 最新国产成人综合在线观看| 国产无遮挡色视频免费观看性色| 欧美一区二区激情视频| 一区二区三区国产| 国产美女又黄又爽又色视频网站| 欧美一区二区影院| 中文天堂www资源| 国产一区日韩二区欧美三区| 日日噜噜噜夜夜爽爽狠狠 | 中文字幕国产视频| 国产人妻XXXX精品HD电影| 全彩无翼污之邪恶女教师| 18黄女脱内衣| 精品无码久久久久久久动漫| 午夜伦理:伦理片| 拔萝卜在线高清观看视频| 玖玖爱这里只有精品视频| 亚洲精品97福利在线| 公交车轮C关老师| 欧美性猛交AAA片| 97久久超碰中文字幕| 久久久黄色大片| 亚洲色欲色欲www474ee| 国产欧美一区二区精品久久久| 秋霞电影网伦大理电影在线观看| 97草碰在线视频免费| 久久亚洲AV无码精品午色夜麻豆| 亚洲男人天堂2018av| 国产色播视频在线观看| 乌克兰内射私拍| 高龄熟女50P| 任你懆视频 这里只有精品| chinese耄耋70老太性| 暖暖的视频完整视频免费韩国| 40分钟超爽大片黄|