首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用OpenCV VideoWriter和Python BytesIO在内存中流式播放视频

使用OpenCV VideoWriter和Python BytesIO在内存中流式播放视频
EN

Stack Overflow用户
提问于 2018-06-27 06:40:26
回答 2查看 5.4K关注 0票数 7

我想知道是否有可能在Python语言中使用OpenCV VideoWriter类来“流式”传输数据?

通常,在处理内存中的数据时,我使用BytesIO (或StringIO)。

不过,我尝试使用BytesIO失败了:

代码语言:javascript
复制
import cv2
from io import BytesIO

stream = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc('x264')

data = BytesIO()

# added these to try to make data appear more like a string
data.name = 'stream.{}'.format('av1')
data.__str__ = lambda x: x.name

try:
    video = cv2.VideoWriter(data, fourcc=fourcc, fps=30., frameSize=(640, 480))
    start = data.tell()

        # Check if camera opened successfully
        if (stream.isOpened() == False): 
            print("Unable to read camera feed", file=sys.stderr)
            exit(1)

        # record loop
        while True:
            _, frame = stream.read()
            video.write(frame)
            data.seek(start)
            # do stuff with frame bytes
            # ...

            data.seek(start)

    finally:
        try:
            video.release()
        except:
            pass
finally:
    stream.release()

但是,我没有编写BytesIO对象,而是得到了以下消息:

代码语言:javascript
复制
Traceback (most recent call last):
  File "video_server.py", line 54, in talk_to_client
    video = cv2.VideoWriter(data, fourcc=fourcc, fps=fps, frameSize=(width, height))
TypeError: Required argument 'apiPreference' (pos 2) not found

..。因此,当我将VideoWriter调用修改为cv2.VideoWriter(data, apiPreference=0, fourcc=fourcc, fps=30., frameSize=(640, 480)) (我读到0表示自动,但我也尝试了cv2.CAP_FFMPEG)时,我得到了以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "video_server.py", line 54, in talk_to_client
    video = cv2.VideoWriter(data, apiPreference=0, fourcc=fourcc, fps=fps, frameSize=(width, height))
TypeError: bad argument type for built-in operation

所以我的问题是,可以在内存中使用cv2.VideoWriter类编写编码视频吗?如果可以,是如何实现的?

在这一点上,我没有什么想法,所以任何帮助都将是最受欢迎的:-)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-27 07:23:48

不幸的是,OpenCV不支持对内存进行编码(或解码)。您必须向磁盘写入(或从磁盘读取),VideoWriter (或VideoCapture)才能工作。

票数 3
EN

Stack Overflow用户

发布于 2021-11-01 05:37:29

如果您使用Linux,您可以创建一个ramdisk并对其进行写操作。

代码语言:javascript
复制
mount -t tmpfs -o size=512m tmpfs /mnt/ramdisk
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51052268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档