问题描述
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