在 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_data 或 get_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 + hbplayer 或 ffplay。
步骤:编写一个简单的 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 不适合做网络流接收端,建议用 ffplay 或 ffmpeg 转推:
# 终端 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_data 和 get_isp_data,不需要额外写服务,请按以下顺序排查:
-
验证文件播放(确认数据本身没问题):
# 先确认你 dump 的文件用 hbplayer 能否正常显示 hbplayer --input dump_isp.yuv --width 3840 --height 2160 --format nv12- 如果
hbplayer显示正常:说明 ISP 输出没问题,是你之前用ffplay的参数不对(色彩范围/格式)。 - 如果
hbplayer显示依然暗/偏色:说明 ISP 配置(AE/AWB)没生效,或者 RAW 转 YUV 的通路有问题。
- 如果
-
检查 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 文件。 -
使用 VTunerClient + hbplayer 联调(进阶):
如果你需要实时查看 ISP 处理过程中的数据,可以使用地平线的调试工具链:- 启动 Tuning Server
- 使用
VTunerClient连接并抓取数据 hbplayer作为 VTunerClient 的显示后端
结论:
不要尝试写一个“为 hbplayer 提供数据的服务”,而是应该:
- 先用
hbplayer直接播放你 dump 出来的文件,验证数据源是否正确。 - 如果文件播放正常,问题就在
ffplay参数上(坚持用hbplayer调试)。 - 如果文件播放也不正常,问题在 ISP 配置(Tuning) 或 RAW 数据解析(位宽/Bayer) 上。