main.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "i2sdemo"
  3. VERSION = "1.0.0"
  4. --[[
  5. 本demo暂时只在air101/103/601测试过
  6. 对于EC618系列的模块,例如Air780E/Air700E,请使用audio库进行快捷播放
  7. 本demo需要外挂ES8311 codec芯片, 可使用海凌科的w800音频开发板进行测试
  8. https://detail.tmall.com/item.htm?abbucket=2&id=670202333872
  9. ]]
  10. -- sys库是标配
  11. sys = require("sys")
  12. if wdt then
  13. --添加硬狗防止程序卡死,在支持的设备上启用这个功能
  14. wdt.init(9000)--初始化watchdog设置为9s
  15. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  16. end
  17. pins.setup(58, "I2C0_SDA")
  18. pins.setup(57, "I2C0_SCL")
  19. log.info("i2c", "复用" )
  20. sys.taskInit(function()
  21. sys.wait(1000)
  22. log.info("开始G711编解码测试")
  23. -- 初始化audio
  24. local multimedia_id = 0
  25. local i2c_id = 0
  26. local i2s_id = 0
  27. local i2s_mode = 0
  28. local i2s_sample_rate = 44100
  29. local i2s_bits_per_sample = 16
  30. local i2s_channel_format = 0
  31. local i2s_communication_format = 0
  32. local i2s_channel_bits = 32
  33. local pa_pin = 22
  34. local pa_on_level = 1
  35. local pa_delay = 20
  36. local power_pin = 20
  37. local power_delay = 0
  38. i2c.setup(i2c_id,i2c.FAST)
  39. i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits)
  40. audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin)
  41. audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "es8311",i2cid = i2c_id , i2sid = i2s_id})
  42. -- 播放参数设置
  43. audio.start(multimedia_id, audio.PCM, 1, 16000, 16)
  44. -- 音量设置
  45. audio.vol(multimedia_id, 50)
  46. audio.pm(multimedia_id,audio.RESUME)
  47. -- PCM播放演示, 16k采样率, 16bit采样深度
  48. local file_size = fs.fsize("/luadb/test.pcm")
  49. -- print("/luadb/test.pcm size",file_size)
  50. local f = io.open("/luadb/test.pcm", "rb")
  51. if f then
  52. while 1 do
  53. local data = f:read(4096)
  54. -- print("-------------")
  55. if not data or #data == 0 then
  56. break
  57. end
  58. audio.write(0, data)
  59. sys.wait(100)
  60. end
  61. f:close()
  62. end
  63. -- 第一步:对/luadb/test.pcm进行G711编码
  64. log.info("第一步:对/luadb/test.pcm进行G711编码")
  65. -- 创建G711编码器
  66. local encoder = codec.create(codec.ALAW, false)
  67. log.info("G711编码器创建成功:", encoder)
  68. -- 创建输入和输出缓冲区
  69. local in_buffer = zbuff.create(54594)
  70. local out_buffer = zbuff.create(54594)
  71. -- 读取PCM文件数据
  72. local f = io.open("/luadb/test.pcm", "rb")
  73. local pcm_data = f:read("*a") -- 读取全部数据
  74. f:close()
  75. log.info("PCM文件大小:", #pcm_data, "字节")
  76. -- 将PCM数据写入输入缓冲区
  77. in_buffer:write(pcm_data)
  78. -- 执行G711编码
  79. log.info("开始G711编码,PCM数据大小:", #pcm_data, "字节")
  80. local encode_result = codec.encode(encoder, in_buffer, out_buffer, 0) -- 使用默认编码等级0
  81. log.info("G711编码结果:", encode_result)
  82. if encode_result then
  83. local encoded_size = out_buffer:used()
  84. log.info("编码成功,编码后数据大小:", encoded_size, "字节")
  85. -- 保存编码后的G711数据到文件
  86. local encoded_data = out_buffer:toStr(0, encoded_size)
  87. io.writeFile("/aaa.g711", encoded_data)
  88. log.info("编码数据已保存到 /aaa.g711")
  89. -- 第二步:对编码后的文件进行解码
  90. log.info("第二步:对编码后的文件进行解码")
  91. -- 创建G711解码器
  92. local decoder = codec.create(codec.ALAW)
  93. if not decoder then
  94. log.error("创建G711解码器失败")
  95. codec.release(encoder)
  96. return
  97. end
  98. log.info("G711解码器创建成功:", decoder)
  99. -- 获取编码后文件的信息
  100. local result, audio_format, num_channels, sample_rate, bits_per_sample, is_signed = codec.info(decoder, "/aaa.g711")
  101. log.info("编码后文件信息 - 采样率:", sample_rate, "声道数:", num_channels, "位深度:", bits_per_sample)
  102. -- 解码G711文件
  103. log.info("开始解码G711文件")
  104. local decoded_data = ""
  105. local decode_count = 0
  106. local total_decoded = 0
  107. -- 创建解码缓冲区
  108. local decode_buffer = zbuff.create(54594)
  109. while 1 do
  110. local decode_result = codec.data(decoder, decode_buffer)
  111. if decode_result then
  112. local data_size = decode_buffer:used()
  113. if data_size > 0 then
  114. decode_count = decode_count + 1
  115. total_decoded = total_decoded + data_size
  116. decoded_data = decoded_data .. decode_buffer:toStr(0, data_size)
  117. log.info("解码数据块", decode_count, "大小:", data_size, "字节")
  118. else
  119. log.info("解码完成,没有更多数据")
  120. break
  121. end
  122. else
  123. log.info("G711解码完成或失败")
  124. break
  125. end
  126. end
  127. log.info("解码完成,总解码数据大小:", #decoded_data, "字节")
  128. -- 第三步:播放解码后的音频
  129. log.info("第三步:播放解码后的音频")
  130. -- 播放参数设置
  131. audio.start(multimedia_id, audio.PCM, 1, 16000, 16)
  132. -- 音量设置
  133. audio.vol(multimedia_id, 50)
  134. audio.pm(multimedia_id,audio.RESUME)
  135. -- 播放解码后的PCM数据
  136. log.info("开始播放解码后的PCM数据")
  137. local play_buffer = zbuff.create(54594)
  138. play_buffer:write(decoded_data)
  139. play_buffer:seek(0)
  140. -- 分块播放音频数据
  141. local offset = 0
  142. while offset < #decoded_data do
  143. local chunk = play_buffer:read(math.min(4096, #decoded_data - offset))
  144. if chunk and #chunk > 0 then
  145. audio.write(multimedia_id, chunk)
  146. log.info("播放音频块,大小:", #chunk, "字节")
  147. sys.wait(50) -- 等待一小段时间
  148. end
  149. offset = offset + 4096
  150. end
  151. log.info("音频播放完成")
  152. -- 清理解码器资源
  153. codec.release(decoder)
  154. decode_buffer:free()
  155. play_buffer:free()
  156. else
  157. log.error("G711编码失败")
  158. end
  159. -- 清理资源
  160. codec.release(encoder)
  161. in_buffer:free()
  162. out_buffer:free()
  163. log.info("G711编解码测试完成")
  164. end)
  165. -- sys.taskInit(function()
  166. -- while 1 do
  167. -- -- 打印内存状态, 调试用
  168. -- sys.wait(1000)
  169. -- log.info("lua", rtos.meminfo())
  170. -- log.info("sys", rtos.meminfo("sys"))
  171. -- end
  172. -- end)
  173. -- 用户代码已结束---------------------------------------------
  174. -- 结尾总是这一句
  175. sys.run()
  176. -- sys.run()之后后面不要加任何语句!!!!!