使用 PyAV 将视频直接读入 Numpy(无迭代)

2023-12-23

是否可以使用 PyAV 将视频直接读入 3D Numpy?目前,我正在循环每一帧:

i = 0
container = av.open('myvideo.avi')
for frame in container.decode(video=0):
    if i == 0: V = np.array(frame.to_ndarray(format='gray'))
    else: V = np.dstack((V, np.array(frame.to_ndarray(format='gray'))))
    i += 1

第一帧定义了一个2D Numpy数组(i=0);每个后续帧 (i>0) 都使用堆栈到第一个数组上np.dstack。理想情况下,我想一次性将整个视频读入 3D Numpy 灰度帧数组。


我找不到使用 PyAV 的解决方案,并使用ffmpeg python https://github.com/kkroening/ffmpeg-python/blob/master/examples/README.md反而。

ffmpeg python是一个 Pythonic 绑定FFmpeg https://www.ffmpeg.org/ like PyAV.

该代码将整个视频一次性读取到灰度帧的 3D NumPy 数组中。

该解决方案执行以下步骤:

  • 创建输入视频文件(用于测试)。
  • 使用“probe”获取视频文件的分辨率。
  • 将视频流式传输到字节数组中。
  • 将字节数组重塑为n x height x widthNumPy 数组。
  • 显示第一帧(用于测试)。

代码如下(请阅读评论):

import ffmpeg
import numpy as np
from PIL import Image

in_filename = 'in.avi'

"""Build synthetic video, for testing begins:"""
# ffmpeg -y -r 10 -f lavfi -i testsrc=size=160x120:rate=1 -c:v libx264 -t 5 in.mp4
width, height = 160, 120

(
    ffmpeg
    .input('testsrc=size={}x{}:rate=1'.format(width, height), r=10, f='lavfi')
    .output(in_filename, vcodec='libx264', t=5)
    .overwrite_output()
    .run()
)
"""Build synthetic video ends"""

     
# Use FFprobe for getting the resolution of the video frames
p = ffmpeg.probe(in_filename, select_streams='v');
width = p['streams'][0]['width']
height = p['streams'][0]['height']

# https://github.com/kkroening/ffmpeg-python/blob/master/examples/README.md
# Stream the entire video as one large array of bytes
in_bytes, _ = (
    ffmpeg
    .input(in_filename)
    .video # Video only (no audio).
    .output('pipe:', format='rawvideo', pix_fmt='gray')  # Set the output format to raw video in 8 bit grayscale
    .run(capture_stdout=True)
)

n_frames = len(in_bytes) // (height*width)  # Compute the number of frames.
frames = np.frombuffer(in_bytes, np.uint8).reshape(n_frames, height, width) # Reshape buffer to array of n_frames frames (shape of each frame is (height, width)).

im = Image.fromarray(frames[0, :, :])  # Convert first frame to image object
im.show()  # Display the image

Output:
enter image description here


Update:

Using PyAV:

使用 PyAV 时,我们必须逐帧解码视频。

与 ffmpeg-python 相比,使用 PyAV 的主要优点是我们可以在没有 FFmpeg CLI 的情况下使用它(无需ffmpeg.exe在 Windows 中)。

为了将所有视频帧读入一个 NumPy 数组,我们可以使用以下阶段:

  • 解码每一帧并将其转换为 NumPy 数组。
  • 将 NumPy 数组附加到列表中。
  • 迭代所有视频帧后,将列表转换为包含所有帧的 NumPy 数组。

代码示例(使用 OpenCV 显示测试框架):

import av
import numpy as np
import cv2

# Build input file using FFmpeg CLI (for testing):
# ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=1:duration=10 -vcodec libx264 -pix_fmt yuv420p myvideo.avi

container = av.open('myvideo.avi')

frames = []  # List of frames - store video frames after converting to NumPy array.

