imx相机输出的结果可视化异常

在 RDK S100 上,hbplayer 本身是一个数据消费者(显示工具),它需要从某个数据源(如摄像头通路、RTSP 流、或自定义程序)获取数据。

要让 hbplayer 显示图像,通常有 3 种方式,取决于你的数据在哪里:


方案一:直接播放本地文件(最简单,用于验证)

如果你的 YUV/RAW 数据已经 dump 到文件中,直接播放即可,不需要额外服务

# 播放 NV12 格式的 YUV 文件
hbplayer --input /path/to/your_file.yuv \
         --width 3840 --height 2160 \
         --format nv12 \
         --loop  # 可选:循环播放

# 播放 RAW 文件 (如果是 12bit 打包,可能需要指定 format)
hbplayer --input /path/to/raw_file.raw \
         --width 3840 --height 2160 \
         --format rggb12  # 或 rggb10, 根据实际位宽

方案二:通过 HBN 通路直接显示(推荐,实时数据)

如果你是通过 get_isp_dataget_vin_data 获取的实时内存数据,通常不需要自己写服务,而是修改示例代码使用官方通路

方法 A:使用官方示例通路
RDK S100 的多媒体示例(如 vio2display)内部已经集成了显示逻辑。

# 运行官方示例,通常会自动调起 hbplayer 或 VOT 显示
# 路径可能在 /app/cdev_demo/ 或 /app/pydev_demo/
cd /app/cdev_demo/vio2display
./vio2display  # 具体可执行文件名可能不同

方法 B:在你的 C/C++ 代码中集成 HB_VOT 发送
如果你自己写了程序获取帧(sp_vio_get_frame),需要调用 HB_VOT_SendFrame 将数据送到显示模块,hbplayer 可以作为 VOT 的后端显示工具。

  • 原理:你的程序 → HB_VOT_SendFrame → VOT 模块 → HDMI/ hbplayer
  • 参考代码:搜索社区帖子 vi 到 vo 链路的 demo 需求 或查看 SDK 中的 sample_venc / sample_vot

方案三:自定义 TCP/UDP 推流服务(灵活,适合调试)

如果你想写一个独立的服务程序,把内存中的数据通过网络发送给 hbplayer(类似 RTSP 推流),可以使用 TCP/UDP + 自定义协议RTSP

注意hbplayer 主要设计用于播放本地文件或 HBN 通路,原生不支持直接监听 TCP 端口接收裸数据。
替代方案:使用 ffmpeg + hbplayerffplay

步骤:编写一个简单的 Python TCP 服务器发送 YUV

如果你的数据在 Python 程序中:

# server.py - 发送 NV12 数据
import socket
import numpy as np

HOST = '0.0.0.0'
PORT = 5000
WIDTH, HEIGHT = 3840, 2160
FRAME_SIZE = WIDTH * HEIGHT * 3 // 2  # NV12 大小

def generate_frame():
    # 这里替换成你获取 ISP 数据的逻辑
    # 例如:frame = get_isp_data() 
    # 模拟生成一帧灰度图
    y = np.ones((HEIGHT, WIDTH), dtype=np.uint8) * 128
    uv = np.ones((HEIGHT//2, WIDTH), dtype=np.uint8) * 128
    return np.concatenate([y.flatten(), uv.flatten()])

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    print(f"Listening on {HOST}:{PORT}...")
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        while True:
            frame = generate_frame()
            conn.sendall(frame.tobytes())

步骤:在另一端(或同一板子)用 ffplay 接收

由于 hbplayer 不适合做网络流接收端,建议用 ffplayffmpeg 转推:

# 终端 1: 运行上面的 server.py

# 终端 2: 使用 ffplay 接收 TCP 流并显示
ffplay -f rawvideo -pixel_format nv12 -video_size 3840x2160 -framerate 30 \
       tcp://127.0.0.1:5000

针对你的 IMX728 问题,推荐调试路径

既然你已经在运行 get_vin_dataget_isp_data不需要额外写服务,请按以下顺序排查:

  1. 验证文件播放(确认数据本身没问题):

    # 先确认你 dump 的文件用 hbplayer 能否正常显示
    hbplayer --input dump_isp.yuv --width 3840 --height 2160 --format nv12
    
    • 如果 hbplayer 显示正常:说明 ISP 输出没问题,是你之前用 ffplay 的参数不对(色彩范围/格式)。
    • 如果 hbplayer 显示依然暗/偏色:说明 ISP 配置(AE/AWB)没生效,或者 RAW 转 YUV 的通路有问题。
  2. 检查 ISP Tuning 配置
    IMX728 这种高端 Sensor,必须加载对应的 ISP Tuning 文件才能正常曝光和色彩还原。

    # 检查是否有 IMX728 的 tuning 配置
    ls /userdata/isp_tuning/ | grep -i 728
    # 或者查看当前加载的配置
    cat /etc/hobot/isp_config.json  # 路径可能不同,根据实际 SDK 版本查找
    

    如果没有,需要运行 run_tuning.sh 进行配置,或联系地平线获取 IMX728 的 tuning 文件。

  3. 使用 VTunerClient + hbplayer 联调(进阶):
    如果你需要实时查看 ISP 处理过程中的数据,可以使用地平线的调试工具链:

    • 启动 Tuning Server
    • 使用 VTunerClient 连接并抓取数据
    • hbplayer 作为 VTunerClient 的显示后端

结论
不要尝试写一个“为 hbplayer 提供数据的服务”,而是应该:

  1. 先用 hbplayer 直接播放你 dump 出来的文件,验证数据源是否正确。
  2. 如果文件播放正常,问题就在 ffplay 参数上(坚持用 hbplayer 调试)。
  3. 如果文件播放也不正常,问题在 ISP 配置(Tuning)RAW 数据解析(位宽/Bayer) 上。