main.lua 4.5 KB

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