热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ffmpegpython库的使用翻译(一)

原文地址:https:github.comkkroeningffmpeg-python,本文为google翻译部分人工翻译,希望能对大家有用。ffmp

原文地址:https://github.com/kkroening/ffmpeg-python,本文为google翻译+部分人工翻译,希望能对大家有用。

ffmpeg-python:FFmpeg的Python绑定

总览

已经有大量的Python FFmpeg包装器,但是它们似乎缺乏复杂的过滤器支持。 ffmpeg-python适用于简单和复杂的信号图。

快速开始

水平翻转视频:

import ffmpeg
stream = ffmpeg.inputinput('input.mp4')
stream = ffmpeg.hflip(stream)
stream = ffmpeg.output(stream, 'output.mp4')
ffmpeg.run(stream)

或者,如果您更喜欢流畅的代码:

import ffmpeg
(ffmpeg.input('input.mp4').hflip().output('output.mp4').run()
)

API参考




复杂的过滤器图

FFmpeg非常强大,但是它的命令行界面却非常复杂,尤其是在处理信号图并执行琐碎的事情时。

以一个信号图为例:(笔者:以下的例子是将一个图片水平翻转并嵌入到视频里面)

FFmpeg原始的命令行参数非常粗糙:

ffmpeg -i input.mp4 -i overlay.png -filter_complex “ [0] trim = start_frame = 10:end_frame = 20 [v0]; \[0] trim = start_frame = 30:end_frame = 40 [v1]; [v0] [v1] concat = n = 2 [v2]; [1] hflip [v3]; \[v2] [v3] overlay = eof_action = repeat [v4]; [v4] drawbox = 50:50:120:120:red :t = 5 [v5] “ \ -map [v5] output.mp4

也许这对您来说看起来不错,但是如果您不是FFmpeg命令行专家,则可能看起来有些陌生。

如果您像我一样,并且发现Python强大且易读,那么使用ffmpeg-python以下代码会更容易:

import ffmpegin_file = ffmpeg.input('input.mp4')
overlay_file = ffmpeg.input('overlay.png')
(ffmpeg.concat(in_file.trim(start_frame=10, end_frame=20),in_file.trim(start_frame=30, end_frame=40),).overlay(overlay_file.hflip()).drawbox(50, 50, 120, 120, color='red', thickness=5).output('out.mp4').run()
)

ffmpeg-pythonffmpeg使用熟悉的Python术语,使用与上述过滤器图相对应的命令行参数运行。上面的代码效果如下:

现实世界中的信号图可能要复杂得多,但可以用ffmpeg-python处理任意大的(有向无环)信号图。

安装



ffmpeg-python可以通过pip安装获取最新版本:

pip install ffmpeg-python

也可以从本地克隆并安装源:

git clone git@github.com:kkroening / ffmpeg-python.git
pip install -e ./ffmpeg-python

例子

如有疑问,请查看示例以了解是否有与您尝试做的事情接近的代码。

比如以下这些例子:

  • 将视频转换为numpy数组

  • 生成视频缩略图

  • 通过管道读取原始PCM音频

  • JupyterLab /笔记本流编辑器

  • Tensorflow / DeepDream流

有关其他示例,请参见示例自述文件。

自定义过滤器



没有找到您要的过滤器?虽然ffmpeg-python包括一些最常用的过滤器(例如concat)的简写,但所有过滤器都可以通过.filter运算符来引用:

stream = ffmpeg.input('dummy.mp4')
stream = ffmpeg.filter(stream, 'fps', fps=25, round='up')
stream = ffmpeg.output(stream, 'dummy2.mp4')
ffmpeg.run(stream)

或者这样流利的写代码:(笔者:说实话,我比较喜欢这种写法)

(ffmpeg.input('dummy.mp4').filter('fps', fps=25, round='up').output('dummy2.mp4').run()
)

特殊选项名称:

具有特殊名称的参数-qscale:v(例如(可变比特率),-b:v(恒定比特率)等)可以指定为关键字参数字典,如下所示:

(ffmpeg.input('in.mp4').output('out.mp4', **{'qscale:v': 3}).run()
)

