Firefly开源社区

12
发表新贴
打印 上一主题 下一主题

[技术讨论] gstreamer+mpp 解码问题

30

积分

0

威望

0

贡献

技术小白

积分
30

gstreamer+mpp 解码问题

发表于 2022-10-19 17:19:55      浏览:8182 | 回复:16        打印      只看该作者   [复制链接] 楼主
问题描述及复现步骤:
开发语言: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))




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

1.jpg

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

2.jpg

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

3.jpg

opencv编译log.txt

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

回复

使用道具 举报

1万

积分

7

威望

0

贡献

技术大神

Rank: 8Rank: 8

积分
11377

突出贡献

发表于 2022-10-20 17:09:45        只看该作者  沙发
更新最新固件验证下还有没有这个问题?
回复

使用道具 举报

30

积分

0

威望

0

贡献

技术小白

积分
30
发表于 2022-10-21 11:01:16        只看该作者  板凳
799959745 发表于 2022-10-20 17:09
更新最新固件验证下还有没有这个问题?

使用最新固件 : ROC-RK3588S-PC_Ubuntu20.04-Gnome-r211123_v1.0.2a_221013.img  还是有同样的问题
回复

使用道具 举报

1万

积分

7

威望

0

贡献

技术大神

Rank: 8Rank: 8

积分
11377

突出贡献

发表于 2022-10-21 14:22:25        只看该作者  地板
怎么复现问题?提供下相关程序吧
回复

使用道具 举报

30

积分

0

威望

0

贡献

技术小白

积分
30
发表于 2022-10-21 15:53:37        只看该作者  5#
799959745 发表于 2022-10-21 14:22
怎么复现问题?提供下相关程序吧

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

使用道具 举报

1万

积分

7

威望

0

贡献

技术大神

Rank: 8Rank: 8

积分
11377

突出贡献

发表于 2022-10-24 17:38:36        只看该作者  6#
应该是这一行有问题。这行代码cv2.imwrite("snap/{}.jpg".format(time.time()), frame)使用的是opencv来编码。
但是直接使用gstreamer来解码mp4得到的yuv数据,然后使用ffmpeg是可以通过对应分辨率来播放的。而不需要增加分辨率。
你可以尝试下使用gstreamer来编码试一下结果。而非使用opencv来编码。
回复

使用道具 举报

30

积分

0

威望

0

贡献

技术小白

积分
30
发表于 2022-10-24 18:02:31        只看该作者  7#
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数据
回复

使用道具 举报

30

积分

0

威望

0

贡献

技术小白

积分
30
发表于 2022-10-24 18:18:12        只看该作者  8#
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)
回复

使用道具 举报

1万

积分

7

威望

0

贡献

技术大神

Rank: 8Rank: 8

积分
11377

突出贡献

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

关于这点(使用cv2.imwrite()在pycharm里面ssh连接3588板子运行 是可以保存图像的)是怎么实现的?
使用ssh和直接在板子上面跑的结果应该是一样的。是不是用的PC电脑的OPENCVl来编码了?
回复

使用道具 举报

1万

积分

7

威望

0

贡献

技术大神

Rank: 8Rank: 8

积分
11377

突出贡献

发表于 2022-10-25 11:00:55        只看该作者  10#
可以通过以下方式验证是否解码和编码正常
测试系统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管道来编码。
回复

使用道具 举报

返回列表
12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表