繁体   English   中英

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

[英]convert yuv420p raw data to image opencv

我有来自像素格式 yuv420p 的 rtmp 服务器的原始数据

我使用管道读取数据。 但我不知道如何将原始数据解码为图像。

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.stdout
self.fs = width*height*3 // 2
while True:
    data = self.output.read(self.fs)

我已经尝试像这样解码在这里输入链接描述

但结果是在此处输入图像描述

谁能帮我解决这个问题?

我不是ffmpeg专家,所以我会尊重任何更了解的人,如果证明不正确,我会删除我的答案。

据我所知,您有一个 RTMP 流,您想将其摄取到 OpenCV 中。 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()来获取原始二进制数据。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM