当似乎没有明显的方法可以自动化执行此操作时,如何获取 Windows 的最新 FFmpeg 二进制档案?

当似乎没有明显的方法可以自动化执行此操作时,如何获取 Windows 的最新 FFmpeg 二进制档案?

这是FFmpeg的官方下载页面:http://ffmpeg.org/download.html

对于 Windows,它链接到:https://ffmpeg.zeranoe.com/builds/

我现在已经仔细研究了这两个页面,并且我找不到任何可以自动执行以下任务的方法:

  1. 确定 FFmepg 的当前稳定版本是什么。
  2. 确定当前稳定版本的 Windows 档案的 URL。

如果我在本地输入:

ffmpeg.exe -version

它输出的是:

ffmpeg version N-94664-g0821bc4eee Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.1.1 (GCC) 20190807

看起来“N-94664-g0821bc4eee”是我当前的版本。咳咳。老实说,我不明白为什么他们不能使用简单的“1.2.3”方案,但我想我会检查一下我当前的版本是否不同的从已确定为最新稳定版本的任何版本,而不是尝试将它们“比较”为整数或合理的版本字符串。

我刚刚在使用 ExifTool 时也遇到了同样的问题,但至少他们有一个简单的 URL 来显示当前最新版本,并且为包含二进制文件的 Windows ZIP 文件提供了可预测的 URL 方案。但 FFmpeg 却不是这样,这对我来说真的很奇怪。

(请不要告诉我使用 Chocolately。)

答案1


请注意,在下面的回答中,我重点关注 Zeranoe 提供的 FFmpeg 版本。截至 2020 年 7 月,此信息为最新信息。如果我遗漏了任何内容或涵盖了您已经知道的内容,请原谅我。=)


总结

Zeranoe 拥有.zip其最新 Git 构建的“最新”构建文件,根据 GPL 3.0 许可(我相信这些文件每隔几天就会更新一次)。如果您对静态链接版本感到满意,可以从以下位置获取它们:

请注意,静态链接构建并不是唯一可用的构建。具体来说,您还可以用shared(对于共享库)或dev(对于开发版本)替换static上述 URL 中的 ,以访问这些 Git 构建。

不幸的是,对于常规的非 Git 发布版本(我假设您指的是“当前稳定版本”),我似乎找不到等效的自动更新文件。因此,您可能只能检查最新版本的 HTML。


概述

我看不出有任何方法可以自动执行以下任务[...]

确定当前稳定版本

假设您不想使用.zip上面详述的“最新” Git 版本文件,基本流程(当前)可能是使用脚本(或脚本)来:

  • 从 Zeranoe 下载给定的 HTML 页面。

  • 仅提取<a>该页面的元素。

  • 使用这些元素中的文本<a>来确定您想要下载的 FFmpeg 的非 Git 发行版本。

  • 将包含该版本信息的脚本确定的 URL 提供给某些下载工具(可能是脚本本身)。

有关第一步的更多详细信息,请参阅页面源选项在本答案末尾的部分。我还在该部分之后提供了一个极小的 PowerShell 示例,这可能有助于文本元素提取。请注意,目前相关 HTML 页面源中的<a>任何元素似乎都不包含完整的下载 URL。<a>

Zeranoe 似乎会自动对常规版本和 Git 版本的发布列表进行排序,因此如果您不想<a>单独分析元素或文件名,您可以通过简单地使用设置位置来确定最新的非 Git 版本来作弊。


