一种用于转码的ffmpeg工作流管理器

pytranscoder-ffmpeg的Python项目详细描述


pytranscoder

新!阅读文档

用于批处理、并发或群集转码的ffmpeg的python包装器

这个脚本旨在帮助编码大量视频的人自动转码。 它不仅仅是一个包装器-它是一个工作流和作业管理器。

有两种模式:本地群集。本地模式是最常见的用法,用于在安装该脚本的同一台计算机上运行该脚本。群集模式将pytranscoder转换为远程编码管理器。在此模式下,它委派和管理在多个主机上运行的编码作业。这需要更高级的配置,并在cluster.md中单独记录。

本文档的其余部分重点介绍如何在本地模式下使用pytranscoder。

功能:

  • 顺序或并发转码。
  • 并发模式允许您最大限度地利用 支持NVIDIA CUDA的显卡或Intel加速视频(QSV)
  • 保留所有流,但允许按音频和字幕语言进行筛选。
  • 可配置转码配置文件
  • 自动将视频文件与转码配置文件匹配的可配置规则和条件
  • 从文件列表(队列)或命令行上的所有文件进行代码转换
  • 群集模式允许使用其他计算机有关详细信息,请参阅cluster.md。
  • 即时压缩监控,如果没有按预期压缩,可选择提前终止作业。
  • 可选择通过API触发丛库更新
  • 处理Sonar下载事件并将文件路径记录到默认队列,以便以后进行批处理

