| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- -- LuaTools需要PROJECT和VERSION这两个信息
- PROJECT = "i2sdemo"
- VERSION = "1.0.0"
- --[[
- 本demo暂时只在air101/103/601测试过
- 对于EC618系列的模块,例如Air780E/Air700E,请使用audio库进行快捷播放
- 本demo需要外挂ES8311 codec芯片, 可使用海凌科的w800音频开发板进行测试
- https://detail.tmall.com/item.htm?abbucket=2&id=670202333872
- ]]
- -- sys库是标配
- sys = require("sys")
- if wdt then
- --添加硬狗防止程序卡死,在支持的设备上启用这个功能
- wdt.init(9000)--初始化watchdog设置为9s
- sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
- end
- pins.setup(58, "I2C0_SDA")
- pins.setup(57, "I2C0_SCL")
- log.info("i2c", "复用" )
- sys.taskInit(function()
- sys.wait(1000)
- log.info("开始G711编解码测试")
- -- 初始化audio
- local multimedia_id = 0
- local i2c_id = 0
- local i2s_id = 0
- local i2s_mode = 0
- local i2s_sample_rate = 44100
- local i2s_bits_per_sample = 16
- local i2s_channel_format = 0
- local i2s_communication_format = 0
- local i2s_channel_bits = 32
- local pa_pin = 22
- local pa_on_level = 1
- local pa_delay = 20
- local power_pin = 20
- local power_delay = 0
- i2c.setup(i2c_id,i2c.FAST)
- i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits)
- audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin)
- audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "es8311",i2cid = i2c_id , i2sid = i2s_id})
- -- 播放参数设置
- audio.start(multimedia_id, audio.PCM, 1, 16000, 16)
- -- 音量设置
- audio.vol(multimedia_id, 50)
- audio.pm(multimedia_id,audio.RESUME)
- -- PCM播放演示, 16k采样率, 16bit采样深度
- local file_size = fs.fsize("/luadb/test.pcm")
- -- print("/luadb/test.pcm size",file_size)
- local f = io.open("/luadb/test.pcm", "rb")
- if f then
- while 1 do
- local data = f:read(4096)
- -- print("-------------")
- if not data or #data == 0 then
- break
- end
- audio.write(0, data)
- sys.wait(100)
- end
- f:close()
- end
- -- 第一步:对/luadb/test.pcm进行G711编码
- log.info("第一步:对/luadb/test.pcm进行G711编码")
- -- 创建G711编码器
- local encoder = codec.create(codec.ALAW, false)
- log.info("G711编码器创建成功:", encoder)
- -- 创建输入和输出缓冲区
- local in_buffer = zbuff.create(54594)
- local out_buffer = zbuff.create(54594)
- -- 读取PCM文件数据
- local f = io.open("/luadb/test.pcm", "rb")
- local pcm_data = f:read("*a") -- 读取全部数据
- f:close()
- log.info("PCM文件大小:", #pcm_data, "字节")
- -- 将PCM数据写入输入缓冲区
- in_buffer:write(pcm_data)
- -- 执行G711编码
- log.info("开始G711编码,PCM数据大小:", #pcm_data, "字节")
- local encode_result = codec.encode(encoder, in_buffer, out_buffer, 0) -- 使用默认编码等级0
- log.info("G711编码结果:", encode_result)
- if encode_result then
- local encoded_size = out_buffer:used()
- log.info("编码成功,编码后数据大小:", encoded_size, "字节")
- -- 保存编码后的G711数据到文件
- local encoded_data = out_buffer:toStr(0, encoded_size)
- io.writeFile("/aaa.g711", encoded_data)
- log.info("编码数据已保存到 /aaa.g711")
- -- 第二步:对编码后的文件进行解码
- log.info("第二步:对编码后的文件进行解码")
- -- 创建G711解码器
- local decoder = codec.create(codec.ALAW)
- if not decoder then
- log.error("创建G711解码器失败")
- codec.release(encoder)
- return
- end
- log.info("G711解码器创建成功:", decoder)
- -- 获取编码后文件的信息
- local result, audio_format, num_channels, sample_rate, bits_per_sample, is_signed = codec.info(decoder, "/aaa.g711")
- log.info("编码后文件信息 - 采样率:", sample_rate, "声道数:", num_channels, "位深度:", bits_per_sample)
- -- 解码G711文件
- log.info("开始解码G711文件")
- local decoded_data = ""
- local decode_count = 0
- local total_decoded = 0
- -- 创建解码缓冲区
- local decode_buffer = zbuff.create(54594)
- while 1 do
- local decode_result = codec.data(decoder, decode_buffer)
- if decode_result then
- local data_size = decode_buffer:used()
- if data_size > 0 then
- decode_count = decode_count + 1
- total_decoded = total_decoded + data_size
- decoded_data = decoded_data .. decode_buffer:toStr(0, data_size)
- log.info("解码数据块", decode_count, "大小:", data_size, "字节")
- else
- log.info("解码完成,没有更多数据")
- break
- end
- else
- log.info("G711解码完成或失败")
- break
- end
- end
- log.info("解码完成,总解码数据大小:", #decoded_data, "字节")
- -- 第三步:播放解码后的音频
- log.info("第三步:播放解码后的音频")
- -- 播放参数设置
- audio.start(multimedia_id, audio.PCM, 1, 16000, 16)
- -- 音量设置
- audio.vol(multimedia_id, 50)
- audio.pm(multimedia_id,audio.RESUME)
- -- 播放解码后的PCM数据
- log.info("开始播放解码后的PCM数据")
- local play_buffer = zbuff.create(54594)
- play_buffer:write(decoded_data)
- play_buffer:seek(0)
- -- 分块播放音频数据
- local offset = 0
- while offset < #decoded_data do
- local chunk = play_buffer:read(math.min(4096, #decoded_data - offset))
- if chunk and #chunk > 0 then
- audio.write(multimedia_id, chunk)
- log.info("播放音频块,大小:", #chunk, "字节")
- sys.wait(50) -- 等待一小段时间
- end
- offset = offset + 4096
- end
- log.info("音频播放完成")
- -- 清理解码器资源
- codec.release(decoder)
- decode_buffer:free()
- play_buffer:free()
- else
- log.error("G711编码失败")
- end
- -- 清理资源
- codec.release(encoder)
- in_buffer:free()
- out_buffer:free()
- log.info("G711编解码测试完成")
- end)
- -- sys.taskInit(function()
- -- while 1 do
- -- -- 打印内存状态, 调试用
- -- sys.wait(1000)
- -- log.info("lua", rtos.meminfo())
- -- log.info("sys", rtos.meminfo("sys"))
- -- end
- -- end)
- -- 用户代码已结束---------------------------------------------
- -- 结尾总是这一句
- sys.run()
- -- sys.run()之后后面不要加任何语句!!!!!
|