也就是说,最新的非 Git FFmpeg 版本/文件名当前包含在<a>页面源中的第一个元素中(对于的渲染版本https://ffmpeg.zeranoe.com/builds/)或页面源中的倒数第二个/倒数第三个<a>元素中(对于服务器生成的目录列表)。


确定 Windows 存档 URL

我不相信有什么好办法自动地确定给定版本的 Windows 存档的 URL。您可能只需要依靠对站点当前构造方式的观察(这意味着您可能需要告诉下载脚本如何构造 URL)。

版本名称

仅就当前而言FFmpeg 由 Zeranoe 构建,从元素文本确定 FFmpeg 的最新版本<a>应该不太难。

  • 对于常规版本,使用简单的“1.2.3”方案(如您所指)。因此,例如版本4.3比版本更新4.2.3

  • 对于最新的 Git 构建(在上述“主要”版本之间发布),当前方案是按其构建日期 ( year/month/day-gitstuff) 进行标记。

假设 Git 构建标记为,则可以删除20200628-4cfcfb3破折号后的部分(例如),只留下这样的结论:此版本的 FFmpeg 构建于 2020 年 6 月 28 日(或者可能是 2020 年 6 月 28 日,取决于您居住的地方)。-4cfcfb320200628

如果我输入ffmpeg.exe -version,它会输出 [...]

Zeranoe 当前版本的 Windows 版 FFmpeg 在其-version横幅中使用与网站上列出的版本名称相同的命名方案:

例如 Zeranoe FFmpeg 横幅

ffmpeg version 4.3 Copyright (c) 2000-2020 ...

ffmpeg version git-2020-06-28-4cfcfb3 Copyright (c) 2000-2020 ...

下载 URL 格式

我刚刚在使用 ExifTool 时也遇到了同样的问题,但至少他们有一个简单的 URL 来显示当前最新版本,并且为包含二进制文件的 Windows ZIP 文件提供了可预测的 URL 方案。但 FFmpeg 却不是这样,这对我来说真的很奇怪。

虽然可能不是立即显而易见的,但 JavaScript 所做的一切https://ffmpeg.zeranoe.com/builds/就是动态地“重建”链接到主要“下载构建”按钮(靠近页面底部)的 URL,并将其链接到不同的静态下载选项。

尝试了几个不同的选项后,最终下载 URL 的构建相当简单:

ex. Zeranoe FFmpeg 下载 URL 构建

url/platform/linking/ffmpeg-version-platform-linking(.zip)(-lgpl.zip)

在哪里:

  • urlhttps://ffmpeg.zeranoe.com/builds/

  • platform是以下三个选项之一:win64win32macos64

  • linking是以下三个选项之一:staticshareddev

  • ffmpeg只是“ffmpeg”。

  • version是版本(例如4.320200628-4cfcfb3)。

  • 附加仅.zip表示该版本 FFmpeg 遵循 GPL 3.0 许可,而附加-lgpl.zip表示该版本 FFmpeg 遵循 LGPL 3.0 许可。

假设有人希望下载:

  • FFmpeg 4.3 的 Windows 64 位、共享库、LGPL 3.0 许可版本
  • FFmpeg Git 的 Windows 32 位、静态链接、GPL 3.0 许可版本构建 20200628-4cfcfb3

这些 URL 看起来如下:

例如 Zeranoe FFmpeg URL

https://ffmpeg.zeranoe.com/builds/win64/shared/ffmpeg-4.3-win64-shared-lgpl.zip

https://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20200628-4cfcfb3-win32-static.zip

请注意,LGPL 3.0 许可证似乎仅适用于 Zeranoe 分发的非 Git 版本的 FFmpeg。因此,ex.ffmpeg-20200628-4cfcfb3-win32-static-lgpl.zip无效。


SHA256 校验和

对于给定的下载,指向相应 SHA256 文件的链接本质上是相同的 URL 构造,但在主要 URL 之间插入了“sha256” url,并platform在末尾添加了“.sha256”:

例如 Zeranoe SHA256 URL 构建

url/sha256/platform/linking/ffmpeg-version-platform-linking(.zip)(-lgpl.zip).sha256

上述文件对应的 SHA256 URL 如下所示:

例如 Zeranoe FFmpeg SHA256 URL

https://ffmpeg.zeranoe.com/builds/sha256/win64/shared/ffmpeg-4.3-win64-shared-lgpl.zip.sha256

https://ffmpeg.zeranoe.com/builds/sha256/win32/static/ffmpeg-20200628-4cfcfb3-win32-static.zip.sha256

页面源选项

FFmpeg 版本信息以纯文本形式包含在<a>Zeranoe 相关 HTML 页面源中的 (anchor) 元素中。您可以使用给定版本的渲染版本https://ffmpeg.zeranoe.com/builds/或服务器生成的目录列表来提供这些<a>元素,但需要注意一些事项。

使用 ffmpeg.zeranoe.com/builds/

使用https://ffmpeg.zeranoe.com/builds/收集当前版本信息有一些缺点:

  • <a>保存版本信息的元素仅包含版本信息:

    <a role="menuitem" href="#" target="_self" class="dropdown-item">4.3</a>

    这意味着您需要自己构建您想要下载的文件名。

  • <a>的元素https://ffmpeg.zeranoe.com/builds/并非全都是版本号。每个<a>标签指定一段弹出/下拉文本,这意味着您需要在脚本中手动整理版本号。

  • <a>https://ffmpeg.zeranoe.com/builds/仅当网页在浏览器窗口中可见时,才会呈现元素(通过 JavaScript)。

最后一项意味着普通的命令行工具(例如curlwget等)不能用于收集页面源代码https://ffmpeg.zeranoe.com/builds/(尽管它们仍然可以用于下载文件)。至于浏览器自动化(例如使用Selenium WebDriverSave As用类似的东西操纵自动热键等),浏览器窗口必须可见(即您不能将headless模式与 Firefox/Chrome 和 Selenium 一起使用)。

使用服务器生成的目录列表

由于上述缺点,解析 HTML 页面源代码https://ffmpeg.zeranoe.com/builds/可能不是最佳选择。目前,https://ffmpeg.zeranoe.com/builds/它只是许多公开可用的 Web 目录的前端,其形式如下:

例如 Zeranoe FFmpeg 目录

url/platform/linking

例如 Zeranoe SHA256 目录

url/sha256/platform/linking

再次:

  • urlhttps://ffmpeg.zeranoe.com/builds/

  • platform是以下三个选项之一:win64win32macos64

  • linking是以下三个选项之一:staticshareddev

因此对于全部例如由 Zeranoe 托管的 Windows 32 位静态链接构建(及其相应的 SHA256 校验和),完整的目录列表可在此处获得:

例如 Zeranoe Windows 32 位静态链接构建

https://ffmpeg.zeranoe.com/builds/win32/static/

https://ffmpeg.zeranoe.com/builds/sha256/win32/static/

由于这些列表不包含 JavaScript(它们返回常规 HTML),因此您可以提取必要的<a>元素,而无需先在浏览器中呈现它们:

<a href="ffmpeg-4.3-win32-dev.zip">ffmpeg-4.3-win32-dev.zip</a>

这意味着它们不会丢失,并且可以使用命令行工具(例如,等)获取每个目录列表的页面curlwget


一个小警告是,curl -O( --remote-name) 将导致获取远程目录失败。您需要手动指定输出文件的名称(例如curl -o zeranoe_win32.html https://ffmpeg.zeranoe.com/builds/win32/static/)。


Powershell 示例

<a>使用 PowerShell 从 Zeranoe 的服务器生成的目录列表中获取元素文本:

例如 extract_anchor_text.ps1

# Print the text associated with each <a> element for the given Zeranoe
# server-generated directory listing at the command line.

$SiteAdress = "https://ffmpeg.zeranoe.com/builds/win32/static/"

$HttpContent = Invoke-WebRequest -URI $SiteAdress

# Get the href= value for each link
# $HttpContent.Links | Foreach {$_.href }

# Get the inner text between <a> and <\a> for each link
$HttpContent.Links | innerText

请注意,在这种情况下,值中的文本与和href=之间的文本相同(如前所述,此时没有相关元素包含完整的下载 URL):<a><\a><a>

例如 extract_anchor_text.ps1 输出(命令行)

[...]
ffmpeg-20200626-7447045-win32-static.zip
ffmpeg-20200628-4cfcfb3-win32-static.zip
[...]
ffmpeg-4.3-win32-static-lgpl.zip
ffmpeg-4.3-win32-static.zip

如果你想进一步了解如何使用 PowerShell 解析 HTML 网页,可以访问此示例的链接这里

相关内容