python - 将 yuv420p 原始数据转换为图像 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()
来获取原始二进制数据。
推荐阅读
- javascript - 将对象数组加入新数组对象
- sql - 用于连接 3 个表的 SQL 视图,但有多个列可用于 ON 子句
- arrays - 如何在不使用类的情况下仅从数组中随机选择每种颜色一次
- c# - IApplicaionBuilder 不包含定义 MapSignalR()。app.MapSignalR() 在 ASP.NET CORE 上不起作用
- laravel - foreach 关系数据
- android - 用户进入谷歌地图特定区域时如何调用方法
- git - 当我将项目推送到 Github 时,我有最早提交的文件,为什么?
- python - 为什么我使用多处理和熊猫得到这个 KeyError?
- email - 为什么我的 Outlook 添加随机停止工作?
- mysql - 包含句点和尾随单个数字的 Mysql 布尔全文搜索的开发与生产问题