gstreamer+mpp 解码问题

固件类型:官方提供的固件
固件文件名称: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 还是有同样的问题

怎么复现问题?提供下相关程序吧

799959745 发表于 2022-10-21 14:22
怎么复现问题?提供下相关程序吧

复现需要的相关程序和说明
链接:https://pan.baidu.com/s/19YHA6f9RMpcq9nWftgYFMQ
提取码:h4a1

应该是这一行有问题。这行代码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。视 …

测试视频能否提供一下

18063363651 发表于 2022-10-26 10:19
测试视频能否提供一下

链接: https://pan.baidu.com/s/1XzCErm4lfaja5qHKvFEVTA 提取码: acow

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管道有问题。

以下几点需要注意的:

  1. 我们只支持 gstreamer 、 mpp,opencv 部分是不支持的也没有修改过,需要排除 opencv 问题。

  2. 为了减轻 ddr 带宽负担现在固件默认都是开启了 AFBC 模式(压缩解码器输出的 NV12 数据),所以输出的绝非是 NV12,而是经过压缩的 AFBC 数据。

  3. 请关闭 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”

  4. 关于 解码输出数据不等于 1080 问题,底层部分硬件模块需要字节对齐,1080 → 1088 这是正常现象,客户可以用 rga 后处理来裁剪缩放,但是 1084 是没见过的。

上面第三点 3 是在 v1.0.2a 固件上验证的 gst 没有复现问题,注意注意注意注意 需要关闭 AFBC 测试。

板蓝根 发表于 2022-11-2 15:42
以下几点需要注意的:

  1. 我们只支持 gstreamer 、 mpp,opencv 部分是不支持的也没有修改过,需要排除 op …

关闭 AFBC之后就正常了,pipline 是这样的 rtspsrc location=rtsp://admin:admin@192.168.3.242:554/1/1 ! rtph264depay ! h264parse ! mppvideodec ! videoconvert ! appsink 为什么显示的画面延迟特别大 比之前用opnecv 直接软解还要慢