如何使用 ffmpeg-python 在视频上叠加帧序列?

2024-04-05

我在下面尝试过,但它只显示背景视频。

background_video = ffmpeg.input( "input.mp4")
overlay_video = ffmpeg.input(f'{frames_folder}*.png', pattern_type='glob', framerate=25)
subprocess = ffmpeg.overlay(
                          background_video,
                          overlay_video,
                        ).filter("setsar", sar=1)

我还尝试将帧序列组装成 .webm/.mov 视频,但透明度丢失。视频以黑色为背景。

P.s - 帧大小与背景视频大小相同。所以不需要缩放。

Edit

我尝试了@Rotem的建议

首先尝试使用单个 PNG 图像

overlay_video =  ffmpeg.input('test-frame.png')

它不适用于 OpenCV 生成的帧,但适用于任何其他 png 图像。这很奇怪,当我手动查看这些帧文件夹时,它显示空白图像(链接到我的框架文件夹 https://drive.google.com/drive/folders/1i3Ktoo0C97OPaqnsH2DDoWECfKQJ2z_x?usp=sharing)。 但是,如果我将这些帧转换为视频(见下文),它会正确显示我在每个帧上绘制的内容。

output_options = {
                    'crf': 20,
                    'preset': 'slower',
                    'movflags': 'faststart',
                    'pix_fmt': 'yuv420p'
                }
ffmpeg.input(f'{frames_folder}*.png', pattern_type='glob', framerate=25 , reinit_filter=0).output(
                    'movie.avi',
                    **output_options
                ).global_args('-report').run()

尝试从所有 PNG 图像创建视频而不叠加

它按预期工作,唯一的问题是透明度。有没有办法制作透明背景视频?我尝试了 .webm/.mov/.avi 但没有运气。

添加 .global_args('-report') 并检查日志文件

Report written to "ffmpeg-20221119-110731.log"
Log level: 48
ffmpeg version 5.1 Copyright (c) 2000-2022 the FFmpeg developers
  built with Apple clang version 13.1.6 (clang-1316.0.21.2.5)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
  libavutil      57. 28.100 / 57. 28.100
  libavcodec     59. 37.100 / 59. 37.100
  libavformat    59. 27.100 / 59. 27.100
  libavdevice    59.  7.100 / 59.  7.100
  libavfilter     8. 44.100 /  8. 44.100
  libswscale      6.  7.100 /  6.  7.100
  libswresample   4.  7.100 /  4.  7.100
  libpostproc    56.  6.100 / 56.  6.100
Input #0, image2, from './frames/*.png':
  Duration: 00:00:05.00, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: png, rgba(pc), 1920x1080, 25 fps, 25 tbr, 25 tbn
Codec AVOption crf (Select the quality for constant quality mode) specified for output file #0 (movie.avi) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Codec AVOption preset (Configuration preset) specified for output file #0 (movie.avi) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> mpeg4 (native))
Press [q] to stop, [?] for help
Output #0, avi, to 'movie.avi':
  Metadata:
    ISFT            : Lavf59.27.100
  Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p(tv, progressive), 1920x1080, q=2-31, 200 kb/s, 25 fps, 25 tbn
    Metadata:
      encoder         : Lavc59.37.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame=  125 fps= 85 q=31.0 Lsize=     491kB time=00:00:05.00 bitrate= 804.3kbits/s speed=3.39x    
video:482kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.772174%

我在下面使用了绘制框架。

for i in range(num_frames):
            transparent_img = np.zeros((height, width, 4),  dtype=np.uint8)
            cv2.line(transparent_img, (x1,y1), (x2,y2) ,(255, 255, 255), thickness=1, lineType=cv2.LINE_AA)
            self.frames.append(transparent_img)


## To Save each frame of the video in the given folder
for i, f in enumerate(frames):
    cv2.imwrite("{}/{:0{n}d}.png".format(path_to_frames, i, n=num_digits), f)




以下是您的两个问题的答案:

  • 要在 BGRA 图像上绘制白线,请使用(255, 255, 255, 255)颜色而不是(255, 255, 255).
    最后255应用 alpha(透明度)通道值,并且255使线条完全不透明。

  • 要创建具有透明背景的视频,请尝试:.webm文件类型、用途libvpx-vp9视频编解码器,并使用-pix_fmt yuva420p - the a of yuva应用 alpha(透明度)通道。


这是一个“自包含”代码示例(请阅读注释):

import cv2
import numpy as np
import ffmpeg

# Create synthetic MP4 video file from testing
ffmpeg.input('testsrc=size=192x108:rate=1:duration=10', f='lavfi').output('tmp.mp4').overwrite_output().run()

transparent_img = np.zeros((108, 192, 4), np.uint8)

width, height, fps = 192, 108, 1

def make_sample_image(i):
    p = width//60
    img = np.zeros((height, width, 4), np.uint8)  # Fully transparent
    cv2.putText(img, str(i), (width//2-p*10*len(str(i)), height//2+p*10), cv2.FONT_HERSHEY_DUPLEX, p, (255, 255, 255, 255), p*2)  # White number
    return img

# Create 10 PNG files with transparent background an white number (counter).
for i in range(1, 11):
    transparent_img = make_sample_image(i)
    cv2.imwrite(f'{i:03d}.png', transparent_img)


output_options = {  'vcodec' : 'libvpx-vp9',  # libvpx-vp9 supports transparency.
                    'crf': 20,
                    #'preset': 'slower',  # Not supported by libvpx-vp9
                    #'movflags': 'faststart',  # Not supported by WebM
                    'pix_fmt': 'yuva420p'  # yuva420p includes transparency.
                }

frames_folder = './'

# Create video with transparency:
# reinit_filter=0 is required, only if the PNG images have different characteristics (example: some are RGB and some RGBA).
# Use %03d.png instead of glob pattern, becuase my Windows version of FFmpeg doesn't support glob pattern.
ffmpeg.input(f'{frames_folder}%03d.png', framerate=fps, reinit_filter=0).output(
                    'movie.webm',  # WebM container supports transparency
                    **output_options
                ).global_args('-report').overwrite_output().run()


# Overlay the PNG on top of tmp.mp4
background_video = ffmpeg.input( "tmp.mp4")
overlay_video = ffmpeg.input(f'{frames_folder}%03d.png', framerate=fps)
subprocess = ffmpeg.overlay(
                          background_video,
                          overlay_video,
                        ).filter("setsar", sar=1)

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

如何使用 ffmpeg-python 在视频上叠加帧序列? 的相关文章

  • 如何创建媒体文件的稳定校验和?

    如何仅创建媒体数据的校验和而不包含元数据以获得媒体文件的稳定标识 最好是使用支持多种格式的库的跨平台方法 例如vlc ffmpeg 或 mplayer 媒体文件应该是常见格式的音频和视频 图像也很好 好吧 可能已经晚了 11 年才得到答案
  • 在 python lib 中导入和裁剪 jpeg 的快速方法

    我有一个 python 应用程序 可以导入 200k 图像 裁剪它们 并将裁剪后的图像呈现给 pyzbar 来解释条形码 裁剪很有帮助 因为图像上有多个条形码 并且当给定较小的图像时 pyzbar 可能会更快一些 目前我正在使用 Pillo
  • 使用 MATLAB 进行线路跟踪

    我有一个图像 我想将其转换为逻辑图像 包括线条为黑色 背景为白色 当然 可以使用阈值方法来实现这一点 但我不想使用这种方式来做到这一点 我想通过使用线路跟踪方法或类似的方法来检测它 这是关于视网膜血管检测的 我找到了一个article ht
  • 用PHP+FFMPEG生成随机缩略图

    我正在尝试使用 FFMPEG 和 FFMPEG PHP 扩展从电影中的随机点生成缩略图 我的脚本工作正常 但是需要 20 分钟才能生成 5 10 个缩略图 该脚本通过生成随机数来工作 这些随机数稍后用作帧号 生成的所有数字均在电影帧数之内
  • 如何检查图像的特定像素是否透明?

    有什么方法可以检查 PNG 图像的选定 x y 点是否透明 根据 Jeff 的回答 您的第一步是创建 PNG 的画布表示 下面创建一个与图像宽度和高度相同的离屏画布 并在其上绘制图像 var img document getElementB
  • 需要FTP文件而不存储解释器文件通过Python保存在本地

    我正在尝试做一些图像解释器并尝试将它们直接存储到 FTP 服务器 但我的步骤是从本地文件夹上传图像 然后将其转换为蒙版图像 然后它将获得最终输出 但是在我的蒙版和最终输出场景中 临时图像被保存在本地 这是我不想要的 但如果不将图像存储在本地
  • 如何在鼠标悬停时覆盖 div / box?

    我有一个链接 当用户将鼠标悬停在其上时 它应该在链接下显示一个框 div 盒子应该覆盖其下方的所有内容 我如何使用 css 或 javascript 来做到这一点 您有一个隐藏的绝对定位的 div 和链接的子级 然后 当您将鼠标悬停在链接上
  • 如何确定透视变换后的点在新图像平面中的位置?

    我使用 OpenCV Python Numpy 图像中有三个点 我知道这些点的确切位置 P1 P2 N1 我要将图像转换为另一个视图 例如 我将透视图转换为侧视图 如果这样做 我将无法获得图像平面中这三个点的确切位置 我应该以一种可以获得这
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • jquery覆盖加载栏div

    所以我有一个数据表 并且我正在使用 ajax 获取数据 当检索数据时 表中的数据消失并出现一个小的加载圆圈 我希望数据保留 我知道如何做到这一点 并且加载圆圈出现在表格的中心 不一定是垂直的 至少是水平的 以及稍微透明的背景阻挡稍微超出表格
  • 使用 PIL 用附近的颜色填充空白图像空间(也称为修复)

    我用 PIL 创建一个图像 我需要填充空白区域 显示为黑色 我可以轻松地用静态颜色填充它 但我想做的是用附近的颜色填充像素 例如 边框之后的第一个像素可能是填充像素的高斯模糊 或者可能是中描述的推拉型算法Lumigraph Gortler
  • 使用 ImageMagick 有效地将线扫描图像拼接在一起

    我正在寻找线扫描相机的替代品 用于体育计时 或者更确切地说 用于需要确定位置的部分 我发现普通工业相机可以轻松与商业相机解决方案的速度相匹配 每秒 gt 1000 帧 对于我的需求来说 通常计时的准确性并不重要 重要的是运动员的相对位置 我
  • ffmpeg视频已压缩但无法在浏览器中播放

    我已经集成了ffmpeg4android lib 视频压缩工作正常 但视频无法在除 safari 浏览器之外的浏览器中播放 上传到服务器后 我使用了以下命令 ffmpeg y i
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • MATLAB 中的霍夫变换

    有谁知道如何使用霍夫变换来检测二值图像中最强的线 A zeros 7 7 A 6 10 18 24 36 38 41 1 使用 rho theta 格式 其中 theta 以 45 为步长 从 45 到 90 以及如何在 MATLAB 中显
  • 推荐用于视频编码的最佳质量/性能 H264 编码器?

    我正在寻找一种速度快 需要较少 CPU 功率并生成质量非常好的 mp4 视频的视频编码器 输入视频可以是任何格式并由用户上传 我唯一知道的是 FFMPEG 库 还有其他更好的吗 该程序必须有一个我感兴趣的批处理实用程序 exe 如果您愿意分
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 如何在 FFMPEG 中的多个视频之间创建交叉淡入淡出过渡?

    我目前正在通过 FFMPEG 循环播放带有音频的 MP4 视频 这是代码 del intermediate1 ts del f txt echo file intermediate1 ts gt f txt echo file interm
  • 将 mp3 文件转换为 Amazon Alexa SSML 所需的编解码器版本(MPEG 版本 2)和比特率 (48 kbps) 的正确命令是什么?

    我正在尝试将 mp3 文件转换为 Amazon Alexa SSML 标记语言中音频标签所需的格式 如下所述 https developer amazon com public solutions alexa alexa skills ki
  • 从图像创建视频时,每秒减慢 ffmpeg 的图像速度

    我有一系列演示的屏幕截图 我想将其放入视频中 我正在使用 ffmpeg 为此目的 命令是ffmpeg f image2 i screenshot 5d png vcodec mpeg4 demo avi 不过 视频长度比我想要的要短 而且移

随机推荐

  • 如何在 C# 中使 winforms 进度条垂直移动?

    我正在开发 WinForms Jukebox 我想要一个垂直的进度条来控制音量 有谁知道这是怎么做到的吗 我不知道我会使用进度条control音量 但要display您可以使用用户绘制的控件来调整音量级别 或者您可以仅使用背景颜色调整标签的
  • 如何在 angular2 中访问父组件中的子组件 HTML 元素值?

    我使用下面的代码在父组件的按钮单击期间访问父组件中的子组件 HTML 元素值 子组件 ts Component selector child component template
  • 关于转向多层 Delphi 架构的建议

    我们有一个与 Firebird 紧密相关的相对较大的应用程序 存储过程 视图等 我们现在收到很多支持其他数据库的请求 我们还希望将很多功能从客户端转移到服务器 现在似乎是迁移到 3 4 层架构的好时机 我们已经了解了 DataSnap 20
  • 如何将变量从 Express.js 传递到 Angular11 通用 SSR

    简单的问题 我们如何从expressjs传递到角度通用HTML组件或主应用程序index html变量 比如从expressjs到ejs或pug app get req res gt res render index req messsag
  • Sublime Text 2 突出显示装订线

    默认情况下 当插入符号位于 Sublime Text 2 中的行号 装订线区域时 该行会突出显示 我怎样才能将其关闭 我看到隐藏装订线的选项 但我希望行号可见 谢谢 要关闭行突出显示 请转到preferences gt settings U
  • Phonegap 页面旋转错误,在横向模式下显示为纵向

    我有一个 简单的 网页打包在phonegap 应用程序中 如果我启动应用程序 它会以纵向显示页面 横向页面宽度 所以文本从左下到左上开始 右侧有一个空白 页面应该在此处结束 这是我所看到的 在我的中支持的方向是横向左和右 Info plis
  • 是否可以使用 XSLT 跳过层次结构中的级别?

    层次结构采用 XML 格式 我使用 XSLT 来转换数据 例如 如果层次结构有 4 个级别 并且我想跳过中间的一个级别 例如第 3 级 Level 1 Level 2 Level 3 Skip this level Level 4 Leve
  • 仅使用 CSS 的最大高度和最大宽度

    我的第一篇文章在这里 我使用 div 以相同的比例 180wx170h 裁剪缩略图 在处理肖像和风景图像时 我陷入了困境 如果我使用它 这对于肖像风格的图像来说很好 crop img max height 170px width auto
  • 为 C# 应用程序制作安装程序并将 .NET Framework 安装程序包含到安装程序中

    我已经完成了 C 应用程序 但有一个小问题 当我尝试在另一台 PC 上运行应用程序时 我始终需要安装 NET Framework 4 0 有什么办法可以使其工作而无需从互联网安装框架吗 我之前尝试过创新设置 http www jrsoftw
  • JVM跳转指令的偏移量怎么会是32768呢?

    在写一个回答有关 JVM 字节码偏移量的问题 https stackoverflow com a 30240357 3182664 我注意到 javac 的行为和生成的类文件中有一些我无法解释的内容 当编译这样的类时 class FarJu
  • C++/Fortran 中贝塞尔函数的集成 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在 Fortran 或 和 C 中对包含贝塞尔函数的方程进行从 0 到 无穷大 的数值积分 我在matlab中做了 但对于较大的输入和特
  • 设置 FieldRenderer 的 Item 或 DataSource 属性的好方法是什么?

    场景是我有很多 FieldRenderer 这些应该从不同的地方输出数据 一些来自项目 X 另一些来自项目 Y 并且应该输出项目 Z 的属性 假设我有公共财产ItemX我想从中输出一个属性 以下任何一个都可以 但我没有得到他们中任何一个的输
  • Angular2 路由 - 当路由更改时保持组件的状态[重复]

    这个问题在这里已经有答案了 我有一个应用程序 其视图位于路由后面 我需要能够从路由更改时的位置继续 但返回后 组件处于初始状态 有什么办法可以保持组件的状态吗 update 2 现在已针对新路由器修复了这个问题 Angular 2 3 ht
  • 如何在 MATLAB 中随机排列 3D 矩阵中的列

    我有 3D 矩阵 10000 x 60 x 20 我需要排列第二维和第三维以保持列完整 对于 2D 矩阵 我使用 RANDPERM pidx randperm size A 2 Aperm A pidx 我不能只应用 RANDPERM 两次
  • 如何在表中表示 nil

    假设我想存储一个元素列表 包括一些零值 值的位置很重要 我需要表示列表中给定位置处不存在值 这里有一个问题 a 1 2 3 nil 4 for k v in ipairs a do print k v end print a 4 print
  • html中的方括号是什么意思?

    我现在正在协助一个项目 第一次构建模板 试图解决一些问题 但 html 中令我困惑的一个方面是方括号中的某些内容 我以前从未在 html 中使用过这些 所以我只是想知道它们的用途 当我在浏览器中打开页面时 它们都显示为文本 这是一些代码 d
  • Excel - 多项选择下拉列表 - 不重复选择

    我在 Excel 电子表格上开发了可以使用以下代码在下拉列表中选择多个项目的方法 Private Sub Worksheet Change ByVal Target As Range Dim rngDV As Range Dim oldVa
  • 如何使用 CakePHP APP 类从 URL 加载 XML 文件?

    我正在使用 CakePHP XmlHelper 来解析 XML 文件 例如 App import Xml file my xml file xml parsed xml new XML file 我如何使用它从 URL 加载 XML 文件
  • MySQL 日期比较过滤器

    我有一些运行良好的 SQL 代码 并从我的 Wordpress 数据库返回所需的结果 但是 我根本无法理解如何过滤以下日期之间的日期 2010 12 10 00 00 00 and 2010 12 15 00 00 00 这是我的 SQL
  • 如何使用 ffmpeg-python 在视频上叠加帧序列?

    我在下面尝试过 但它只显示背景视频 background video ffmpeg input input mp4 overlay video ffmpeg input f frames folder png pattern type gl