为了账号安全,请及时绑定邮箱和手机立即绑定

将yuv420p原始数据转换为opencv图像

将yuv420p原始数据转换为opencv图像

HUWWW 2023-12-12 20:32:50
我有来自 rtmp 服务器的原始数据,像素格式为 yuv420p我使用管道来读取数据。但我不知道如何将原始数据解码为图像。command = ['ffmpeg']command.extend(["-loglevel", "fatal", "-i", 'rtmp://localhost/live/stream', "-f", "flv", "-pix_fmt" , 'yuv420p', '-vcodec', 'h264', "-"])self.process = subprocess.Popen(command, stderr=subprocess.PIPE ,stdout = subprocess.PIPE)self.output = self.process.stdoutself.fs = width*height*3 // 2while True:    data = self.output.read(self.fs)我尝试像这样解码,在此处输入链接描述但结果是在此处输入图像描述谁能帮我解决这个问题吗?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

我不是这方面的专家ffmpeg,所以我会听从任何更了解的人的意见,如果证明不正确,我会删除我的答案。


据我所知,您有一个想要摄取到 OpenCV 中的 RTMP 流。OpenCV 使用具有 BGR 排序的 Numpy 数组来存储图像 - 显然还有视频帧,这些图像只是一个接一个的大量图像。因此,我建议您要求ffmpeg将 Flash 视频流转换为 OpenCV 想要的格式:


ffmpeg <RTMP INPUT STUFF> -pix_fmt bgr24 -f rawvideo -

然后更改它,因为它现在是 BGR888:


self.fs = width * height * 3

由于我没有可用的 RTMP 源,因此我生成了如下测试流:


# Generate raw video stream to read into OpenCV    

ffmpeg -f lavfi -i testsrc=duration=10:size=640x480:rate=30 -pixel_format rgb24 -f rawvideo -

然后我将其通过管道传输到 Python 中:


ffmpeg -f lavfi -i testsrc=duration=10:size=640x480:rate=30 -pixel_format rgb24 -f rawvideo - | ./PlayRawVideo

Python 程序PlayRawVideo如下所示:


#!/usr/bin/env python3


import numpy as np

import cv2

import sys


# Set width and height

w, h = 640, 480


while True:

    data = sys.stdin.buffer.read(w * h *3)

    if len(data) == 0:

        break

    frame = np.frombuffer(data, dtype=np.uint8).reshape((h, w, 3))

    cv2.imshow("Stream", frame)

    cv2.waitKey(1)

    

请注意,我必须使用它sys.stdin.buffer.read()来获取原始二进制数据。


查看完整回答
反对 回复 2023-12-12
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信