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") ``` 连接成功以后开始播放音频。 ![undefined](https://cdn.openluat-luatcommunity.openluat.com/images/20210429165508244_QQ截图20210429164525.jpg "undefined") ### 关闭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音频播放格式。