热门标签 | 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库的使用翻译(二)



推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
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社区 版权所有