接口介绍
流录音接口
record.start
介绍流录音接口参数
语法
record.start(seconds, cbFnc, type, quality, format, streamRptLen)
参数
参数 类型 取值释义 seconds number seconds,录音时长,单位:秒
流录音模式下,如果想长时间录音,可以将此参数设置为0x7FFFFFFF,相当于录音2147483647秒=24855天cbFnc function type参数为”STREAM”时,回调函数的调用形式为:
cbFnc(result,size,tag)
result:录音结果,true表示成功,false或者nil表示失败
size:number类型,每次上报的录音数据流的大小,单位是字节,在result为true时才有意义
tag:string类型,”STREAM”表示录音数据流通知,”END”表示录音结束type string type,录音模式
“STREAM”表示流录音模式,录音数据保存在内存中,每隔一段时间执行一次cbFnc函数去读取录音数据流,录音结束后再执行一次cbFnc函数quality number 可选参数,默认为1,quality,录音质量,0:一般质量 1:中等质量 2:高质量 3:无损质量 format number 可选参数,默认为3,format,录音格式,1:pcm 2:wav 3:amrnb 4:speex
pcm格式:录音质量参数无效,采样率:8000,单声道,采样精度:16 bit,5秒钟录音80KB左右
wav格式:录音质量参数无效,比特率:128kbps,5秒钟录音80KB左右
amrnb格式:录音质量参数有效
录音质量为0时:比特率:5.15kbps,5秒钟录音3KB多
录音质量为1时:比特率:6.70kbps,5秒钟录音4KB多
录音质量为2时:比特率:7.95kbps,5秒钟录音4KB多
录音质量为3时:比特率:12.2kbps,5秒钟录音7KB多
speex格式:录音质量参数无效,pcm格式128kbps后的压缩格式,5秒钟6KB左右streamRptLen number 可选参数,默认为nil,streamRptLen,流录音时,每次上报的字节阀值 返回值
无
例子
1
2
3
4-- 流录音模式,录音5秒,一般质量,amrnb格式,每隔一段时间执行一次cbFnc函数,录音结束后再执行一次cbFnc函数:
record.start(5,cbFnc,"STREAM")
-- 流录音模式,录音5秒,一般质量,amrnb格式,每产生500字节的录音数据执行一次cbFnc函数,录音结束后再执行一次cbFnc函数:
record.start(5,cbFnc,"STREAM",nil,nil,500)
流播放接口
audiocore.streamplay
流式播放音频数据,音频数据格式支持:mp3、wav、amr、pcm、spx
语法
audiocore.streamplay(audioFormat,audioData)
参数
参数 类型 取值释义 audioFormat number 音频数据格式;支持audiocore.MP3、audiocore.WAV、audiocore.AMR、audiocore.PCM、audiocore.SPX audioData string 音频数据
返回值
参数 类型 取值释义 acceptedAudioDataLen number 接收的音频数据长度 例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60local 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)
异常处理
流播放填充数据填充问题
流播放音频数据时,在core中有一个4K字节的缓冲区,用来存放音频数据,调用audiocore.streamplay接口时,音频数据被填充到这个缓冲区内,被填充的最大长度为缓冲区的剩余字节数;
例如:缓冲区还剩1000字节可以填充,如果此时调用audiocore.streamplay填充3000字节数据,则实际只能将这3000字节数据的前1000字节填充到缓冲区,返回值acceptedAudioDataLen的值为1000,表示填充的字节数,剩余的2000字节被丢弃