RTMP(流媒体播放)
# 简介
RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。
# API说明
RTMP的API在core有做封装,直接使用即可。
| API接口 | 描述 |
| ----------------------- | -------------------------- |
| audiocore.rtmpopen(url) | 打开RTMP拉流,url即实际地址 |
| audiocore.rtmpclose() | 关闭RTMP拉流 |
详细的API介绍见[audiocore章节](https://doc.openluat.com/wiki/21?wiki_page_id=2611#audiocorertmpopenurl_410)
# 实现流程
- 创建任务
通过sys.taskInit() 创建一个协程。
- 等待网络就绪
采用socket.isReady()这个接口阻塞操作,程序运行到这里会进入等待直到底层网络注册完成,网络状态就绪。
- 打开RTMP拉流
调用相应API启动RTMP拉流,此时服务器端推流正常则可正常听到声音。
- 关闭RTMP拉流
执行一段时间后主动关闭RTMP拉流,此时会有一个异步消息rtos.MSG_RTMP通知到Lua。
# 示例
相关实例程序在脚本库的demo\rtmp文件夹下,包含启动/关闭RTMP拉流过程,对关闭后底层core产生的消息进行解析,可以根据实际需求对demo进行研究。在实际测试中需使用支持RTMP功能固件版本。[使用可选编译生成支持RTMP的固件](http://erp.openluat.com/firm_customized)
###开机与连接网络
以\resource\8910_script\script_LuaTask_V2.3.7\demo\rtmp目录的demo作为基础进行修改。demo中在开机以后进入正式应用的一开始使用了一个while进行循环阻塞判断。socket.isReady()表示网络连接是否可用,可用即为true,不可以为false。
```lua
sys.taskInit(function()
while true do
print("ready network ok")
while not socket.isReady() do sys.wait(1000) end --循环等待网络就绪
```
有些情况下可能由于欠费等原因设备socket可能一直不可用,所以可以加一个异常机制,当开机以后socket长时间不可用就重启设备。可以进行如下修改。
```lua
--等待网络连接的超时时间
local timeout = 90
-- tcp test
sys.taskInit(
function()
local r, s, p
local recv_cnt, send_cnt, con_cnt = 0, 0, 0
while true do
while not socket.isReady() do
sys.wait(1000)
if con_cnt == timeout then
sys.restart("网络初始化失败!")
end
con_cnt = con_cnt + 1
end
con_cnt = 0
```
### 启动RTMP拉流
如何使用电脑进行RTMP推流,或者将来放个一直播放音频的RTMP URL。其中用到的rtmp推流可直接使用。
```lua
audiocore.rtmpopen("rtmp://121.43.224.154/live/7484")
```
连接成功以后开始播放音频。

### 关闭RTMP拉流
```lua
local function audioMsg(msg)
--log.info("audio.MSG_AUDIO",msg.play_end_ind,msg.play_error_ind)
--[[
result_code:
0 == 播放成功
1 == 播放失败
2 == 停止成功
3 == 停止失败
4 == 接收超时
5 == 连接失败
]]
log.info("audioMsgCb",msg.result,msg.result_code)
--sys.publish("RTMP_PLAY_OVER")
if msg.result_code == 2 then
sys.publish("RTMP_STOP_OK")
end
end
sys.taskInit(function()
--等待网络准备就绪
if socket.isReady() then
audiocore.rtmpopen("rtmp://121.43.224.154/live/7484")
--这里根据需要添加关闭延迟
audiocore.rtmpclose()
sys.waitUntil("RTMP_STOP_OK")
end
end
```
当调用audiocore.rtmpclose()后,会有一个异步消息rtos.MSG_RTMP通知到Lua脚本,上述脚本将对该消息进行解析处理。
# 常见问题
## 目前RTMP暂不支持推流,只支持拉流
## 目前RTMP拉流 支持的音频格式:mp3。
RTMP协议基于TCP,RTMP协议中,音频必须是AAC或MP3编码,且多以FLV格式封包。目前我们暂不支持AAC跟FLV音频播放格式。