Quellcode durchsuchen

update: rtmp,脚本上添加重连机制

??? vor 3 Monaten
Ursprung
Commit
12fc6c422c
1 geänderte Dateien mit 63 neuen und 4 gelöschten Zeilen
  1. 63 4
      olddemo/camera/rtmp_usb/main.lua

+ 63 - 4
olddemo/camera/rtmp_usb/main.lua

@@ -11,6 +11,56 @@ local usb_camera_table = {
     usb_port = 1
 }
 
+local rtmpc = nil
+-- 重连控制变量与方法
+local rtmp_reconnecting = false -- 是否正在重连
+local rtmp_retries = 0         -- 当前重连次数
+local rtmp_max_retries = 5     -- 最大重连次数
+
+-- rtmp出现问题时的重连逻辑
+function rtmp_try_reconnect()
+    while true do
+        local ret, error_id = sys.waitUntil("RECONNECT_RTMP")
+        if rtmp_reconnecting or not rtmpc then return end
+        -- if error_id > -4 and error_id ~= -1 then
+        --     -- 非重连就能解决的错误,不进行重连
+        --     log.info("rtmp", "error is not recoverable, will not reconnect", error_id)
+        --     return
+        -- end
+        rtmp_reconnecting = true
+        rtmpc:disconnect()  -- 确认断开当前连接
+        while rtmp_retries < rtmp_max_retries do
+            rtmp_retries = rtmp_retries + 1
+            local isNetReady, adapterIndex = socket.adapter()
+            log.info("rtmp", "reconnect attempt", rtmp_retries, "adapter_index: ", adapterIndex)
+            -- 检测当前网络是否就绪
+            if isNetReady then
+                local ok = rtmpc:connect()
+                if ok then
+                    -- 等待短时间以便连接完成
+                    sys.wait(1000)
+                    local st = rtmpc:getState()
+                    if st == rtmp.STATE_CONNECTED or st == rtmp.STATE_PUBLISHING then
+                        log.info("rtmp", "reconnect success")
+                        -- 恢复推流
+                        rtmpc:start()
+                        rtmp_reconnecting = false
+                        rtmp_retries = 0
+                        return
+                    end
+                end
+            else
+                -- 等待任意网卡变为就绪
+                log.info("rtmp", "waiting for IP_READY")
+                sys.waitUntil("IP_READY", 60000)
+            end
+            sys.wait(10000) -- 每次重连间隔10秒
+        end
+        log.info("rtmp", "reconnect failed after ... ", rtmp_retries)
+        rtmp_reconnecting = false
+    end
+end
+
 sys.taskInit(function()
     wlan.init()
     wlan.connect("luatos1234", "12341234", 1)
@@ -28,18 +78,25 @@ sys.taskInit(function()
     log.info("摄像头初始化", result)
     camera.start(camera_id)
 
-    -- local rtmpc = rtmp.create("rtmp://192.168.1.10:1935/live/abc")
-    local rtmpc = rtmp.create("rtmp://180.152.6.34:1935/stream1live/1ca786f5_23e5_4d89_8b1d_2eec6932775a_0001")
-    -- local rtmpc = rtmp.create("rtmp://47.94.236.172/live/1ca786f5") -- 替换为你的推流地址
-    -- local rtmpc = rtmp.create("rtmp://180.152.6.34:1936/live/guangzhou")
+    if not rtmpc then
+        -- rtmpc = rtmp.create("rtmp://192.168.1.10:1935/live/abc")
+        rtmpc = rtmp.create("rtmp://180.152.6.34:1935/stream1live/1ca786f5_23e5_4d89_8b1d_2eec6932775a_0001")
+        -- rtmpc = rtmp.create("rtmp://47.94.236.172/live/1ca786f5") -- 替换为你的推流地址
+        -- rtmpc = rtmp.create("rtmp://180.152.6.34:1936/live/guangzhou")
+    end
+
     rtmpc:setCallback(function(state, ...)
         log.info("rtmp状态变化", state, ...)
         if state == rtmp.STATE_CONNECTED then
             log.info("rtmp状态变化", "已连接到推流服务器")
+            rtmp_retries = 0
         elseif state == rtmp.STATE_PUBLISHING then
             log.info("rtmp状态变化", "已开始推流")
+            rtmp_retries = 0
         elseif state == rtmp.STATE_ERROR then
             log.info("rtmp状态变化", "出错:", ...)
+            -- 发生错误时尝试重连(若网络可用则立即尝试)
+            sys.publish("RECONNECT_RTMP", ...)
         end
     end)
     log.info("开始连接到推流服务器...")
@@ -63,6 +120,8 @@ sys.taskInit(function()
 
 end)
 
+sys.taskInit(rtmp_try_reconnect)
+
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()