多个输入:(笔者:这种代码非常简洁漂亮)

通过将多个输入流作为数组传递给ffmpeg.filter:,可以使用采用多个输入流的过滤器:

main = ffmpeg.input('main.mp4')
logo = ffmpeg.input('logo.png')
(ffmpeg.filter([main, logo], 'overlay', 10, 10).output('out.mp4').run()
)

多个输出:

产生多个输出的过滤器可以用.filter_multi_output:

split = (ffmpeg.input('in.mp4').filter_multi_output('split') # or `.split()`
)
(ffmpeg.concat(split[0], split[1].reverse()).output('out.mp4').run()
)

(在这种情况下,.split()是等效的代码缩写方式,但一般方法适用于其他多输出滤波器)

字符串表达式:

可以将符合ffmpeg规则的表达式写成字符串参数,并引用任何特殊的ffmpeg变量名称:

(ffmpeg.input('in.mp4').filter('crop', 'in_w-2*10', 'in_h-2*20').input('out.mp4')
)

如有疑问,请参阅现有的过滤器,示例和/或ffmpeg官方文档。

常见问题



为什么会有错误的提示:import/attribute/etc. error from import ffmpeg?

确保您是这样安装库的:pip install ffmpeg-python,而不是pip install ffmpegpip install python-ffmpeg

为什么我的音频流被丢弃了?

一些原始的ffmpeg过滤器会丢弃音频流,因此必须注意将音频保留在最终输出中。.audio.video操作可以被用来引用一数据流的音频/视频部分,使得它们可以被单独地处理,然后在后面的管道重新组合。

这种问题是ffmpeg固有的,而ffmpeg-python试图避开这个障碍,而用户可能会参考ffmpeg官方文档以了解为什么某些过滤器会丢弃音频。

像往常一样,看一下示例(尤其是音频/视频管道)。

如何找出使用的命令行参数?

您可以在stream.run()之前运行stream.get_args(),检索要传递给的命令行参数ffmpeg。您还可以运行stream.compile()ffmpeg程序,并将可执行文件作为第一个参数。

我如何做XYZ?

请阅读本自述文件末尾“其他资源”部分中的每个链接。如果您四处张望,找不到所需的内容,并且有与其他用户相关的问题,则可以提出一个问题,询问其操作方法,同时全面说明要执行的操作做以及到目前为止您尝试过的事情。

ffmpeg-python其他用户没有直接关系的问题或要求他人为您编写代码的问题或如何为您解决与其他用户无关的复杂信号处理问题的问题将得到解决。

也就是说,我们希望继续改进我们的文档,并为使用ffmpeg-python凉爽和令人兴奋的事物的人们提供支持社区。

贡献

 

您可以做的最好的事情之一ffmpeg-python就是在问题跟踪器中回答未解决的问题。回答的问题将被标记并合并到文档,示例和其他学习资源中。

如果您发现在文档或整体开发经验方面可能会更好的事情,请在问题跟踪器中这样说。当然,请随时报告任何错误或提交功能请求。

也欢迎请求请求,但是触摸问题跟踪器中的库或先跳至Matrix聊天频道都不会造成伤害。

修复任何打开的错误或实现所请求的增强功能的人都是英雄,但是更改应包括通过测试。

运行测试

git clone git@github.com:kkroening/ffmpeg-python.git
cd ffmpeg-python
virtualenv venv
. venv/bin/activate # (OS X / Linux)
venv\bin\activate # (Windows)
pip install -e .[dev]
pytest

 

特别感谢


  • Fabrice Bellard
  • The FFmpeg 团队
  • Arne de Laat
  • Davide Depau
  • Dim
  • Noah Stier

其他资源


  • API参考
  • 例子
  • 筛选器
  • FFmpeg主页
  • FFmpeg文档
  • FFmpeg筛选器文档
  • 测试用例
  • 问题追踪器
  • 矩阵聊天:#ffmpeg-python:matrix.org

下篇:ffmpeg-python库的使用翻译(二)



推荐阅读
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
author-avatar
qapo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有