k230 cammv开发板基于micropython,使用Rtsp上传图像数据到pc端

Viewed 98

问题描述


WBC 硬件编码 (wbc dump failed)
数据来源是UVC摄像头

'''
RTSP 诊断版:
- 只保留 UVC 采集 + Virtual Display + WBCRtsp
- 目的是先确认 VLC/ffplay 能看到动态画面

如果这个版本正常,说明问题在"物理 LCD + WBC 抓屏"链路,
不是 UVC 采集本身。
'''

import os
import sys
import gc
import utime
import network

from media.display import *
from media.media import *
from media.uvc import *
from libs.WBCRtsp import WBCRtsp


DISPLAY_WIDTH = 640
DISPLAY_HEIGHT = 480

UVC_WIDTH = 640
UVC_HEIGHT = 480

WIFI_SSID = "12345"
WIFI_PASSWORD = "12345678"


def WIFI_Connect(ssid, passwd=None):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)

    start_time = utime.ticks_ms()
    if not wlan.isconnected():
        print("connecting to network...")
        wlan.connect(ssid, passwd)
        while not wlan.isconnected():
            if utime.ticks_diff(utime.ticks_ms(), start_time) > 10000:
                print("WIFI Connected Timeout!")
                break
            utime.sleep_ms(200)

    if wlan.isconnected():
        while wlan.ifconfig()[0] == "0.0.0.0":
            utime.sleep_ms(50)
        print("network information:", wlan.ifconfig())
        return wlan

    print("Connect wifi failed.")
    return wlan


def wait_uvc_camera():
    print("waiting for UVC camera...")
    probe_retry = 0
    while True:
        plugin, dev = UVC.probe()
        probe_retry += 1
        if plugin:
            print(f"UVC detected: {dev}")
            return dev
        if probe_retry % 10 == 0:
            print(f"UVC probe retry={probe_retry}, plugin={plugin}, dev={dev}")
        utime.sleep_ms(500)


def media_init():
    print("media_init OK")
    Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60, to_ide=False)  # deprecated
    MediaManager.init()

    wait_uvc_camera()

    mode = UVC.video_mode(UVC_WIDTH, UVC_HEIGHT, UVC.FOURCC_YUY2, 30)
    succ, mode = UVC.select_video_mode(mode)
    print(f"select mode success: {succ}, mode: {mode}")
    UVC.start(cvt=True)

    print("media_init done")


def media_deinit():
    try:
        UVC.stop()
    except:
        pass

    try:
        Display.deinit()
    except:
        pass

    utime.sleep_ms(100)

    try:
        MediaManager.deinit()
    except:
        pass

    print("media_deinit OK")


def start_rtsp_preview():
    WBCRtsp.configure(wbc_width=DISPLAY_WIDTH, wbc_height=DISPLAY_HEIGHT)
    WBCRtsp.start()


def stop_rtsp_preview():
    try:
        WBCRtsp.stop()
    except:
        pass


def main():
    os.exitpoint(os.EXITPOINT_ENABLE)
    last_img = None

    try:
        media_init()

        wlan = WIFI_Connect(WIFI_SSID, WIFI_PASSWORD)
        if wlan.isconnected():
            print(f"RTSP URL = rtsp://{wlan.ifconfig()[0]}:8554/test")

        start_rtsp_preview()

        fps = utime.clock()
        frame_count = 0
        print_period = 30
        gc_period = 60

        while True:
            os.exitpoint()
            fps.tick()

            raw_img = UVC.snapshot()
            if raw_img is None:
                utime.sleep_ms(1)
                continue

            img = None
            try:
                img = raw_img.to_rgb565()
                Display.show_image(img)
            finally:
                try:
                    raw_img.__del__()
                except:
                    pass

            if last_img is not None:
                try:
                    last_img.__del__()
                except:
                    pass
            last_img = img

            frame_count += 1
            if frame_count % print_period == 0:
                print(f"fps: {fps.fps():.2f}")

            if frame_count % gc_period == 0:
                gc.collect()

    except BaseException as e:
        print(f"程序异常退出: {e}")
        sys.print_exception(e)
    finally:
        if last_img is not None:
            try:
                last_img.__del__()
            except:
                pass
        stop_rtsp_preview()
        media_deinit()
        gc.collect()


if __name__ == "__main__":
    main()

硬件板卡


rtsmart ai开发套件

软件版本


CanMV-K230_RTT_EVB_BOARD_micropython_v1.5-legacy-0-g413737f_nncase_v2.9.0.img.gz

其他信息


整个链路的流程是:

UVC摄像头 → to_rgb565() → Display.show_image() → [LCD帧缓冲]

WBC硬件抓取编码

RTSP服务端发送

PC VLC接收播放
开发板运行终端除了wbc dump failed其他运行是正常的,开发板和电脑一起连接的手机热点,能相互ping同,电脑端已经关闭了防火墙。

下面是终端的打印信息:

media_init OK
deprecated function
waiting for UVC camera...
UVC probe retry=10, plugin=False, dev=None
UVC probe retry=20, plugin=False, dev=None
UVC detected: Generic#USB2.0 PC CAMERA
select mode success: True, mode: {"width":640, "height":480, "format":raw, "fourcc":0x32595559, "fps":30.00}
media_init done
Network (rt-smart) is always active and cannot be disabled.
connecting to network...
network information: ('192.168.43.211', '255.255.255.0', '192.168.43.1', '192.168.43.1')
RTSP URL = rtsp://192.168.43.211:8554/test
RTSP server started: rtsp://192.168.43.211:8554/test
fps: 27.03
fps: 27.40
wbc dump failedfps: 27.27
fps: 27.40
fps: 27.47
fps: 27.52
fps: 27.56

1 Answers

你好,请先使用官网的demo验证下是否有问题:https://www.kendryte.com/k230_canmv/zh/main/example/media/video.html#ai-rtsp