for frame in container.decode(video=0):
    # Decode video frame, and convert to NumPy array in BGR pixel format (use BGR because it used by OpenCV).
    frame = frame.to_ndarray(format='bgr24')  # For Grayscale video, use: frame = frame.to_ndarray(format='gray')
    frames.append(frame)  # Append the frame to the list of frames.

# Convert the list to NumPy array.
# Shape of each frame is (height, width, 3) [for Grayscale the shape is (height, width)]
# the shape of frames is (n_frames, height, width, 3)  [for Grayscale the shape is (n_frames, height, width)]
frames = np.array(frames)

# Show the frames for testing:
for i in range(len(frames)):
    cv2.imshow('frame', frames[i])
    cv2.waitKey(1000)

cv2.destroyAllWindows()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PyAV 将视频直接读入 Numpy(无迭代) 的相关文章

  • 使用 Flask SQLAlchemy 进行表(模型)继承

    我遵循了这个建议question https stackoverflow com questions 1337095 sqlalchemy inheritance但我仍然收到此错误 sqlalchemy exc NoForeignKeysE
  • 使用 python 通过搜索端点从 Spotify API 获取曲目

    因此 我尝试使用 API 的搜索端点进行搜索 从而从 Spotify API 获取曲目 请参阅文档 https developer spotify com documentation web api reference search sea
  • Keras,如何获取每一层的输出?

    我已经用 CNN 训练了一个二元分类模型 这是我的代码 model Sequential model add Convolution2D nb filters kernel size 0 kernel size 1 border mode
  • 在一张图中同时绘制两个截面强度

    我有一个形状数组 512 512 看起来像 行 x 列 y 密度 z 数组的数量 0 012825 0 020408 0 022976 0 015938 0 02165 0 024357 0 036332 0 031904 0 025462
  • 如何编写高效的配对算法?

    我需要一种算法的帮助 该算法可以有效地将人们分组 并确保以前的配对不会重复 例如 假设我们有 10 位候选人 candidates 0 1 2 3 4 5 6 7 8 9 并假设我们有一个先前匹配的字典 这样每个键值对即candidate
  • Python - 为什么这段代码被视为生成器?

    我有一个名为 mb 的列表 其格式为 Company Name Rep Mth 1 Calls Mth 1 Inv Totals Mth 1 Inv Vol Mth 2 等等 在下面的代码中 我只是添加了一个包含 38 个 0 的新列表 这
  • 使用 Pandas 查找自滚动高点以来的周期数

    我在 Pandas 中使用rolling max函数 http pandas pydata org pandas docs stable computation html moving rolling statistics moments
  • 打印一个 Jupyter 单元中定义的所有变量

    有没有一种更简单的方法来以漂亮的方式显示单个单元格中定义的所有变量的名称和值 我现在做的方式是这样的 但是当有30个或更多变量时我浪费了很多时间 您可以使用whos http ipython readthedocs io en stable
  • Python/Flask:应用程序在关闭后正在运行

    我正在开发一个简单的 Flask Web 应用程序 我使用 Eclipse Pydev 当我开发该应用程序时 由于代码更改 我必须经常重新启动该应用程序 这就是问题所在 当我运行该应用程序时 我可以在本地主机上看到该框架 这很好 但是当我想
  • 如何在Python中获取绝对文件路径

    给定一条路径 例如 mydir myfile txt 如何在Python中找到文件的绝对路径 例如 在 Windows 上 我最终可能会得到 C example cwd mydir myfile txt gt gt gt import os
  • Python将csv数据导出到文件中

    我有以下运行良好的代码 但我无法修剪数据并将其存储在数据文件中 import nltk tweets love this car this view amazing not looking forward the concert def g
  • 指定 Parquet 属性 pyspark

    如何在 PySpark 中指定 Parquet 块大小和页面大小 我到处搜索 但找不到任何有关函数调用或导入库的文档 根据火花用户档案 https mail archives apache org mod mbox spark user 2
  • 将带有两层分隔符的字符串转换为字典 - python

    给定一个字符串 s x t1 ny t2 nz t3 我想转换成字典 sdic x 1 y 2 z 3 我通过这样做让它工作 sdic dict tuple j split t for j in i for i in s split n F
  • if/else 在 while 循环内正确缩进[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我开始学习 Python 编程大约几周了 我遇到了一些麻烦 下面的代码是一个小程序 用于检查列表中是否有偶数 如果找到第一个偶数
  • 在 groupby 聚合函数中传递参数

    我有我引用的数据框df在代码中 我在每组的多个列上应用聚合函数 我还应用了用户定义的 lambda 函数f4 f5 f6 f7 有些功能非常相似 例如f4 f6 and f7其中只有参数值不同 我可以从以下位置传递这些参数吗字典 d 这样我
  • 如何在包更新之间保留数据文件?

    我正在使用data files的论证setuptools setup 将配置文件安装到 etc和用户主目录 但是更新包pip install
  • 从 subprocess.Popen 获取整个输出

    我通过调用 subprocess Popen 得到了一个有点奇怪的结果 我怀疑这与我对 Python 的陌生有很大关系 args cscript USERPROFILE tools jslint js USERPROFILE tools j
  • Pandas - 分割大的Excel文件

    我有一个大约有 500 000 行的 Excel 文件 我想将其拆分为多个 Excel 文件 每个文件有 50 000 行 我想用熊猫来做 这样它会是最快和最简单的 有什么想法如何制作吗 感谢您的帮助 假设您的 Excel 文件只有一个 第
  • 在 pyhf 中针对小信号模型拟合收敛失败

    这是我们 pyhf 开发团队 最近提出的一个问题 认为很好并且值得分享 因此我们在这里发布了它的修改版本 我正在尝试做一个简单的假设检验pyhf v0 4 0 https pypi org project pyhf 0 4 0 我使用的模型
  • 如何指定一个变量作为类或类实例的成员变量?

    在最新的 Python 2 7 x 中 给定类定义内的任何成员变量 该成员变量是否始终处于类级别 因为它是由该类的所有实例共享的单个变量 在类的定义中 如何指定 类定义中的哪些成员变量属于该类 因此由该类的所有实例共享 以及 哪些属于该类的

随机推荐

  • 有没有办法检测 NaN 和 -NaN?

    我想将 lua 数字保存到字符串和句柄中NaN大小写正确 检测任何 NaN 都很容易 x x 然而 我发现只有一种检测方法是NaN or NaN是使用tostring x nan 有更好的方法吗 代替tostring x nan 不方便携带
  • Swift Calendar.当前内存泄漏?

    我在应用程序中遇到了内存问题 我已经能够将其分解为 NSCalendar 一个简单的视图控制器如下所示 class ViewController UIViewController override func viewDidLoad supe
  • 使用输入元素上的修饰键触发单击事件

    我正在为某些功能编写测试 其中涉及用户按住 Shift 键并单击复选框 我在用着 input trigger Event click shiftKey true 来模拟那个 但是当事件监听器被调用时 event shiftKey财产总是被报
  • 如何使用 javascript (jquery) 将整数值添加到返回字符串的值?

    我有一个简单的 html 块 例如 span 8 span 我尝试使用 jquery 将 1 添加到值 8 var currentValue replies text var newValue currentValue 1 replies
  • Win32 命名管道和消息大小限制 - 旧的 64K 限制是否仍然适用?

    Win32 过去对消息模式管道的消息大小限制为 64K 正如 KB 文章的残余所证明的那样Q119218 PRB 命名管道 Write 限制为 64K https support microsoft com en us kb 119218
  • BeautifulSoup:如何显示不显示的div的内部?

    我是 BeautifulSoup 的新手 我有一些我不明白的问题 我认为这个问题可能已经得到解答 但我找到的答案在这种情况下都没有帮助我 我需要访问 div 的内部来检索网站的词汇表条目 但是该 div 的内部似乎根本 不显示 在 Beau
  • 如何在Powershell中比较关联数组?

    我有两个关联数组 a k1 v1 k2 k21 v21 b k1 v1 k2 k21 v21 我想知道有没有什么好的方法可以在不编写自己的函数的情况下进行比较 除了编写一个函数来比较每个键的值之外 我不知道有什么方法 如果该值不是原始对象
  • Scrapy XPath 页面上的所有链接

    我正在尝试使用 Scrapy 收集某个域下的所有 URL 我试图使用 CrawlSpider 从主页开始抓取他们的网络 对于每个页面 我想使用 Xpath 提取所有的 href 并以键值对等格式存储数据 键 当前Url 值 该页面上的所有链
  • 将 netbean 升级到 JEE 8

    我的问题很简单 如何升级 Netbeans 8 2 以使用 Java EE 8 我已经安装了普通的 NB 8 2 和 glassfish 5 Java 1 8 并尝试使用 java 9 我已经安装了通过NB控制的GF 5服务器 当我创建新的
  • 服务器选择超时错误 Pymongo

    我第一次尝试 pymongo 但不断收到 ServerSelectionTimeoutError 使用 mongo 命令行登录时 我运行命令如下 mongo 3 0 ssl test net 27080 db qa sslAllowInva
  • 有没有办法将进程的标准输出发送到 SLF4J?

    我本质上是在做以下事情 Process process new ProcessBuilder command start InputStream stdout process getInputStream LoggerFactory get
  • 使用 JQL 过滤特定用户在一段时间内更新的问题

    有没有办法使用 JQL 查找特定用户在每天特定时间段更新的所有问题 或者是否有任何插件可以解决这个问题 如果更新意味着状态改变 你可以检查如下内容 status changed by user name and updated gt sta
  • 保存 JSON 数据以供多个 UIView 使用时出现问题 [重复]

    这个问题在这里已经有答案了 我在访问已拉入的 JSON 数据时遇到了一些问题 我正在使用 JSONModel 来获取 JSON 数据 如下所示 在我的左侧 ViewController m 的顶部 interface LeftViewCon
  • 我的滑块无法在自动模式下工作

    我创建了简单的滑块手风琴 这是我的代码 唯一的问题是它适用于自动模式 并且适用 我的代码
  • *ng如果不工作

    我在用角 2 RC 4和 ngIf 在这里不起作用是视图的代码 View div class navbar navbar inverse navbar fixed top div class container div class navb
  • 两个 Azure 移动服务(.NET 后端)共享同一数据库

    我有两个共享同一个 Azure 数据库的 Azure 移动服务 NET 后端 假设服务 X 和 Y 该数据库由服务 X 首次运行时 创建 并创建了模式名称 X 的表 TA 然后我运行服务 Y 它在同一数据库中创建了相同的表 TA 和 TB
  • 如何在 iPhone sdk 中序列化一个简单的对象?

    我有一本对象字典 它们都是应该可序列化的 POCO 对象 我应该采用什么技术将它们写入磁盘 我正在寻找最简单的选项来编写一些列表来保存状态 我想我有3个选择 plist 文件 然而 这似乎仅限于仅存储预定义的对象 字符串 数字等 而不是对象
  • 在 Eclipse 中哪里可以看到项目的构建进度?

    Question 我正在使用 Eclipse for Java EE Mars 2 当我构建项目时 我在Console window 在哪里可以看到项目构建进度和错误 Window gt Show View gt Progress 为了进步
  • 通过 AJAX 请求执行操作 DNN MVC

    我的DNN MVC开发历程中还出现了另一个问题 我想知道这是否是我犯了一个错误的错误 缺失功能 下面我将尝试解释这个问题 我想要实现什么 我想通过调用 AJAX post 在控制器中执行操作 到目前为止它有效 但是 当我尝试将一些变量返回到
  • 使用 PyAV 将视频直接读入 Numpy(无迭代)

    是否可以使用 PyAV 将视频直接读入 3D Numpy 目前 我正在循环每一帧 i 0 container av open myvideo avi for frame in container decode video 0 if i 0