main.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "dvp_cam_rtmp"
  3. VERSION = "1.0.0"
  4. local fota_enable = false -- 是否启用FOTA功能
  5. if fota_enable then
  6. local fota_looptime = 4*3600000 -- FOTA轮询时间,默认4小时
  7. -- 使用合宙iot平台时需要这个参数 客户如果使用请记得修改成自己的项目key
  8. PRODUCT_KEY = "6XtIwnc4GRfJtcgFQqtwn0U9XnERfAgR" -- DVP摄像头推流的项目KEY
  9. libfota2 = require "libfota2"
  10. end
  11. libfota2 = require "libfota2"
  12. local camera_id = camera.DVP
  13. local dvp_camera_table = {
  14. id = camera_id,
  15. sensor_width = 1280,
  16. sensor_height = 720
  17. }
  18. local rtmpc = nil
  19. -- 重连控制变量与方法
  20. local rtmp_reconnecting = false -- 是否正在重连
  21. local rtmp_retries = 0 -- 当前重连次数
  22. local rtmp_max_retries = 5 -- 最大重连次数
  23. -- rtmp出现问题时的重连逻辑
  24. function rtmp_try_reconnect()
  25. while true do
  26. local ret, error_id = sys.waitUntil("RECONNECT_RTMP")
  27. if rtmp_reconnecting or not rtmpc then return end
  28. -- if error_id > -4 and error_id ~= -1 then
  29. -- -- 非重连就能解决的错误,不进行重连
  30. -- log.info("rtmp", "error is not recoverable, will not reconnect", error_id)
  31. -- return
  32. -- end
  33. rtmp_reconnecting = true
  34. rtmpc:disconnect() -- 确认断开当前连接
  35. while rtmp_retries < rtmp_max_retries do
  36. rtmp_retries = rtmp_retries + 1
  37. local isNetReady, adapterIndex = socket.adapter()
  38. log.info("rtmp", "reconnect attempt", rtmp_retries, "adapter_index: ", adapterIndex)
  39. -- 检测当前网络是否就绪
  40. if isNetReady then
  41. local ok = rtmpc:connect()
  42. if ok then
  43. -- 等待短时间以便连接完成
  44. sys.wait(1000)
  45. local st = rtmpc:getState()
  46. if st == rtmp.STATE_CONNECTED or st == rtmp.STATE_PUBLISHING then
  47. log.info("rtmp", "reconnect success")
  48. -- 恢复推流
  49. rtmpc:start()
  50. rtmp_reconnecting = false
  51. rtmp_retries = 0
  52. return
  53. end
  54. end
  55. else
  56. -- 等待任意网卡变为就绪
  57. log.info("rtmp", "waiting for IP_READY")
  58. sys.waitUntil("IP_READY", 60000)
  59. end
  60. sys.wait(10000) -- 每次重连间隔10秒
  61. end
  62. log.info("rtmp", "reconnect failed after ... ", rtmp_retries)
  63. rtmp_reconnecting = false
  64. end
  65. end
  66. if fota_enable then
  67. -- 升级结果的回调函数
  68. local function fota_cb(ret)
  69. log.info("fota result: ", ret)
  70. if ret == 0 then
  71. rtos.reboot()
  72. end
  73. end
  74. local ota_opts = {}
  75. -- 定时自动升级
  76. sys.timerLoopStart(libfota2.request, fota_looptime, fota_cb, ota_opts)
  77. end
  78. sys.taskInit(function()
  79. sys.wait(1000)
  80. log.info("当前脚本版本号:", VERSION, "core版本号:", rtos.version())
  81. wlan.init()
  82. wlan.connect("luatos1234", "12341234", 1)
  83. sys.waitUntil("IP_READY")
  84. camera.config(0, camera.CONF_UVC_FPS, 15)
  85. -- camera.config(0, camera.CONF_H264_QP_INIT, 12)
  86. -- camera.config(0, camera.CONF_H264_IMB_BITS, 120)
  87. camera.config(0, camera.CONF_H264_PMB_BITS, 20)
  88. camera.config(0, camera.CONF_H264_PFRAME_NUMS, 23)
  89. socket.sntp()
  90. sys.wait(200)
  91. result = camera.init(dvp_camera_table)
  92. log.info("摄像头初始化", result)
  93. camera.start(camera_id)
  94. if not rtmpc then
  95. -- rtmpc = rtmp.create("rtmp://47.94.236.172/live/1ca786f5") -- 替换为你的推流地址
  96. end
  97. rtmpc:setCallback(function(state, ...)
  98. log.info("rtmp状态变化", state, ...)
  99. if state == rtmp.STATE_CONNECTED then
  100. log.info("rtmp状态变化", "已连接到推流服务器")
  101. rtmp_retries = 0
  102. elseif state == rtmp.STATE_PUBLISHING then
  103. log.info("rtmp状态变化", "已开始推流")
  104. rtmp_retries = 0
  105. elseif state == rtmp.STATE_ERROR then
  106. log.info("rtmp状态变化", "出错:", ...)
  107. -- 发生错误时尝试重连(若网络可用则立即尝试)
  108. sys.publish("RECONNECT_RTMP", ...)
  109. end
  110. end)
  111. log.info("开始连接到推流服务器...")
  112. sys.wait(100)
  113. rtmpc:connect()
  114. sys.wait(300)
  115. -- 开始处理
  116. log.info("rtmp", "开始推流...")
  117. rtmpc:start() -- 已自动调用 camera.capture(camera_id, "rtmp", 1)
  118. while 1 do
  119. --- 打印一下内存状态
  120. sys.wait(30*1000)
  121. log.info("lua", rtos.meminfo())
  122. log.info("sys", rtos.meminfo("sys"))
  123. log.info("psram", rtos.meminfo("psram"))
  124. sys.wait(2000)
  125. end
  126. -- #################################################
  127. end)
  128. sys.taskInit(rtmp_try_reconnect)
  129. -- 用户代码已结束---------------------------------------------
  130. -- 结尾总是这一句
  131. sys.run()
  132. -- sys.run()之后后面不要加任何语句!!!!!