Explorar el Código

fix: rtmp,默认chunk size必须是128

Wendal Chen hace 1 mes
padre
commit
4cefd2d5fc

+ 2 - 2
components/rtmp/include/luat_rtmp_push.h

@@ -29,8 +29,8 @@ extern "C" {
 
 /* ======================== RTMP常量定义 ======================== */
 
-/** RTMP块大小(字节) */
-#define RTMP_DEFAULT_CHUNK_SIZE 4096
+/** RTMP默认块大小(字节) - RTMP规范规定的默认值为128 */
+#define RTMP_DEFAULT_CHUNK_SIZE 128
 
 /** RTMP缓冲区大小(字节) - 需要足够大以容纳I帧 */
 #define RTMP_BUFFER_SIZE (512 * 1024)

+ 34 - 1
components/rtmp/src/luat_rtmp_push.c

@@ -1920,6 +1920,24 @@ static int rtmp_send_command(rtmp_ctx_t *ctx, const char *command,
             
             LLOGD("RTMP: Parameter - app: %s", ctx->app);
         }
+
+        // 添加 type参数
+        if (1) {
+            const char *key = "type";
+            const char *val = "nonprivate";
+            write_be16(&amf_buf[offset], strlen(key));
+            offset += 2;
+            memcpy(&amf_buf[offset], key, strlen(key));
+            offset += strlen(key);
+            
+            amf_buf[offset++] = AMF_TYPE_STRING;
+            write_be16(&amf_buf[offset], strlen(val));
+            offset += 2;
+            memcpy(&amf_buf[offset], val, strlen(val));
+            offset += strlen(val);
+            
+            LLOGD("RTMP: Parameter - type: %s", val);
+        }
         
         /* 3.2 flashVer 参数 */
         {
@@ -1958,7 +1976,7 @@ static int rtmp_send_command(rtmp_ctx_t *ctx, const char *command,
         }
         
         /* 3.4 fpad 参数 */
-        {
+        if (0) {
             const char *key = "fpad";
             write_be16(&amf_buf[offset], strlen(key));
             offset += 2;
@@ -2137,12 +2155,14 @@ static int rtmp_process_data(rtmp_ctx_t *ctx) {
     const char *failed_str = "NetConnection.Connect.Failed";
     const char *result_str = "_result";
     const char *publish_start_str = "NetStream.Publish.Start";
+    const char *on_bw_done_str = "onBWDone";
 
     bool found_success = false;
     bool found_failed = false;
     bool found_on_status = false;
     bool found_result = false;
     bool found_publish_start = false;
+    bool found_on_bw_done = false;
 
     uint32_t pos = 0;
     while (pos + 12 <= ctx->recv_pos) {
@@ -2220,6 +2240,14 @@ static int rtmp_process_data(rtmp_ctx_t *ctx) {
                     }
                 }
             }
+            if (!found_on_bw_done && msg_len >= strlen(on_bw_done_str)) {
+                for (uint32_t i = 0; i + strlen(on_bw_done_str) <= msg_len; i++) {
+                    if (memcmp(&payload[i], on_bw_done_str, strlen(on_bw_done_str)) == 0) {
+                        found_on_bw_done = true;
+                        break;
+                    }
+                }
+            }
         }
 
         /* 前进到下一条消息 */
@@ -2315,6 +2343,11 @@ static int rtmp_process_data(rtmp_ctx_t *ctx) {
         rtmp_set_state(ctx, RTMP_STATE_ERROR, RTMP_ERR_CONNECT_FAILED);
         LLOGE("RTMP: Connection failed");
         
+    } else if (found_on_bw_done) {
+        /* 收到 onBWDone 带宽检测完成信号
+         * 服务器已完成带宽检测,可以继续发送流命令 */
+        LLOGD("RTMP: Received onBWDone (bandwidth detection complete)");
+        /* onBWDone 是通知,不需要额外响应,继续现有流程 */
     } else if (ctx->state == RTMP_STATE_CONNECTED && found_on_status) {
         /* 收到onStatus,继续等待 */
         LLOGD("RTMP: Received onStatus response");

+ 1 - 1
olddemo/camera/dvp_cam/main.lua

@@ -34,7 +34,7 @@ local testMode = 2
 -- WIFI热点名称
 local ssid = "uiot"
 -- WIFI热点密码
-local password = "12345678"
+local password = "czcjhp1985cbm"
 
 local rawbuff, err
 

+ 2 - 1
olddemo/camera/rtmp_usb/main.lua

@@ -26,7 +26,8 @@ sys.taskInit(function()
 
     -- 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://47.94.236.172/live/1ca786f5") -- 替换为你的推流地址
+    local rtmpc = rtmp.create("rtmp://180.152.6.34:1936/live/guangzhou")
     rtmpc:setCallback(function(state, ...)
         if state == rtmp.STATE_CONNECTED then
             log.info("rtmp", "已连接到推流服务器")

+ 27 - 5
olddemo/camera/usb_cam_mp4/main.lua

@@ -15,8 +15,8 @@ local camera_id = camera.USB
 
 local usb_camera_table = {
     id = camera_id,
-    sensor_width = 640,
-    sensor_height = 480,
+    sensor_width = 1280,
+    sensor_height = 720,
     usb_port = 1
 }
 
@@ -51,9 +51,12 @@ local function fatfs_spi_pin()
 end
 
 sys.taskInit(function()
+    sys.wait(1000)
+    airlink.init()
+    airlink.start(airlink.MODE_SPI_MASTER)
     sys.wait(1000)
     -- fatfs.debug(1) -- 若挂载失败,可以尝试打开调试信息,查找原因
-
+    camera.config(0, camera.CONF_UVC_FPS, 30)
 
     -- -- 此为spi方式
     local spi_id, pin_cs,tp = fatfs_spi_pin()
@@ -77,17 +80,31 @@ sys.taskInit(function()
         log.info("fatfs", "err", err)
     end
 
+    wlan.init()
+    wlan.connect("luatos1234", "12341234", 1)
+
+    sys.waitUntil("IP_READY", 15000)
+    sys.wait(100)
+    socket.sntp()
     sys.wait(1000)
+    -- 打印剩余内存
+    log.info("lua", rtos.meminfo())
+    log.info("sys", rtos.meminfo("sys"))
+    log.info("psram", rtos.meminfo("psram"))
 
     --初始化摄像头
     while 1 do
+        -- if true then rtos.reboot() end
         result=camera.init(usb_camera_table)
         log.info("摄像头初始化", result)
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        log.info("psram", rtos.meminfo("psram"))
         if(result==0) then
             camera.start(camera_id)
             --开始mp4录制
-            camera.capture(camera_id, "/sd/abc.mp4", 1)
-            sys.wait(15000)
+            camera.capture(camera_id, "/sd/" ..  os.time() .. ".mp4", 1)
+            sys.wait(3000)
 
             --结束MP4录制
             camera.stop(camera_id)
@@ -95,7 +112,12 @@ sys.taskInit(function()
             log.info("保存成功")
         end
         camera.close(camera_id)
+        --- 打印一下内存状态
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        log.info("psram", rtos.meminfo("psram"))
         sys.wait(2000)
+        -- rtos.reboot()
     end
     -- #################################################