AIR32F103(八) 集成Helix MP3解碼庫播放MP3

来源:https://www.cnblogs.com/milton/archive/2023/01/15/17052641.html
-Advertisement-
Play Games

Helix 解碼庫提供了MP3內容的MPEG相容解碼, 支持可變比特率, 恆定比特率以及立體聲和單聲道音頻格式. Helix 的定點解碼庫專門針對ARM處理器進行了優化. Helix 解碼庫是以幀為解碼單位的, 一次解碼一幀, 運行需要占用的資源很少, 可以在任何能夠執行長整數乘法運算(兩個32位輸... ...


目錄

關於 Helix MP3 解碼庫

MP3(Moving Picture Experts Group Audio Layer III,MPEG Audio Layer 3)是一種音頻編碼方式, MPEG 音頻文件是 MPEG 標準中的聲音部分, 根據壓縮質量和編碼複雜程度劃分為三級 Layer-1, Layer-2, Layer-3, 分別對應MP1, MP2, MP3 這三種編碼格式, 級別越高壓縮率越高,編碼器也越複雜, MP3 壓縮率可達到 10:1 至 12:1.

Helix 解碼庫提供了MP3內容的MPEG相容解碼, 支持可變比特率, 恆定比特率以及立體聲和單聲道音頻格式. Helix 的定點解碼庫專門針對ARM處理器進行了優化. Helix 解碼庫是以幀為解碼單位的, 一次解碼一幀, 運行需要占用的資源很少, 可以在任何能夠執行長整數乘法運算(兩個32位輸入生成一個64位結果)和長整數乘法-累加(具有64位累加器的長整數乘法)的32位處理器上運行.

Helix 與 AIR32F103 驅動庫的集成

在 air32f103-template 項目中, 已經將 Helix 加入 Library 併在 Makefile 中增加了編譯選項, 設為y就會增加Helix庫的支持.

# Build with Helix MP3 lib, y:yes, n:no
USE_HELIX		?= y

在項目中使用Helix庫, 只需要引用 mp3dec.h 和 mp3_data.h 這兩個頭文件, 初始化 HMP3Decoder

hMP3Decoder = MP3InitDecoder();

示例代碼

示例代碼: air32f103-template/tree/master/Examples/NonFreeRTOS/I2S/Helix_MP3_Play

  • 因為 Helix 的官方倉庫已經不可用, 網上找到的大多是經過修改的代碼, 這裡使用的是這篇文章中的Helix庫.
  • 為簡單起見, 示例直接使用位元組數組存儲mp3數據進行播放.
  • 音頻的驅動: 使用兩個4096位元組的數組作為 DMA 的buffer, DMA中存放已經解碼完成的音頻數據, 直接傳輸到I2S介面播放. 每次一個buffer的DMA傳輸完成, 就切換到下一個buffer, 同時在主函數中讀取mp3數據並解碼, 快速填充前一個buffer.
  • 因為使用的記憶體超過 42KB, 如果使用 CCT6, 需要開啟記憶體hack.
  • 實際測試中, 需要系統頻率高於192MHz才能完全流暢播放, 建議使用 216MHz

示例中的I2S設置是針對PT8211的, 如果使用的是, 需要修改一下, 改成 Phillips 格式

// PT8211:LSB,  MAX98357A:Phillips
I2S_InitStructure.I2S_Standard = I2S_Standard_LSB;

硬體準備

  • AIR32F103開發板, 需要Flash大於 230 KB, 所以只能用 CCT6或RPT6
  • MAX98357A 或 PT8211 等 I2S 介面音頻播放模塊
  • 用於播放聲音的喇叭

接線

 *   AIR32F103                  MAX98357A / PT8211
 *   PB12(SPI1_NSS/I2S_WS)       -> LRC, WS
 *   PB13(SPI1_SCK/I2S_CK)       -> BCLK, BCK
 *   PB15(SPI1_MOSI/I2S_SD)      -> DIN
 *                               GND  -> GND
 *                               VIN  -> 3.3V
 *                               +    -> speaker
 *                               -    -> speaker

運行示例

編譯和燒錄的步驟, 參考前面的 AIR32F103(三) Linux環境基於標準外設庫的項目模板

運行後會重覆播放一段音樂.

播放其它MP3文件

首先要用工具將MP3剪輯到合適的大小(不要超過200KB), 格式為立體聲 44.1 KHz 採樣率, 不限制比特率.

然後用工具將其轉換為十六進位表示的位元組數組. 替換掉 mp3_data.c 中的內容, 同時修改 mp3_data.h 中的 MP3_DATA_SIZE.

bin2hex的轉換工具, 可以使用Perl Script to convert binary to hex 這個perl腳本

鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 今天給大家介紹的是Python爬蟲豆瓣Top250電影短評數據保存本地,在這裡給需要的小伙伴們幫助,並且給出一點小心得。 開發工具 **Python版本:**3.6 相關模塊: requests模塊 parsel模塊 time模塊 環境搭建 安裝Python並添加到環境變數,pip安裝需要的相 ...
  • 1 簡介 谷歌雲GCP(Google Cloud Platform)是由Google提供的雲平臺,還是為用戶提供了許多免費的產品,還是可以嘗試一下的。對於學習或者小項目,都可以使用。 2 創建一個新項目 要使用GCP,我們需要創建一個項目,它所有的資源都是在項目之下管理的: 3 創建Service ...
  • 在 Lua 或者 Python 中可以使用多值賦值語句來交換兩個數。例如:a, b = b, a。在 C++ 中有沒有類似的操作? 先解析一下多值賦值的原理,a, b = b, a 等價於 t1, t2 = b, a a, b = t1, t2 可以看到多值賦值還是用到了中間變數,而且還是兩個。想到 ...
  • 2023-01-12 一、Mybatis中緩存機制 1、一級緩存 (1)概述:一級緩存(即本地緩存或SqlSession級別緩存) (2)特點: ①一級緩存預設開啟 ②不能關閉 ③可以清空 (3)緩存原理 ①當第一次獲取數據時,需要先從資料庫中載入數據,將數據緩衝到Mybatis一級緩存中(緩存底層 ...
  • 1 簡介 為了更好的版本控制和問題定位,我們需要知道正在運行的應用是什麼版本,什麼時候打包的,Git的相關信息等。通過/actuator/info可以幫助我們獲取這些信息。 2 配置 首先要有actuator的依賴: <dependency> <groupId>org.springframework ...
  • .Net6中想實現對某個網址截屏,可通過Selenium模擬訪問網址並實現截圖。 實現 安裝Nuget包 <PackageReference Include="Selenium.Chrome.WebDriver" Version="85.0.0" /> <PackageReference Inclu ...
  • ABP Framework 在架構上有四大目標:模塊化、DDD、多租戶和微服務。從 `7.0` 更新的功能來看,其側重點轉向微服務場景的實現,比如:Dapr 集成、動態許可權和功能、外部本地化、分散式實體緩存服務,都是對微服務和分散式架構所提出的解決方案。 ...
  • public class SerializeHelper { #region 二進位格式 /// <summary> /// Binary 序列化使用前需要標記類可序列化 /// </summary> /// <param name="fileName">序列化到指定的文件</param> /// ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...