Firefly开源社区

标题: gstreamer+mpp 解码问题 [打印本页]

作者: 18063363651    时间: 2022-10-19 17:19
标题: gstreamer+mpp 解码问题
开发语言: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

1.jpg (91.24 KB, 下载次数: 96)

1.jpg

2.jpg (6.77 KB, 下载次数: 102)

2.jpg

3.jpg (93.18 KB, 下载次数: 94)

3.jpg

opencv编译log.txt

10.78 KB, 下载次数: 3, 下载积分: 灯泡 -1 , 经验 -1


作者: 799959745    时间: 2022-10-20 17:09
更新最新固件验证下还有没有这个问题?
作者: 18063363651    时间: 2022-10-21 11:01
799959745 发表于 2022-10-20 17:09
更新最新固件验证下还有没有这个问题?

使用最新固件 : ROC-RK3588S-PC_Ubuntu20.04-Gnome-r211123_v1.0.2a_221013.img  还是有同样的问题
作者: 799959745    时间: 2022-10-21 14:22
怎么复现问题?提供下相关程序吧
作者: 18063363651    时间: 2022-10-21 15:53
799959745 发表于 2022-10-21 14:22
怎么复现问题?提供下相关程序吧

复现需要的相关程序和说明
链接:https://pan.baidu.com/s/19YHA6f9RMpcq9nWftgYFMQ
提取码:h4a1
作者: 799959745    时间: 2022-10-24 17:38
应该是这一行有问题。这行代码cv2.imwrite("snap/{}.jpg".format(time.time()), frame)使用的是opencv来编码。
但是直接使用gstreamer来解码mp4得到的yuv数据,然后使用ffmpeg是可以通过对应分辨率来播放的。而不需要增加分辨率。
你可以尝试下使用gstreamer来编码试一下结果。而非使用opencv来编码。
作者: 18063363651    时间: 2022-10-24 18:02
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数据
作者: 18063363651    时间: 2022-10-24 18:18
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")
    print(height, width , 3)-------这里和用opencv结果一样1084*1920 实际应该是1080*1920
    # 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)

作者: 799959745    时间: 2022-10-25 09:40
18063363651 发表于 2022-10-24 18:02
感谢回复!
我使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的,但是在板子上直 ...

关于这点(使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的)是怎么实现的?
使用ssh和直接在板子上面跑的结果应该是一样的。是不是用的PC电脑的OPENCVl来编码了?
作者: 799959745    时间: 2022-10-25 11:00
可以通过以下方式验证是否解码和编码正常
测试系统buildroot,v1.0.2a 版本。测试文件分辨率1280x720。视频格式nv12。
解码mp4成yuv格式
  1. gst-launch-1.0 filesrc location=/xiaochou_30s.mp4 ! qtdemux ! h264parse ! mppvideodec ! filesink location=/dec.yuv
复制代码
编码yuv成264码流,然后播放到显示屏
  1. 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:09
本帖最后由 18063363651 于 2022-10-26 09:11 编辑
799959745 发表于 2022-10-25 09:40
关于这点(使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的)是怎么实现的?
使 ...

就是pc 用pycharm 通过ssh 连接板子 用pycharm直接运行就是正常的。 如果直接在cmd里面ssh 连板子 就会出现问题
正常来讲 这两种方式不都应该是一样的吗

11111.jpg (27.7 KB, 下载次数: 45)

11111.jpg

作者: 18063363651    时间: 2022-10-26 10:19
799959745 发表于 2022-10-25 11:00
可以通过以下方式验证是否解码和编码正常
测试系统buildroot,v1.0.2a 版本。测试文件分辨率1280x720。视 ...

测试视频能否提供一下
作者: 799959745    时间: 2022-10-26 11:51
18063363651 发表于 2022-10-26 10:19
测试视频能否提供一下

链接: https://pan.baidu.com/s/1XzCErm4lfaja5qHKvFEVTA 提取码: acow
作者: 18063363651    时间: 2022-10-26 17:23
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 出错了

1231.jpg (129.14 KB, 下载次数: 63)

1231.jpg

作者: 799959745    时间: 2022-10-27 11:15
18063363651 发表于 2022-10-26 17:23
gst-launch-1.0 filesrc location=/home/firefly/xiaochou_30s.mp4 ! qtdemux ! h264parse ! mppvideodec ...

buildroot系统测试的。ubuntu下的filesink管道有问题。
作者: 板蓝根    时间: 2022-11-2 15:42
以下几点需要注意的:
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 测试


作者: 18063363651    时间: 2022-11-9 19:03
板蓝根 发表于 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 直接软解还要慢




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1