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