play_stream.lua 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. --[[
  2. @module play_stream
  3. @summary 流式播放
  4. @version 1.0
  5. @date 2025.09.08
  6. @author 梁健
  7. @usage
  8. 本文件为流式播放应用功能模块,核心业务逻辑为:
  9. 1、使用test.pcm 模拟音频来源
  10. 2、通过流式传输不断填入播放的音频
  11. 3、使用powerkey 按键进行音量减小,点击boot 按键进行音量增加
  12. 本文件没有对外接口,直接在main.lua中require "play_stream"就可以加载运行;
  13. ]]
  14. exaudio = require("exaudio")
  15. local audio_setup_param ={
  16. model= "es8311", -- dac类型,可填入"es8311","es8211"
  17. i2c_id = 0, -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
  18. pa_ctrl = 162, -- 音频放大器电源控制管脚
  19. dac_ctrl = 164, -- 音频编解码芯片电源控制管脚
  20. }
  21. local index = 4096 -- 每次播放的数据长度不能小于1024,并且除去最后一包数据,数据长度都要为1024 的倍数
  22. local f = io.open("/luadb/test.pcm", "rb") -- 模拟流式播放音源,实际的音频数据来源也可以来自网络或者本地存储
  23. local function audio_need_more_data()
  24. if f then
  25. return f:read(index)
  26. end
  27. end
  28. local function play_end(event)
  29. if event == exaudio.PLAY_DONE then
  30. log.info("播放完成",exaudio.is_end())
  31. if f then
  32. return f:close()
  33. end
  34. end
  35. end
  36. local audio_play_param ={
  37. type= 2, -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
  38. -- 如果是播放文件,支持mp3,amr,wav格式
  39. -- 如果是tts,内容格式见:https://wiki.luatos.com/chips/air780e/tts.html?highlight=tts
  40. -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
  41. content = audio_need_more_data, -- 如果播放类型为0时,则填入string 是播放单个音频文件,如果是表则是播放多段音频文件。
  42. -- 如果播放tts 则填入要播放的内容。
  43. -- 如果为2,流式播放,则填入音频回调函数
  44. cbfnc = play_end, -- 播放完毕回调函数
  45. sampling_rate = 16000, -- 采样率,仅为流式播放起作用
  46. sampling_depth = 16, -- 采样位位深,仅流式播放的时候才有作用
  47. signed_or_unsigned = true -- PCM 的数据是否有符号,仅为流式播放起作用
  48. }
  49. ---------------------------------
  50. ---通过BOOT 按键增大音量---
  51. ---------------------------------
  52. local volume_number = 50
  53. local function add_volume()
  54. volume_number = volume_number + 20
  55. log.info("增大音量",volume_number)
  56. exaudio.vol(volume_number)
  57. end
  58. gpio.setup(0, add_volume, gpio.PULLDOWN, gpio.RISING)
  59. gpio.debounce(0, 200, 1)
  60. ---------------------------------
  61. ---通过POWERKEY按键减小音量---
  62. ---------------------------------
  63. local function down_volume()
  64. volume_number = volume_number - 15
  65. log.info("减小音量",volume_number)
  66. exaudio.vol(volume_number)
  67. end
  68. gpio.setup(gpio.PWR_KEY, down_volume, gpio.PULLUP, gpio.FALLING)
  69. gpio.debounce(gpio.PWR_KEY, 200, 1) -- 防抖,防止频繁触发
  70. ---------------------------------
  71. ---通过主task---
  72. ---------------------------------
  73. local taskName = "task_audio"
  74. local function audio_task()
  75. log.info("开始流式播报")
  76. if exaudio.setup(audio_setup_param) then
  77. exaudio.play_start(audio_play_param)
  78. end
  79. end
  80. sys.taskInitEx(audio_task, taskName)