audiocore ========= .. raw:: html
作者:朱天华 2020年07月08日 .. raw:: html
.. raw:: html脚本lib中audio库对audiocore进行了二次封装 .. raw:: html
.. raw:: html建议直接使用脚本lib中的audio库来设计程序 .. raw:: html
.. raw:: html不建议直接使用core中的audiocore库来设计程序 .. raw:: html
.. raw:: html本章节audiocore 接口可帮助理解脚本lib中的audio库代码 .. raw:: html
.. raw:: html.. raw:: html
.. raw:: htmlaudiocore.play(audioFilePath) .. raw:: html
.. raw:: html功能: .. raw:: html
.. raw:: html播放音频文件 .. raw:: html
.. raw:: html音频文件格式支持:mp3、wav、amr、pcm .. raw:: html
.. raw:: html参数: .. raw:: html
.. raw:: htmlaudioFilePath: string类型;音频文件的完整路径 .. raw:: html
.. raw:: html如果是Luatools烧录的音频文件xxx.mp3,则文件完整路径为/lua/xxx.mp3 .. raw:: html
.. raw:: html如果是sd卡中根目录下的音频文件yyy.mp3,则文件完整路径为/sdcard0/yyy.mp3 .. raw:: html
.. raw:: html返回值: .. raw:: html
.. raw:: htmlresult: bool类型;同步播放结果 .. raw:: html
.. raw:: htmlfalse表示不允许播放 .. raw:: html
.. raw:: htmltrue表示允许播放,并且已经去执行播放动作;异步播放结果通过消息rtos.MSG_AUDIO通知到Lua脚本,消息携带参数msg.play_end_ind,true表示播放成功结束,其余值表示播放失败 .. raw:: html
.. raw:: html示例: .. raw:: html
.. raw:: htmllocal function audioMsg(msg) .. raw:: html
.. raw:: htmllog.info(“audio.MSG_AUDIO”,msg.play_end_ind) .. raw:: html
.. raw:: htmlsys.publish(“LIB_AUDIO_PLAY_IND”,“RESULT”,msg.play_end_ind) .. raw:: html
.. raw:: htmlend .. raw:: html
.. raw:: html.. raw:: html
.. raw:: html–注册core上报的rtos.MSG_AUDIO消息的处理函数 .. raw:: html
.. raw:: htmlrtos.on(rtos.MSG_AUDIO,audioMsg) .. raw:: html
.. raw:: htmlaudiocore.play(“/lua/call.mp3”) .. raw:: html
.. raw:: html.. raw:: html
.. raw:: html.. raw:: html
.. raw:: html.. raw:: html
.. raw:: htmlaudiocore.playdata(audioData,audioFormat[,audioLoop]) .. raw:: html
.. raw:: html功能: .. raw:: html
.. raw:: html播放音频数据 .. raw:: html
.. raw:: html音频数据格式支持:mp3、wav、amr、pcm、spx .. raw:: html
.. raw:: html参数: .. raw:: html
.. raw:: htmlaudioData: string类型;音频数据 .. raw:: html
.. raw:: htmlaudioFormat: number类型;音频数据格式;支持audiocore.MP3、audiocore.WAV、audiocore.AMR、audiocore.PCM、audiocore.SPX .. raw:: html
.. raw:: htmlaudioLoop: bool类型,可选参数,默认不循环;是否循环播放;true表示循环播放,false或者nil表示仅播放一次,不循环播放 .. raw:: html
.. raw:: html返回值: .. raw:: html
.. raw:: htmlresult: bool类型;同步播放结果 .. raw:: html
.. raw:: htmlfalse表示不允许播放 .. raw:: html
.. raw:: htmltrue表示允许播放,并且已经去执行播放动作;异步播放结果通过消息rtos.MSG_AUDIO通知到Lua脚本,消息携带参数msg.play_end_ind,true表示播放成功结束,其余值表示播放失败 .. raw:: html
.. raw:: html示例: .. raw:: html
.. raw:: htmllocal function audioMsg(msg) .. raw:: html
.. raw:: htmllog.info(“audio.MSG_AUDIO”,msg.play_end_ind) .. raw:: html
.. raw:: htmlsys.publish(“LIB_AUDIO_PLAY_IND”,“RESULT”,msg.play_end_ind) .. raw:: html
.. raw:: htmlend .. raw:: html
.. raw:: html.. raw:: html
.. raw:: html–注册core上报的rtos.MSG_AUDIO消息的处理函数 .. raw:: html
.. raw:: htmlrtos.on(rtos.MSG_AUDIO,audioMsg) .. raw:: html
.. raw:: htmlaudiocore.play(io.readFile(“/lua/call.mp3”),audiocore.MP3) .. raw:: html
.. raw:: html.. raw:: html
.. raw:: html.. raw:: html
.. raw:: html.. raw:: html
.. raw:: htmlaudiocore.streamplay(audioFormat,audioData) .. raw:: html
.. raw:: html功能: .. raw:: html
.. raw:: html流式播放音频数据 .. raw:: html
.. raw:: html音频数据格式支持:mp3、wav、amr、pcm、spx .. raw:: html
.. raw:: html参数: .. raw:: html
.. raw:: htmlaudioFormat: number类型;音频数据格式;支持audiocore.MP3、audiocore.WAV、audiocore.AMR、audiocore.PCM、audiocore.SPX .. raw:: html
.. raw:: htmlaudioData: string类型;音频数据 .. raw:: html
.. raw:: html返回值: .. raw:: html
.. raw:: htmlacceptedAudioDataLen: number类型;接收的音频数据长度 .. raw:: html
.. raw:: html注意事项: .. raw:: html
.. raw:: html流式播放音频数据时,在core中有一个4K字节的缓冲区,用来存放音频数据,调用audiocore.streamplay接口时,音频数据被填充到这个缓冲区内,被填充的最大长度为缓冲区的剩余字节数;例如缓冲区还剩1000字节可以填充,如果此时调用audiocore.streamplay填充3000字节数据,则实际只能将这3000字节数据的前1000字节填充到缓冲区,返回值acceptedAudioDataLen的值为1000,表示填充的字节数,剩余的2000字节被丢弃 .. raw:: html
.. raw:: html示例: .. raw:: html
.. raw:: htmllocal tBuffer = {} .. raw:: html
.. raw:: htmllocal tStreamType .. raw:: html
.. raw:: html.. raw:: html
.. raw:: htmllocal function consumer() .. raw:: html
.. raw:: htmlsys.taskInit(function() .. raw:: html
.. raw:: htmlaudio.setVolume(7) .. raw:: html
.. raw:: htmlwhile true do .. raw:: html
.. raw:: htmlwhile #tBuffer==0 do .. raw:: html
.. raw:: htmlsys.waitUntil(“DATA_STREAM_IND”) .. raw:: html
.. raw:: htmlend .. raw:: html
.. raw:: html.. raw:: html
.. raw:: htmllocal data = table.remove(tBuffer,1) .. raw:: html
.. raw:: html–log.info(“testAudioStream.consumer remove”,data:len()) .. raw:: html
.. raw:: htmllocal procLen = audiocore.streamplay(tStreamType,data) .. raw:: html
.. raw:: html
if procLen
–log.warn(“produce fast”)
.. raw:: html
table.insert(tBuffer,1,data:sub(procLen+1,-1))
.. raw:: html
sys.wait(5)
.. raw:: html
end
.. raw:: html
end
.. raw:: html
end)
.. raw:: html
end
.. raw:: html
.. raw:: html
.. raw:: html
local function producer(streamType)
.. raw:: html
sys.taskInit(function()
.. raw:: html
while true do
.. raw:: html
tStreamType = streamType
.. raw:: html
local tAudioFile =
.. raw:: html
{
.. raw:: html
[audiocore.AMR] = “tip.amr”,
.. raw:: html
[audiocore.SPX] = “record.spx”,
.. raw:: html
[audiocore.PCM] = “alarm_door.pcm”,
.. raw:: html
}
.. raw:: html
.. raw:: html
local fileHandle =
io.open(“/lua/”..tAudioFile[streamType],“rb”)
.. raw:: html
if not fileHandle then
.. raw:: html
log.error(“testAudioStream.producer open file error”)
.. raw:: html
return
.. raw:: html
end
.. raw:: html
.. raw:: html
while true do
.. raw:: html
local data = fileHandle:read(streamType==audiocore.SPX
and 1200 or 1024)
.. raw:: html
if not data then fileHandle:close() return end
.. raw:: html
table.insert(tBuffer,data)
.. raw:: html
if #tBuffer==1 then sys.publish(“DATA_STREAM_IND”) end
.. raw:: html
–log.info(“testAudioStream.producer”,data:len())
.. raw:: html
sys.wait(10)
.. raw:: html
end
.. raw:: html
end
.. raw:: html
end)
.. raw:: html
end
.. raw:: html
.. raw:: html
.. raw:: html
sys.timerStart(function()
.. raw:: html
–producer(audiocore.AMR)
.. raw:: html
–producer(audiocore.SPX)
.. raw:: html
producer(audiocore.PCM)
.. raw:: html
consumer()
.. raw:: html
end,3000)
.. raw:: html
.. raw:: html
.. raw:: html
audiocore.streamremain()
.. raw:: html
功能:
.. raw:: html
获取core中流式播放缓冲区剩余未播放的音频流字节数
.. raw:: html
参数:
.. raw:: html
无
.. raw:: html
返回值:
.. raw:: html
remainLen: number类型;缓冲区剩余未播放的音频流字节数
.. raw:: html
注意事项:
.. raw:: html
流式播放音频数据时,在core中有一个4K字节的缓冲区,用来存放音频数据,调用audiocore.streamplay接口时,音频数据被填充到这个缓冲区内,audiocore.streamreamin接口的返回值是缓冲区内未播放的音频流数据字节数
.. raw:: html
示例:
.. raw:: html
sys.taskInit(function()
.. raw:: html
sys.wait(5000)
.. raw:: html
local audioData = io.readFile(“/lua/tip.amr”)
.. raw:: html
.. raw:: html
–此处audiocore.streamremain()返回0
.. raw:: html
log.info(“begin streamremain”,audiocore.streamremain())
.. raw:: html
.. raw:: html
audiocore.streamplay(audiocore.AMR,audioData:sub(1,2000))
.. raw:: html
–此处audiocore.streamremain()返回值不定,和core中rtos系统调度有关
.. raw:: html
log.info(“after streamplay 2000,
streamremain”,audiocore.streamremain())
.. raw:: html
.. raw:: html
sys.wait(2000)
.. raw:: html
–此处audiocore.streamremain()返回0
.. raw:: html
log.info(“play done, streamremain”,audiocore.streamremain())
.. raw:: html
end)
.. raw:: html
.. raw:: html
.. raw:: html
audiocore.stop()
.. raw:: html
功能:
.. raw:: html
停止音频播放
.. raw:: html
参数:
.. raw:: html
无
.. raw:: html
返回值:
.. raw:: html
无
.. raw:: html
注意事项:
.. raw:: html
在音频播放状态下,调用audiocore.stop()后,会有一个异步消息rtos.MSG_AUDIO通知到Lua脚本,消息携带参数msg.play_end_ind的值为false,表示播放失败
.. raw:: html
无音频播放状态下,调用audiocore.stop()后,没有任何消息通知到Lua脚本
.. raw:: html