ESP32 通過藍牙顯示歌詞代碼示例

通過藍牙協議播放音樂,有的時候需要顯示歌詞,這里就是a2dp庫獲取了歌詞

值得注意的是要想正確獲取到歌詞,必須打開各種播放器的字幕(歌詞)開關

本項目用了三個開源庫 a2dp,tft_espi,xfont.

a2dp :藍牙傳輸音頻資料和字幕信息

tft_espi : tft 屏幕驅動

xfont : 顯示漢字 ,詳細使用請參考 GitHub - StarCompute/tftziku: 這是一個通過單片機在各種屏幕上顯示中文的解決方案

注意,xfont的初始化必須先執行。

項目內的代碼通過網易云音樂 播放正常獲取到歌詞。

?

項目整體開源到了: https://github.com/StarCompute/bluemusic

?

#include <Arduino.h>
// #include "AudioTools.h"
#include "a2dp/BluetoothA2DPSink.h"
#include "xfont.h"// #define TFT_SCLK   22
// #define TFT_MOSI  21
// #define TFT_RST     25
// #define TFT_DC      14
// #define TFT_CS   	 15XFont *_xFont;
BluetoothA2DPSink a2dp_sink;
// Then somewhere in your sketch:
void read_data_stream(const uint8_t *data, uint32_t length)
{i2s_write(I2S_NUM_0,data,length,NULL,0);
}
void rssi(esp_bt_gap_cb_param_t::read_rssi_delta_param &rssiParam)
{Serial.print("rssi value: ");Serial.println(rssiParam.rssi_delta);
}String song_singer = "";
String song_album = "";
float totalSongTime=1.0;// 顯示播放的百分比,其實可以優化的更好
void avrc_rn_play_pos_callback(uint32_t play_pos) {Serial.printf("Play position is %d (%d seconds)\n", play_pos, (int)round(play_pos/1000.0));if(totalSongTime>0){float per=play_pos/totalSongTime*100;_xFont->tft.fillRect(0, 102, 400, 40, TFT_BLACK);_xFont->DrawChineseEx(0, 102, "" + String(per,2)+"%", TFT_SILVER,TFT_BLACK);}
}void avrc_metadata_callback(uint8_t data1, const uint8_t *data2)
{// Serial.printf("AVRC metadata rsp: attribute id 0x%x, %s\n", data1, data2);String strData2 = (const char *)data2;if(strData2!="0")Serial.printf("data1: %d data2: %s \n",data1,strData2);if (data1 == 2){// Serial.printf("歌名:%s", data2);if (song_singer != strData2){_xFont->tft.fillRect(0, 2, 400, 40, TFT_BLACK);_xFont->DrawChineseEx(0, 2, "" + strData2,TFT_GREEN,TFT_BLACK);song_singer = strData2;}}if (data1 == 4){// Serial.printf("歌手:%s", data2);if (song_album != strData2){_xFont->tft.fillRect(0, 46, 400, 40, TFT_BLACK);_xFont->DrawChineseEx(0, 46, "" + strData2, TFT_RED,TFT_BLACK);song_album = strData2;}}if (data1 == 1){// Serial.printf("專輯:%s", data2);_xFont->tft.fillRect(0, 71, 400, 30, TFT_BLACK);_xFont->DrawChineseEx(0, 71, "" + strData2, TFT_LIGHTGREY,TFT_BLACK);}if(data1==64)totalSongTime=strData2.toFloat();// 0x8 第幾首歌// 0x10 總共多少首歌// 0x20
}void connection_state_changed(esp_a2d_connection_state_t state, void *ptr)
{Serial.println(a2dp_sink.to_str(state));
}void audio_state_changed(esp_a2d_audio_state_t state, void *ptr)
{Serial.println(a2dp_sink.to_str(state));
}void setup()
{Serial.begin(115200);_xFont = new XFont(true);_xFont->DrawChineseEx(0, 2, "歡迎使用。。", TFT_GREEN);a2dp_sink.set_avrc_metadata_attribute_mask(ESP_AVRC_MD_ATTR_TITLE | ESP_AVRC_MD_ATTR_ARTIST | ESP_AVRC_MD_ATTR_ALBUM | ESP_AVRC_MD_ATTR_TRACK_NUM | ESP_AVRC_MD_ATTR_NUM_TRACKS|ESP_AVRC_MD_ATTR_PLAYING_TIME|ESP_AVRC_MD_ATTR_GENRE);// a2dp_sink.a2dp_sink.set_avrc_metadata_callback(avrc_metadata_callback);a2dp_sink.set_on_connection_state_changed(connection_state_changed);a2dp_sink.set_on_audio_state_changed(audio_state_changed);a2dp_sink.set_avrc_rn_play_pos_callback(avrc_rn_play_pos_callback);i2s_pin_config_t my_pin_config = {.bck_io_num = 32,//輸入.ws_io_num = 33,//輸入.data_out_num = 23,//輸出.data_in_num = I2S_PIN_NO_CHANGE};a2dp_sink.set_pin_config(my_pin_config);a2dp_sink.start("my music");}void loop()
{delay(100);
}

?由于歌詞內容不確定,所以使用了開源中文字庫 :

GitHub - StarCompute/tftziku: 這是一個通過單片機在各種屏幕上顯示中文的解決方案

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41733.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于python實現的監聽服務接口是否正常,發送異常消息到釘釘群

獲取釘釘機器人 創建釘釘群組(要求至少三個成員)進入群組 設置>機器人>添加機器人選擇自定義機器人 按照要求填寫完獲取到 Webhook的鏈接 實現代碼 from time import sleep import requests import json from datetime import datetime import logging# 配置日志記錄的…

數據結構第11節: B樹

B樹是一種自平衡的樹數據結構&#xff0c;它能夠保持數據排序&#xff0c;并且在插入、刪除和查找操作中具有對數時間復雜度。B樹廣泛應用于文件系統、數據庫和索引中&#xff0c;因為它們可以有效地處理大量數據。 B樹的特點&#xff1a; 所有葉子節點都位于同一層。每個節點…

【】AI八股-神經網絡相關

Deep-Learning-Interview-Book/docs/深度學習.md at master amusi/Deep-Learning-Interview-Book GitHub 網上相關總結&#xff1a; 小菜雞寫一寫基礎深度學習的問題&#xff08;復制大佬的&#xff0c;自己復習用&#xff09; - 知乎 (zhihu.com) CV面試問題準備持續更新貼 …

.net 調用海康SDK的跨平臺解決方案

??歡迎點贊 :?? 收藏 ?留言 ?? 如有錯誤敬請指正,賜人玫瑰,手留余香!??本文作者:由webmote 原創??作者格言:新的征程,我們面對的不僅僅是技術還有人心,人心不可測,海水不可量,唯有技術,才是深沉黑夜中的一座閃爍的燈塔序言 上2篇海康SDK使用以及常見的坑…

PCL 點云PFH特征描述子

點云PFH特征描述子 一、概述1.1 概念1.2 算法原理一、代碼實現二、結果示例一、概述 1.1 概念 點特征直方圖PFH(Point Feature Histograms)描述子:用于表示點云中每個點的局部幾何形狀信息,它是一種直方圖描述子,包括了點云的法線方向和曲率信息,PFH描述子可以幫助區分不同…

深入Django(八)

掌握Django的管理后臺 引言 在前七天的教程中&#xff0c;我們介紹了Django的基礎架構、模型、視圖、模板、URL路由、表單系統以及數據庫遷移。今天&#xff0c;我們將深入了解Django的管理后臺&#xff0c;這是一個功能強大的內置管理界面&#xff0c;用于創建、更新、查看和…

【JavaEE精煉寶庫】文件操作(1)——基本知識 | 操作文件——打開實用性編程的大門

目錄 一、文件的基本知識1.1 文件的基本概念&#xff1a;1.2 樹型結構組織和目錄&#xff1a;1.3 文件路徑&#xff08;Path&#xff09;&#xff1a;1.4 二進制文件 VS 文本文件&#xff1a;1.5 其它&#xff1a; 二、Java 操作文件2.1 方法說明&#xff1a;2.2 使用演示&…

QT面試筆記總計

一 Qt 保證多線程安全? 使互斥鎖保證多線程安全性。QMutex類、。使用讀寫鎖保證多線程安全性&#xff0c;QReadWriteLock。使用信號和槽機制保證多線程安全性。使用顯示切換保證多線程安全性。QTread類。 Qt 中的事件與信號的區別? 事件與信號的實現機制不同&#xff1b;事…

HCIA綜合實驗

學習新思想&#xff0c;爭做新青年。今天學習的是HCIA綜合實驗&#xff01; 實驗拓撲 實驗需求 總部&#xff1a; 1、除了SW8 SW9是三層交換機&#xff0c;其他交換機均為2層交換機。 2、GW為總部的出口設備&#xff0c;使用單臂路由技術&#xff0c;VLAN10,20,100的網關都在GW…

ERROR: “armeabi-v7a“ not supported for HarmonyOS

IDE 從 devecostudio-mac-4.1.3.700 升級至 devecostudio-mac-5.0.3.403 后拋出了如下異常: ERROR: "armeabi-v7a" not supported for HarmonyOS. 解決辦法 一.entry/build-profile.json5 需 entry/build-profile.json5 的 abiFilters 中移除 "armeabi-v7a&qu…

計算機網絡體系結構詳解:協議與分層

在學習計算機網絡時&#xff0c;理解網絡協議與分層體系結構是至關重要的。本文將詳細介紹這些概念&#xff0c;幫助基礎小白快速入門。 1. 什么是網絡協議 網絡協議是計算機網絡中用于數據交換的規則和標準。這些規則規定了數據格式、時序以及發送和接收數據時的動作。網絡協…

Unity3D瓦片地圖輔助定位工具

介紹 該工具用于TileMap的瓦片輔助定位&#xff0c;通過鍵盤或鼠標按瓦片尺寸0到1的比例作為單次移動值移動定位點游戲對象。當采用定位點游戲對象映射瓦片時&#xff0c;可使用該工具來移動定位點游戲對象&#xff0c;在新版本Unity3D的TileMap編輯器中可使用GameObject Brush…

基于java+springboot+vue實現的流浪動物管理系統(文末源碼+Lw)277

摘 要 在如今社會上&#xff0c;關于信息上面的處理&#xff0c;沒有任何一個企業或者個人會忽視&#xff0c;如何讓信息急速傳遞&#xff0c;并且歸檔儲存查詢&#xff0c;采用之前的紙張記錄模式已經不符合當前使用要求了。所以&#xff0c;對流浪動物信息管理的提升&…

【React】React18 Hooks之useState

目錄 useState案例1&#xff08;直接修改狀態&#xff09;案例2&#xff08;函數式更新&#xff09;案例3&#xff08;受控表單綁定&#xff09;注意事項1&#xff1a;set函數不會改變正在運行的代碼的狀態注意事項2&#xff1a;set函數自動批量處理注意事項3&#xff1a;在下次…

實現基于Spring Security的權限管理系統

實現基于Spring Security的權限管理系統 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代Web應用中&#xff0c;權限管理系統是至關重要的組成部分。通過…

[數據集][目標檢測]護目鏡檢測數據集VOC+YOLO格式888張1類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;888 標注數量(xml文件個數)&#xff1a;888 標注數量(txt文件個數)&#xff1a;888 標注類別…

ORB 特征點提取

FAST關鍵點 選取像素p&#xff0c;假設它的亮度為Ip&#xff1b; . 設置一個閾值T&#xff08;比如Ip的20%&#xff09;&#xff1b; 以像素p為中心&#xff0c;選取半徑為3的圓上的16個像素點&#xff1b; 假如選取的圓上&#xff0c;有連續的N個點的亮度大于IpT或小于…

Redis 八股文

標題 1. Redis主從同步原理&#xff1a;判斷下線的條件:故障轉移如何保證Sentinel高可用 1. Redis主從同步原理&#xff1a; 1、slave執行命令向master建立連接 2、master執行bgsave&#xff08;后臺存儲&#xff09;&#xff0c;生成rdb快照&#xff08;redis備份方式&#x…

FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的區別?

vTaskDelay 和 xTaskDelayUntil 是 FreeRTOS 提供的兩種不同任務延遲函數&#xff0c;各自有其適用的場景和優缺點。vTaskDelay 適用于簡單的延遲操作&#xff0c;而 xTaskDelayUntil 提供了精確的周期控制能力。在設計 FreeRTOS 應用程序時&#xff0c;根據任務的時間要求選擇…

日志自動分析-Web---360星圖GoaccessALBAnolog

目錄 1、Web-360星圖(IIS/Apache/Nginx) 2、Web-GoAccess &#xff08;任何自定義日志格式字符串&#xff09; 源碼及使用手冊 安裝goaccess 使用 輸出 3-Web-自寫腳本&#xff08;任何自定義日志格式字符串&#xff09; 4、Web-機器語言analog&#xff08;任何自定義日…