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脚本