要求
  • Linux或MacOS,Windows 10。对于windows,建议使用wsl(ubuntu)。
  • 最新的ffmpeg(3.4.3-2或更高版本,更低版本可能仍然有效)
  • 带最新NVIDIA CUDA驱动程序的NVIDIA图形卡(可选的
  • 启用了qsv的Intel CPU(可选
  • python 3(3.6或更高版本)
  • PythonPlexAPI包(可选)。使用pip3 install--user plexapi安装

支持

请暂时通过github主页记录问题。

视频教程:第1部分-Linux设置第2部分-用法

安装

有几种可能的安装python应用程序的方法-其中一种应该适合您。

Linux 造成这种混乱的原因是,并非所有的发行版或操作系统都默认安装pip3。无论哪种方式,pytranscoder都可以在pypirepo中使用。

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 

Windows(wsl-ubuntu) Windows Subsystem for Linux是最好的选择,但如果没有PIP3,则需要先执行两个维护步骤:

sudo apt update
sudo apt upgrade
sudo install python3-pip

# now we can install
pip3 install --user pytranscoder-ffmpeg

此时,您可以选择安装ffmpeg for windowsffmpeg.exe或作为ubuntu包安装在bash中。两者都可以工作,但有一些注意事项,或者您可以同时安装两者而不必担心。

  • ffmpeg.exe可以在windows命令shell或bash中运行,但在配置pytranscoder路径时需要特别注意。
  • ffmpeg apt包只能从bash运行,但它是更自然的linux路径映射。

安装后,您将在$home/.local/shared/doc/pytranscoder中找到此文档和其他文档(在Linux/MacOS上) 在$home/appdata/python/pythonversion/shared/doc/pytranscoder**中(在Windows上)。也可以使用在线

升级

无论上面的安装方法对您如何,只需使用--upgrade选项进行更新,即: pip3安装--升级pytranscoder ffmpeg

操作-配置文件和规则 < Buff行情>

配置文件是一组命名的ffmpeg命令行选项,用于编码特定的方式。你可以 定义您在transcode.yml中经常使用的所有组合,以便以后选择。 至少需要一个配置文件定义。

< Buff行情>

规则是预定义谓词的yaml语法,允许在源媒体详细信息上进行简单匹配。 并与特定的配置文件相关。例如,如果转码720p与1080p不同,并且仍然不同 比4k还多的是,你可以设置规则,将这3种分辨率与特定的转码配置文件相匹配。 简单-让脚本完成选择正确的ffmpeg选项的工作。

但你不需要使用规则。您可以在命令行中指定每个 使用-p选项运行。或者可以定义1个作为默认值的规则(参见示例)。这取决于你。但是,使用规则是自动化繁琐的手动工作流程的一个好方法。

在更改或添加配置文件和规则时,可以先运行--dry run模式来测试它们, 它将向您展示真实运行时所发生的一切。

配置

提供了一个示例transcode.yml配置文件,或者您可以在这里下载它。这可以定制所有你喜欢的,但是 一定要保留yaml格式。使用-y选项在命令行中指定此文件 或者将其作为复制到主目录。transcode.yml(默认值)

文件中有3个部分:

配置-全局配置信息

示例

config:default_queue_file:'/path/to/default/list/of/files/if/none/given'ffmpeg:'/usr/bin/ffmpeg'# path to ffmpeg for this configssh:'/usr/bin/ssh'# used only in cluster modequeues:qsv:1# sequential encodescuda:2# maximum of 2 encodes at a timeplex_server:192.168.2.61:32400# optional, use 'address:port'colorize:yes
<表><广告>设置 目的 < /广告><正文>默认队列文件队列文件只是列出要编码的所有媒体的文本文件。它不是必需的,但在自动化工作流时非常有用。您始终可以在命令行上指示队列文件。这只是设置默认值(如果有的话)。ffmpeg此主机上ffmpeg的完整路径 SSH 此主机上ssh的完整路径排队如果使用并发,请在此处定义队列。队列名称是您想要的。每个名称指定最大并发编码作业数。如果未定义,则使用默认的顺序队列。Plex_服务器可选,如果希望在媒体编码后通知plex服务器。使用地址:端口格式。着色可选,默认为"否"。如果"是",终端输出将添加一些颜色

配置文件-转码配置文件(ffmpeg选项)

配置文件用于为ffmpeg提供各种编码选项。需要一个配置文件定义,但大多数情况下 您将为不同的编码方案定义倍数。配置文件的名称可以在命令行中提供 为您的需要选择一个合适的。或者,您也可以定义规则(见下文)以自动将媒体与配置文件匹配,从而减少手动编码工作流程。

示例:

profiles:# some common, reusable settings to keep things tidycommon:output_options:-"-crf20"-"-c:acopy"-"-c:scopy"-"-fmatroska"extension:'.mkv'threshold:20threshold_check:60## Sample Intel QSV transcode setup (note to customize -hwaccel_device param for your environment)#hevc_qsv:include:commoninput_options:-hwaccel vaapi -hwaccel_device /dev/dri/renderD129 -hwaccel_output_format vaapioutput_options:# in addition to those included from 'common'-"-vfscale_vaapi=format=p010"-"-c:vhevc_vaapi"## Sample nVidia transcode setup#hevc_cuda:# profile nameinclude:commoninput_options:|# ffmpeg input options-hwaccel cuvid        # REQUIRED for CUDA-c:v h264_cuvid       # hardware decoding toooutput_options:# in addition to included from 'common'-"-c:vhevc_nvenc"# REQUIRED for CUDA-"-profile:vmain"-"-presetmedium"queue:cuda# manage this encode in the 'cuda' queue defined globally# optionally you can filter out audio/subtitle tracks you don't needaudio:exclude_languages:-"chi"-"spa"-"fre"-"ger"default_language:engsubtitle:exclude_languages:-"chi"-"spa"-"fre"-"por"-"ger"-"jpn"default_language:engx264:# profile nameinclude:commoninput_options:output_options:-"-c:vx264"h264_cuda_anime:include:commoninput_options:output_options:-"-c:vh264_nvenc"-"-tuneanimation"
<表><广告>设置 目的 < /广告><正文>输入选项与输入相关的ffmpeg选项(请参阅ffmpeg文档)输出选项与输出相关的ffmpeg选项(请参阅ffmpeg文档)分机用于编码文件的文件扩展名排队可选。将此配置文件的编码分配给特定队列(在config部分中定义)阈值可选。如果该数字代表编码媒体的最小压缩节省百分比。如果不满足此阈值,则会丢弃转码文件,源文件保持原样,源作业标记为已完成。如果某个文件压缩得不多,而您希望保留原始文件,则此功能非常有用。阈值检查可选。如果这是开始检查是否满足阈值所做的百分比。默认值为100%(介质完成时)。使用此选项可以提前进行阈值检查,以在不产生预期压缩(阈值)的情况下停止长时间运行的转码。包括可选。包括一个或多个以前定义的配置文件中的选项。(请参见"包括"部分)。音频音频曲目处理选项。包括排除语言的列表以自动删除曲目。如果要删除的任何曲目是默认的,则将基于默认语言设置新的默认值副标题请参见上面的"音频"。< Buff行情>

CPU注意:从H264在Intel i5/i7 6th+Gen芯片上转码时,ffmpeg将使用检测到的扩展来基本上为您执行硬件解码。因此,如果您配置了硬件编码,您将看到低CPU使用率。在AMD上没有芯片帮助解码。所以即使是硬件编码,解码过程也会使你的CPU负荷下降。要解决此问题,只需启用硬件解码作为输入选项

规则-简单配置文件匹配规则

将视频文件与相应配置文件匹配的简单表达式。它们是自上而下评估的,所以 确保您的默认值是最后一个。你不需要使用规则系统。你也可以 在命令行上显式地指定所需的配置文件名,或者只使用一个默认规则。 但是如果你对某些媒体进行不同的编码,那么使用规则系统会让它变得更容易一些 根据媒体属性使用各种选项。不需要特定的标准-使用那些 适用于您的规则。

规则评估如下:对于每个输入媒体文件,比较每个规则条件。规则的所有条件都必须匹配 以便选择给定的配置文件。如果其中任何一个失败,评估将继续到下一个 规则。如果没有匹配项,则选择默认规则。

样品:

'forcontentIconsidertoobig':# comment and unique identifier for this ruleprofile:hevc_hd_25fps# profile to use if the criterial below matchcriteria:runtime:'<180'# less than 3 hours longfilesize_mb:'>5000'# ..and media file larger than 5 gigabytesfps:'>25'# ..and framerate > 25'alreadybestcodec':profile:'SKIP'# special keyword SKIP, means anything that matches this rule won't get transcodedcriteria:'vcodec':'hevc'# if media video is encoded with hevc already'skipfilesthatarenotappropriateforhevc':profile:'SKIP'criteria:filesize_mb:'<600'# video file is less than 600mbruntime:'<40'# ..and total runtime < 40 minutes'animetoh264usingtuning':profile:h264_cuda_animecriteria:filesize_mb:'>2500'# larger than 2.5gvcodec:'!hevc'# not encoded with hevc path:'/media/anime/.*'# in a anime folder (regex)'half-hourvideos':profile:'x264'# use profile called "x264"criteria:filesize_mb:'>500'# 400mb file size or greaterruntime:'<31'# 30 minutes or less runtimevcodec:'!hevc'# NOT hevc encoded video'smallenoughalready':# skip if <2.5g size, between 720p and 1080p, and between 30 and 64 minutes long.profile:SKIP# transcoding these will probably cause a noticeable quality loss so skip.criteria:filesize_mb:'<2500'# less than 2.5 gigabytesres_height:'720-1081'# 1080p, allowing for random oddball resolutions still in the HD rangeruntime:'35-65'# between 35 and 65 minutes long'default':# this will be the DEFAULT (no criteria implies a match)profile:hevc_hd_preserved# use profile named "hevc_hd_preserved"
<表><广告>设置 目的 < /广告><正文>剖面图要选择此规则条件是否匹配的已定义配置文件名(从上面)。如果配置文件名为"跳过",则匹配的媒体将不会被转码运行时媒体的总运行时间(分钟)。由ffmpeg决定。也可以使用<;或>;或范围源代码大小媒体文件的大小(兆字节)。可选使用<;或>;或范围 FPS每秒帧数。由ffmpeg决定。也可以使用<;或>;或范围vcodec源媒体上使用的视频编解码器。由ffmpeg决定。可以使用!指示条件(负匹配)res_高度视频垂直分辨率。由ffmpeg决定。也可以使用<;或>;或范围res_宽度视频水平分辨率。由ffmpeg决定。也可以使用<;或>;或范围

例如,如果视频长度小于180分钟,并且文件 大小大于5 GB,每秒帧数大于25,然后使用HEVC_HD_25fps配置文件进行编码。

对于允许使用运算符的设置,请将运算符放在第一个(<;或>;)后,再加上数字。为了t允许一定范围的软管 在上下范围之间提供一个连字符(-)。条件中不允许有空格。

声纳感知

您可以从sonar自定义脚本连接调用pytranscoder来处理下载和升级的记录。 到您的队列文件。从sonar传递的文件名将附加到默认的队列文件(请参阅上面的全局配置)。 此时不转码媒体,只录制以供将来处理。你只需要用声纳呼叫pytranscoder 要进行配置-pytranscoder将检测到它是从sonar调用的,并相应地执行操作。不需要参数。

工艺流程

脚本处理媒体的高级步骤。

  • 确定要转换代码的输入文件列表
    • 如果给定了配置文件(-p),请将其设置为初始默认值
    • 如果给定了列表文件,请从该文件中读取媒体文件列表。
    • 如果在命令行中提供了媒体文件,请将它们添加到列表中,同时观察任何-p配置文件覆盖。
  • 检查并发值并分配其他线程(如果适用)。
    • 如果同时运行,将禁用ffmpeg的交互式转码统计信息和屏幕日志记录。
  • 如果在干运行模式下运行:
    • 对于每个媒体文件,打印"假设"转码详细信息
    • 退出脚本执行
  • 对每个媒体文件执行转码:
    • 如果文件没有给定的配置文件分配,请使用规则系统查找匹配项。如果不匹配,请跳过
    • 文件转码完成后:
      • 如果所选配置文件具有阈值,请比较原始文件大小和转码文件大小。
        • 如果达到阈值:
          • 如果未指定-k,请删除原始文件并替换为新转码的.tmp文件。
          • 如果给定了-k,请保留原始版本,并保留转码的.tmp版本以供检查。
        • 如果未达到阈值,请通知用户并删除.tmp文件,使原始文件保持原样。
      • 如果未指定-k,请删除原始文件并替换为新转码的.tmp文件。
      • 如果使用了列表文件(队列),则已完成的媒体文件将从该列表中删除。
  • 退出脚本执行

无并发运行

如果不能同时进行代码转换,或者只是不想进行代码转换,则仍然可以从该脚本中获取值。 只需避免定义任何队列,或使用值1定义它们(请参阅全局配置部分)。

并发性注释

这里的并发意味着利用硬件支持同时运行多个编码作业。 正常情况下,一次编码运行将几乎耗尽一个CPU,直到它完成。但是有了硬件辅助编码 很少使用cpu,大部分工作都被转移到硬件上。这允许CPU处理 多个文件,仍有处理能力,可用于常规系统活动。

transcode.yml的global profile部分定义队列。使用您喜欢的任何名称,并为该队列提供最大数量的并发作业。使用1表示同步或更高的值来运行倍数(但不超过您的硬件所能支持的范围-使用trial and error来计算,但使用2表示一个很好的数字)。

您可以选择为每个配置文件指定一个特定队列。如果未定义,则使用默认队列,该队列是连续的。队列分配允许对并发转码作业进行更精细的管理。如果您只计划按顺序转码,则不需要排队。

< Buff行情>

如果您希望最大限度地使用机器,请考虑以下情况:

您有一台第8代Intel i5 6核机器,带有NVIDIA显卡,可以处理两个并发编码。您定义了两个队列:

queues:one:1two:2
< Buff行情>

您有两个配置文件:"qsv"(配置为使用英特尔qsv)和"cuda"(配置为红色代表英伟达)。将"qsv"配置文件与queueone关联,将"cuda"与queuetwo关联。你开始的工作是这样的:

pytranscoder -p qsv /media/tv/new/*.mp4 -p cuda /media/movies/new/*.mp4
< Buff行情>

本例将运行3个并发作业-1个在使用qsv的cpu上运行,2个在nvidia卡上运行! 这就是多队列配置的使用方法。但我希望你有好的系统风扇。

您还必须为代码转换配置文件提供适当的选项以使用支持的硬件,否则您将 完全阻塞您的系统(请参阅transcode.yml"hevc"和"qsv"示例)。如果你用配置文件转码 硬件支持的设置,或者规则匹配器选择没有硬件支持的配置文件,该文件将 使用CPU时间转码。因此,当使用规则进行并发硬件转码时,最好将所有规则映射到只有硬件支持的配置文件。

您始终可以从命令行强制非并发的基于CPU的转码,选择仅顺序(-s)并绕过配置文件规则。

测试设置

在提交配置更改之前,您应该始终执行试运行测试。这会告诉你 如何处理你的媒体,但实际上不会做任何工作或改变任何事情。它会帮你的 确保您定义的规则与预期匹配,并且主机可以通过ssh连接。

    pytranscoder --dry-run /volume1/media/any_video_file

运行

请注意,如果使用列表文件(队列)作为输入,则当进程完成时,该文件将只包含 无法编码的视频文件,或者如果处理了所有文件,则会将其删除。所以如果你需要 此文件先复制。

默认行为是在编码后删除原始视频文件并将其替换为新版本。 如果要保留源请确保使用-k参数。工作文件将放在 作为源的文件夹,在编码时具有相同的名称和.tmp扩展名。

<表><广告>选项 目的 < /广告><正文>--从文件<;文件>;从<;文件>;加载要处理的文件列表 -p<;配置文件>;指定要使用的<;配置文件>;。可在命令行上多次使用,并适用于所有后续文件(请参见示例)-是<;配置>;指定非默认的transcode.yml文件。 -S 强制顺序模式(并发队列没有并发事件) > k保留原始媒体文件,将编码的.tmp文件保留在同一文件夹中。--干运行显示在没有实际工作的情况下将发生的事情 -V详细输出。显示更多处理详细信息,对调试有用-C<;名称>;群集模式。有关详细信息,请参见cluster.md
示例:

要获取帮助和版本号:

   pytranscoder -h

要使用特定配置文件转码2个文件:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
0

使用规则系统自动转码文件,但保留原始文件:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
1

要使用不同的配置文件转码2个文件:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
2

若要自动转码特定队列文件中的所有内容,请默认使用与配置文件匹配的规则:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
3

要在不进行转码的情况下进行测试运行,请查看将匹配的配置文件和ffmpeg命令行:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
4

要使用特定的transcode.yml文件并使用规则自动转码:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
5

要对队列文件中的所有内容进行代码转换,请对所有内容使用强制配置文件:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
6

展示灵活性的复杂示例。使用自定义配置文件test.yml,保留原始媒体,转码 /media1中使用规则的所有mp4文件,使用hevc\u cuda配置文件转换/media2中的所有文件,以及 使用qsv配置文件转码listoffiles.txt中列出的所有文件:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
7

如果配置为并发,但希望自动转码AB仅按顺序取消文件的锁定:

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
8

要在群集模式下运行(请参阅群集文档):

pip3 install --user pytranscoder-ffmpeg
# or...
python3 -m pip install --user pytranscoder-ffmpeg 
9

使用includes

此功能需要对yaml格式有更深入的了解。实际上,您可以定义一个部分概要文件或一个完整概要文件,然后将其"包含"到另一个概要文件中。这有助于重新使用定义和更简单的配置文件。

sudo apt update
sudo apt upgrade
sudo install python3-pip

# now we can install
pip3 install --user pytranscoder-ffmpeg
0

上述示例相当于:

sudo apt update
sudo apt upgrade
sudo install python3-pip

# now we can install
pip3 install --user pytranscoder-ffmpeg
1

优点是,现在我们有了一个基本(父)配置文件,可以将其包含到许多其他配置文件中,以避免重复的配置文件定义。而且,如果我们决定更改基本阈值,例如,我们只需要在基本阈值(父阈值)中更改它。

注意,配置文件"hq"和"hevc_cuda"组合在一起,阈值被重写为18。 让我们将第一个(基本)配置文件引用为父配置文件,将第二个配置文件引用为子配置文件。因此子配置文件可以包含一个或多个父配置文件。保留子项中的所有值。但是,如果输入或输出选项是列表而不是字符串,则父值和子值将合并。 下面是稍微重新格式化的相同示例:

sudo apt update
sudo apt upgrade
sudo install python3-pip

# now we can install
pip3 install --user pytranscoder-ffmpeg
2

这将产生一个坏的侧面。现在我需要提到yaml的一个特性,它只在include示例列表中使用。yaml格式的数据可能非常复杂,但是pytranscoder的需求非常有限和简单。但是为了支持replacemerge模式中的include特性,我需要另一种方式来表示输入和输出选项。 注意merge和replace示例的不同之处在于merge使用连字符和单独的行作为输出选项部分。在"替换"中,所有选项都在一行上。前者是一个"参数列表"的表达式。后者只是一个"参数字符串",当父项和子项都有输入选项或输出选项(列表)时,这两个选项将组合在一起。如果其中一个不是列表(只是一个字符串),则子版本将获胜,父版本将被忽略。 有了这些新信息,我们现在可以看到为什么replace示例会生成一个错误的配置文件。它将如下所示:

sudo apt update
sudo apt upgrade
sudo install python3-pip

# now we can install
pip3 install --user pytranscoder-ffmpeg
3

由于output_options是一个简单的字符串,而不是列表,pytranscoder不知道如何合并它们,所以它不会尝试。孩子的价值观总是赢的。因此,此配置文件将产生不希望的结果,因为父选项未合并。将两者转换回列表,它将再次工作。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么我不能从ObjectInputStream读取ArrayList?   linux如何设置java时区?   java是一种拥有系统的方法。出来在循环中打印不同的内容?   scala Apache Spark:在Java中有效地使用mapPartitions   java Maven对com的依赖性。白天利用率   java将多个数据映射到单个id的表的正式名称是什么?   java如何在Android应用程序中隐藏FulterWave API键   SeleniumWebDriverJava:如何使用行号和列号单击表中的特定单元格   java Springbatch将数据从写入程序或处理器传递到RestConroller   java在Android TextView中一次换行两行,并带有跨距   java如何使这个rxjava zip并行运行?   JAVAutil。登录中。记录器不尊重java。util。登录中。数量   java无法将参数发布到服务器   java Eclipse:在自定义透视图/视图的状态行上显示作业进度   java在调用findAll()时,找到了多个具有给定标识符的行,但如果我使用findById()遍历所有条目,则可以工作;   Java中的正则表达式问题   Java中的实例变量   java如何在安卓中逐字搜索   java如何计算百分比