Contents

在Linux中从视频文件中提取持续时间

1. 概述

在本教程中,我们将了解如何从视频文件中提取持续时间信息。Linux 中有不同的工具可用于处理多媒体文件。 这些工具通过提取元数据或将它们从一种格式转换为另一种格式来帮助我们处理音频、视频或图像文件。我们将看到如何使用其中的一些。

2. 使用FFmpeg

FFmpeg 套件是多媒体领域中广泛使用的软件包之一。它是一组用于处理多媒体文件(如音频、视频、字幕和元数据)的库和工具。它最常用于编辑、编码和解码多媒体文件

Linux 发行版中默认不安装此应用程序。让我们看看如何在 Ubuntu 18 和 CentOS 7 中安装它。

在 Ubuntu 18 中:

$ sudo apt install ffmpeg

对于 CentOS 7:

$ sudo yum install epel-release
$ sudo yum install --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
$ sudo yum install ffmpeg

我们可以运行上述这些命令以在各自的发行版中安装应用程序。安装后,我们就可以使用它了。

以下是该命令的一般用法:

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

让我们看看如何获取视频文件的时长:

$ ffmpeg -hide_banner -i test.avi 2>&1 | grep Duration | cut -d ',' -f1
Duration: 00:00:17.20

从上面的结果可以看出,持续时间是 17.20 秒。

在这里,我们将stderr重定向到stdout  ,因为ffmpeg命令将元数据发送到stderr。然后我们对文本Duration进行grep ,并从输出中仅cut 持续时间信息。

使用的不同选项是:

  • -hide_banner :用于隐藏**ffmpeg命令默认打印到控制台的版本等信息。
  • -i:设置输入文件进行处理

3. 使用ffprobe

ffprobe 工具是 FFmpeg 套件的一部分。如果我们已经安装了ffmpeg包,我们应该准备好使用这个工具了。它用于从多媒体文件中获取元数据

一般用法是:

ffprobe [OPTIONS] [INPUT_FILE]

让我们检查一下如何使用这个工具来获取持续时间:

$ ffprobe -i test.avi -hide_banner -v error -show_format -show_entries format=duration -of flat
format.duration="17.200000"

从上面的结果,我们可以看到它只打印了持续时间。ffprobe工具带有一些选项,可以只提取所需的信息,而无需在 Linux 中使用任何grep或 cut命令。

让我们一一检查我们在这里使用的选项:

  • -i : 输入文件
  • -hide_banner : 隐藏版本信息
  • -v error:将日志级别设置为错误以抑制有关输入文件的默认信息
  • -show_format:显示文件格式信息
  • -show_entries format=duration:仅显示格式信息中持续时间的条目
  • -of flat:使用平面输出格式来抑制格式标签

4. 使用mediainfo

mediainfo 工具是一个开源程序**,用于从音频、视频和图像文件中提取元数据**。

与上面的ffprobe工具一样,它也支持仅提取我们需要的信息的选项

同样,此应用程序也不会默认安装在 Linux 发行版中。让我们检查安装它的命令: 在 Ubuntu 18 上:

$ sudo apt install mediainfo

在 CentOS 7 上:

$ sudo yum install mediainfo

安装后,我们就可以使用该应用程序了。

用法是:

mediainfo [-Options...] FileName1 [Filename2...]

让我们检查一下如何获取持续时间信息:

$ mediainfo --Output="General;%Duration%" test.avi 
17200
$

在这里,我们使用了*–Output*选项来提取所提供视频文件的持续时间。

默认情况下,该命令在视频文件的三个部分中打印输出。常规部分、视频部分和音频部分。使用*–Output选项,我们请求从General部分打印Duration 。*持续时间以毫秒为单位打印。

5. 使用exiftool

exiftool 是一个开源程序,它允许**我们编辑音频、视频、图像和 PDF 文件中的元数据。由于这可用于编辑元数据,我们可以使用此工具修复损坏的多媒体文件。**与其他人不同,这是一个 Perl 应用程序,它也使其独立于平台。

让我们从如何安装应用程序开始: 在 Ubuntu 18 上:

$ sudo apt install libimage-exiftool-perl

在 CentOS 7 上:

$ sudo yum install epel-release
$ sudo yum install perl-Image-ExifTool

安装后,我们就可以运行该应用程序了。 用法是:

exiftool [OPTIONS] FILE

让我们看看如何使用它来提取持续时间:

$ exiftool test.avi  | grep Duration 
Duration                        : 17.20 s

正如我们所看到的,用法非常简单。exiftool打印给定视频文件的元数据*。我们使用grep*命令仅打印结果中的持续时间信息。

6. 使用mplayer

mplayer 是一个强大的媒体播放器,用于从命令行播放各种格式的媒体文件。它可以打印发送播放的媒体文件的元数据。我们可以从该元数据中获取持续时间信息。

让我们从查看安装此应用程序的不同方法开始。 在 Ubuntu 18 上:

$ sudo apt install mplayer

在 CentOS 7 上:

$ sudo yum install mplayer

安装后,我们已准备好使用该应用程序。让我们检查一下一般用法:

mplayer [options] [url|path/]filename

有了这个,让我们尝试获取持续时间信息:

$ mplayer -vo null -ao null -frames 0 -identify -really-quiet test.avi 2>/dev/null | grep ID_LENGTH
ID_LENGTH=17.20
$

从上面的结果中,我们可以看到它正确地打印了持续时间。

让我们检查一下命令中使用的不同选项:

  • -vo:将视频驱动程序设置为 null 以抑制视频输出
  • -ao:将音频驱动程序设置为 null 以抑制音频输出
  • -frames:将要播放的帧设置为零,这样它就不会播放内容
  • -identify:将详细程度设置为信息级别,打印视频文件的元数据
  • -really-quiet:抑制其他不需要的输出到控制台

最后,我们将所有标准错误重定向到*/dev/null以防止在控制台中打印不需要的错误。然后我们将结果通过管道传递给grep*命令并过滤持续时间。

7. 使用tcprobe

tcprobe 工具是transcode包的一部分。transcode 实用程序用于将视频文件从一种格式转换为另一种格式。即使它很旧并且不再维护,它仍然可以用来解码 DVD 中的对象transcode应用程序在内部使用 tcprobe 工具来收集有关输入流的信息。

让我们先看看如何安装这个工具。 在 Ubuntu 18 上:

$ sudo apt install transcode

在 CentOS 7 上:

$ sudo yum install transcode

安装应用程序后,我们就可以开始使用它了。 一般用法是:

tcprobe [options] [-]

让我们检查一下如何从视频文件中获取持续时间:

$ tcprobe -i test.avi 2>/dev/null | grep duration | cut -d ',' -f3 
 duration=0:00:17.200

如我们所见,我们使用*-i标志提供了视频文件作为输入。然后我们通过 grep和 cut命令获取结果。最后,它正确打印了持续时间。我们已将stderr重定向到/dev/null* 以忽略错误消息。