固件类型:官方提供的固件
固件文件名称:ROC-RK3588S-PC_Ubuntu20.04-Gnome-r21164_v1.0.0c_22
固件下载地址:百度网盘
Log日志:opencv编译log.txt
开发语言:python 版本 python3.7.13 opencv4.5.0
平台:rk3588
固件:ROC-RK3588S-PC_Ubuntu20.04-Gnome-r21164_v1.0.0c_220622.img
问题描述:
1)编译opencv with gstreamer
2) 使用opencv + gstreamer + mpp 解析rtsp视频流和视频文件
问题:
在使用pycharm远程连接debug运行时可以读到视频信息,并且将某一帧可以保存成图片文件,代码如图1:
图可以看到,视频分辨率是1920*1080
现在直接在板子上面运行程序 python3 test.py 读到的rtsp 图像转numpy 为 0 并且 图像大小1920* 1084, 高度比实际图像多了4个像素。(720P也是这个问题,无论是rtsp 还是视频文件(mp4))
tchip_askquestions
opencv编译log.txt (10.8 KB)
799959745 发表于 2022-10-20 17:09
更新最新固件验证下还有没有这个问题?
使用最新固件 : ROC-RK3588S-PC_Ubuntu20.04-Gnome-r211123_v1.0.2a_221013.img 还是有同样的问题
应该是这一行有问题。这行代码cv2.imwrite(“snap/{}.jpg”.format(time.time()), frame)使用的是opencv来编码。
但是直接使用gstreamer来解码mp4得到的yuv数据,然后使用ffmpeg是可以通过对应分辨率来播放的。而不需要增加分辨率。
你可以尝试下使用gstreamer来编码试一下结果。而非使用opencv来编码。
799959745 发表于 2022-10-24 17:38
应该是这一行有问题。这行代码cv2.imwrite(“snap/{}.jpg”.format(time.time()), frame)使用的是opencv来编 …
感谢回复!
我使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的,但是在板子上直接运行程序不行?这一点如何解释?
另外gstreamer来解码mp4得到的yuv数据,如何能转成numpy格式,我需要numpy格式的RGB数据
799959745 发表于 2022-10-24 17:38
应该是这一行有问题。这行代码cv2.imwrite(“snap/{}.jpg”.format(time.time()), frame)使用的是opencv来编 …
另外我改用gstreamer+MPP 来读rtsp 脚本连接:https://pan.baidu.com/s/1m15-u6HLiIv2HJLK58rCQg
提取码:om5f
可以正常显示画面 但是在程序中获取图像数据同样也是获取不到
def on_new_sample(app_sink):
sample = app_sink.pull_sample()
caps = sample.get_caps()
# Extract the width and height info from the sample's caps
height = caps.get_structure(0).get_value("height")
width = caps.get_structure(0).get_value("width")
[b]print(height, width , 3)-------这里和用opencv结果一样1084*1920 实际应该是1080*1920[/b]
# Get the actual data
buffer = sample.get_buffer()
print(caps,"buffer size ",buffer.get_size())
# Get read access to the buffer data
success, map_info = buffer.map(Gst.MapFlags.READ)
print(success) #-------这里返回的是false,无法完成后面的numpy转换
print(map_info)
if not success:
raise RuntimeError(“Could not map buffer data!”)
numpy_frame = np.ndarray(
shape=(height, width, 3),
dtype=np.uint8,
buffer=map_info.data)
print(numpy_frame)
buffer.unmap(map_info)
18063363651 发表于 2022-10-24 18:02
感谢回复!
我使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的,但是在板子上直 …
关于这点(使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的)是怎么实现的?
使用ssh和直接在板子上面跑的结果应该是一样的。是不是用的PC电脑的OPENCVl来编码了?
可以通过以下方式验证是否解码和编码正常
测试系统buildroot,v1.0.2a 版本。测试文件分辨率1280x720。视频格式nv12。
解码mp4成yuv格式
gst-launch-1.0 filesrc location=/xiaochou_30s.mp4 ! qtdemux ! h264parse ! mppvideodec ! filesink location=/dec.yuv
编码yuv成264码流,然后播放到显示屏
gst-launch-1.0 filesrc location=/dec.yuv blocksize=1382400 ! 'video/x-raw,width=1280,height=720,framerate=30/1,format=NV12' ! mpph264enc ! h264parse ! mppvideodec ! waylandsink
正常就能看到
至于opencv编码的问题不在支持范围内。可以自行使用mpph264enc或mpph265enc管道来编码。
本帖最后由 18063363651 于 2022-10-26 09:11 编辑
799959745 发表于 2022-10-25 09:40
关于这点(使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的)是怎么实现的?
使 …
就是pc 用pycharm 通过ssh 连接板子 用pycharm直接运行就是正常的。 如果直接在cmd里面ssh 连板子 就会出现问题
正常来讲 这两种方式不都应该是一样的吗
799959745 发表于 2022-10-25 11:00
可以通过以下方式验证是否解码和编码正常
测试系统buildroot,v1.0.2a 版本。测试文件分辨率1280x720。视 …
gst-launch-1.0 filesrc location=/home/firefly/xiaochou_30s.mp4 ! qtdemux ! h264parse ! mppvideodec ! filesink location=/home/firefly/xiaochou.yuv 出错了
18063363651 发表于 2022-10-26 17:23
gst-launch-1.0 filesrc location=/home/firefly/xiaochou_30s.mp4 ! qtdemux ! h264parse ! mppvideodec …
buildroot系统测试的。ubuntu下的filesink管道有问题。
以下几点需要注意的:
-
我们只支持 gstreamer 、 mpp,opencv 部分是不支持的也没有修改过,需要排除 opencv 问题。
-
为了减轻 ddr 带宽负担现在固件默认都是开启了 AFBC 模式(压缩解码器输出的 NV12 数据),所以输出的绝非是 NV12,而是经过压缩的 AFBC 数据。
-
请关闭 AFBC 后使用 gstreamer 来测试编解码问题 :
unset GST_MPP_VIDEODEC_DEFAULT_ARM_AFBC =》 关闭 AFBC
测试解码 mp4 封装的 h264 视频(固件自带):gst-play-1.0 --videosink=“filesink location=./save.yuv” /usr/local/test.mp4
利用 videotestsrc 同时测试编码解码: gst-launch-1.0 videotestsrc ! queue ! video/x-raw,width=1920,height=1080 ! mpph264enc ! h264parse ! mppvideodec ! queue ! filesink location=“test.yuv”
-
关于 解码输出数据不等于 1080 问题,底层部分硬件模块需要字节对齐,1080 → 1088 这是正常现象,客户可以用 rga 后处理来裁剪缩放,但是 1084 是没见过的。
上面第三点 3 是在 v1.0.2a 固件上验证的 gst 没有复现问题,注意注意注意注意 需要关闭 AFBC 测试。
板蓝根 发表于 2022-11-2 15:42
以下几点需要注意的:
- 我们只支持 gstreamer 、 mpp,opencv 部分是不支持的也没有修改过,需要排除 op …
关闭 AFBC之后就正常了,pipline 是这样的 rtspsrc location=rtsp://admin:admin@192.168.3.242:554/1/1 ! rtph264depay ! h264parse ! mppvideodec ! videoconvert ! appsink 为什么显示的画面延迟特别大 比之前用opnecv 直接软解还要慢