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
现在直接在板子上面运行程序python3test.py 读到的rtsp 图像转numpy 为 0并且图像大小1920* 1084, 高度比实际图像多了4个像素。(720P也是这个问题,无论是rtsp 还是视频文件(mp4))
更新最新固件验证下还有没有这个问题? 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")
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)
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管道来编码。
页:
[1]
2