FFmpeg 应用

获取在OS X的最新的FFmpeg有自制的帮助

平时我的工作与稳定版本的FFmpeg,因为我感觉更舒服使用它在稳定的状态每天。当然,对于一些错误修正我在等待我切换到每晚构建,直到下一个稳定版本出来。总之,使用的FFmpeg对OS X版本通过自制安装,你必须坚持使用最新实施的稳定版本上家酿。就在最近的FFmpeg 2.0发布了一些伟大的新功能,我想尽快尝试没有编译一切从头开始。对于这一点,就来到了我的心,我可以用我自制的FFmpeg版本的所有库,只是一个新的核心编译。它并不难,因为它听起来。

如果你还没有安装FFmpeg的使用还自制,看看这篇文章,其中我描述如何做到这一点。

获取编译器标志

感谢FFmpeg.Developers它是很容易获得的配置标记的当前版本编译的。只需执行 $ ffmpeg的   在你的命令行,你会看到这样的事情:

ffmpeg version 1.2 Copyright (c) 2000-2013 the FFmpeg developers
  built on Mar 22 2013 08:17:36 with Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5 '
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

对我们来说,最重要的是,现在这个部分:

--enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5'

这些都是我们的,我们将在以后使用的配置标志。

准备环境

接下来,我们需要创造一个FFmpeg的我们的“特殊”-version将生活在一个文件夹中。后来,我们就可以有多个版本的FFmpeg的,是不是很大?所以,我决定创建一个文件夹,名为ffmpeg-latest的_ /usr/local/ / _带  $ mkdir /usr/local/ffmpeg-latest  。

获取FFmpeg的

现在我们将去,并从Git的最新FFmpeg的,并将其下载到/ tmp的文件夹,我们不会不再编译后需要它。

所以,首先更改目录到/ tmp以  $ cd /tmp目录   ,并使用获得的FFmpeg  $ git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg。如果你没有安装git的,你可以使用自制软件与安装它  $ brew install git。完整的源代码现在应该在现有_ /tmp/ffmpeg._。

建立你的configure命令

至少我们要完成configure命令使FFmpeg的能找到的所有库。我们只需要修改前缀标志并增加两个额外的标志告诉FFmpeg的到哪里寻找库和包括。正如我们首先选择/usr/local/ffmpeg-latest为我们的安装目录,这也将是为前缀的标志值。

在默认安装自制软件将安装包括 /usr/local/Cellar/include在所有图书馆/usr/local/Cellar/libs。如果您已经在用不同的方式安装自制软件或任何已更改。同时,你需要检查您的库/包含文件夹的。有FFmpeg的寻找到这些文件夹,我们必须添加 –extra-cflags=’-I/usr/local/Cellar/include’ –extra-ldflags=’-L/usr/local/Cellar/lib’我们的configure命令。

将其组合在一起:

--prefix=/usr/local/ffmpeg-latest --extra-cflags='-I/usr/local/Cellar/include' --extra-ldflags='-L/usr/local/Cellar/lib' --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5'

编译

现在,我们可以编译。首先更改目录/tmp/ffmpeg 有  $ cd /tmp/ffmpeg  。之后,你就可以开火configure命令如下:

$ ./configure --prefix=/usr/local/ffmpeg-latest --extra-cflags='-I/usr/local/Cellar/include' --extra-ldflags='-L/usr/local/Cellar/lib' --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-libopus --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5'

我认为这将工作没有任何问题,你可以去进一步利用来构建新的ffmpeg版本  $ make  。这将需要几分钟,以便休息一下,喝杯咖啡;)。

如果这还没有完成任何错误(警告都很正常这里),你可以使用安装  $ sudo make install  。这个命令的completition后您终于完成。

现在,您可以执行使用新版本的FFmpeg  $ /usr/local/ffmpeg-latest/bin/ffmpeg  。

附加:创建符号链接

正如我通常喜欢我的系统路径环境的工具,我会展示如何创建一个符号链接为新FFmpeg的版本,以便二进制仍然/usr/local/ffmpeg-latest/bin,但你并不需要添加路径到系统路径,也将来到一个错误,你有另一个FFmpeb二进制在你的路径。无论如何,我希望创建在/ usr /本地一个符号,这里是它是如何做到了:

$ ln -s /usr/local/ffmpeg-latest/bin/ffmpeg /usr/local/bin/ffmpeg-latest

从这个时候,你可以简单地执行  $ ffmpeg-latest   使用最新版本。

FFmpeg的-第一部分:通用的用法

FFmpeg的标志

当时人们开始用音频/视频转换的FFmpeg,大多数人有谷歌很多,找出如何使用它以适当的方式。大多数时候用户搜索特定用例是确定的,如果你只需要使用它的一个使用案例。该博客还将指向你如约水印,编码成不同的文件格式和编解码器的具体使用情况等。然而,这篇博客文章将告诉你FFmpeg的工作在一般情况下,更抽象的方式,这将帮助你在不同情况下使用它。因为这会变得有点复杂,我注重可读性,我将开始很简单,底座上,在进一步的解释。

非常简单的用法

ffmpeg -i [INPUTFILE] [OUTPUTFILE]

如  ffmpeg -i MyMovie.mp4 MyMovie.avi  将你的MP4的视频转换为AVI。当然这不是因为你没有指定任何东西,你的输出分辨率一样,编解码器,比特率等非常有用的,但我会用这个命令为起点进行进一步的解释。

Specifiying编解码器

音频和视频编解码器定义的压缩算法对音频或视频与编码。FFmpeg的可以处理大量的编解码器,你可以检查的可用性与  ffmpeg的 - 编解码器  。它会告诉你所有已安装的编解码器,并确定它们是否可用的话解码,编码或两者兼而有之。这里是哪里来定义你的命令行的编解码器:

... [INPUTFILE] -c:v [VIDEOCODEC] [CODEC-OPTIONS] -c:a [AUDIOCODEC] [CODEC-OPTIONS] [OUTPUTFILE]

因此,例如创建一个H.264视频与AAC音频完整的命令行应该是这样的:

ffmpeg -i MyFile.avi -c:v libx264 -preset slow -c:a libfdk_aac MyFile.mp4

让我们通过在我们的命令行新的论据:

-c:(ⅴ|一) 是一个选择器,用于不同类型的编解码器。v是选择器的视频和一个音频

 [VIDEOCODEC]:   是视频编解码器的使用。在我的例子libx264将编码为H.264视频。

[的AudioCodec]: 分别定义了音频编解码器进行编码。在这个例子中,我用libfdk_aac编码为AAC音频。

[CODEC-OPTIONS]: 每一个编解码器自带了一堆选项。你曾经定义旁边的具体的编解码器。对于视频我只是使用了X264的开发提供了预设和音频我没有选择的话,将让FFmpeg的使用默认选项。

这只是一个简单的介绍,我们只是触及了什么FFmpeg是能够表面。其实我也不知道有多少份这种即将推出的系列都会有。我想围绕五个,然后我会去到一些具体的和/或有趣的事情可以做的FFmpeg。下一个主题将告诉您如何裁剪,缩放和信纸/邮筒你的电影。

看你有...

FFmpeg的 - 第二部分:视频缩放

FFmpeg的-Logo.svg本

你们中的大多数正在视频编码的时间FFmpeg的,你会想扩展您的视频,以适应特定的球员 ​​配置,或者只是因为你可以:-)您的需求。严重的是,当你创造了如自适应流媒体内容,您会希望在创建用于片剂或手机更低的比特率,以降低视频分辨率。

为了让下面的例子缩放可比我决定用30秒将图像从  钢之泪  视频。这是通过参数的做法 - SS30   在命令行中。我也转换成帧使用PNG文件 - vframes 1   选项,定义只使用输出文件的扩展名PNG PNG编码。

缩放滤波器

要使用你需要使用的缩放滤波器 - VF   (videofilter)选项,在命令行。这标志着FFmpeg的准备被过滤的视频帧。过滤器在FFmpeg的是可链接的,但是这是我们更深入地研究在即将到来的一篇文章的主题。

一般用法的缩放过滤器:

“规模= W =所需的输出宽度:H =所需的输出高”

这相当于

“规模=所需的输出宽度:所需的输出高”

简单的比例

作为第一个例子,我将告诉你如何去衡量一个给定的视频使用命令行640x267px固定定义的分辨率:

ffmpeg -ss 30 -i tears_of_steel_1080p.mov -vf "scale=640:267" -vframes 1 tos_640x267_scale.png

这将导致下面的图片:

tos_640x267_scale](http://www.renevolution.com/wp-content/uploads/2013/05/tos_640x267_scale.png)

这可能是怀疑你,我选择了640x267px作为该决议,但,这是导致决议保持视频图像的宽高比。让我们来看看,如果我们缩放视频640x360px的固定的分辨率会发生什么:

ffmpeg -ss 30 -i tears_of_steel_1080p.mov -vf "scale=640:360" -vframes 1 tos_640x360_scale.png

tos_640x360_scale

好吧,这看起来真的不好,即使演员可能喜欢看到他们,苗条,它实际上看起来更像是“翻拍Coneheads “ -电影在1993年:-)。

回到主题,会有情况下,您不知道正确的分辨率为您的视频输出,你可能只是想定义最大宽度或高度。对于这些情况的ffmpeg引入了一个自动的方法来保持由跟限定的宽度或高度的纵横比,并设置相对为-1。

ffmpeg -ss 30 -i tears_of_steel_1080p.mov -vf "scale=640:-1" -vframes 1 tos_640x-1_scale.png

ffmpeg -ss 30 -i tears_of_steel_1080p.mov -vf "scale=-1:267" -vframes 1 tos_-1x267_scale.png

将导致与作为第一张图像的分辨率相同(+/- 1像素)。

高级缩放

停止倍增

如果你想批量处理的一套视频,你可能会考虑使用正则表达式。这些都是非常强大,我只能建议你使用它们,如果你不知道什么样的输入分辨率期待。

下面的例子将阻止你升频您的视频到一个更高的宽度输入视频提供和640px最大宽度:

ffmpeg -ss 30 -i tears_of_steel_1080p.mov -vf "scale='min(iw,640)':-1" -vframes 1 tos_no_upscaling.png

在这个例子中我使用_iw的_保持该视频分析出的输入宽度和可变_分钟()_函数,它比较输入宽度640,并应用下一个过滤器。因此,对于1280x720px输入分辨率输出分辨率将是640x360px和320x180px的输入分辨率输出分辨率将保持320x180px。

半角

正则表达式,你还可以扩展您的图像,例如用下面的命令行半大小的视频:

ffmpeg -ss 30 -i tears_of_steel_1080p.mov -vf "scale='iw/2':-1" -vframes 1 tos_half_size.png

您可以轻松地修改这个例子,例如创建季度大小的视频,当然你也可以应用这些正则表达式的高度。只是尝试一下。

FFmpeg的-第三部分:裁剪

FFmpeg的-Logo.svg本

如果你曾经在一个情况下录制的视频有一个空白间隔,或者你只是想获得你的视频的特定部分,你肯定会想裁剪视频。在本文中,我将向你展示如何使用做到这一点的FFmpeg

例如视频

crop_example

好吧,你离开键盘和停止阅读之前......你不会需要一个标尺来解决这个问题。让我们看看我们如何能做到用最简单的方式FFmpeg的

获取裁剪值

首先,我们需要找出裁剪滤波器所需的值。这可以通过FFplay使用cropdetect滤波器来完成。这可以通过使用命令行来完成  ffplay -i YourMovie.mp4 -vf "cropdetect=24:16:0" ,或使用FFmpeg的使用下面的命令行  ffmpeg -i YourMovie.mp4 -vf "cropdetect=24:16:0" dummy.avi

该过滤器cropdetect配置与参数_cropdetect =限制:轮:重置_ 具有以下含义:

极限 =黑条的强度阈值。你可以玩弄的是,它的工作主要是对我很好的默认值24

 =确保输出的分辨率是整除指定的值。16是最适合大多数的视频编解码器。

复位 后多少帧cropdetect将重置先前检测到的最大视频区域,并重新开始检测当前的最优作物面积=确定。当电视徽标中断视频这是特别有用。

要在你的shell的输出看起来就像这样:

[Parsed_cropdetect_0 @ 0x7fe4f14127c0] x1:0 x2:639 y1:29 y2:295 w:640 h:256 x:0 y:36 pos:1426828 pts:636 t:26.500000 crop=640:256:0:36
[Parsed_cropdetect_0 @ 0x7fe4f14127c0] x1:0 x2:639 y1:29 y2:295 w:640 h:256 x:0 y:36 pos:1428008 pts:637 t:26.541667 crop=640:256:0:36

那是什么?右,与每一行的最后一部分“ 作物= ... “是我们的剪切值,除去我们周围所有的电影黑边。

作物,喜欢它的热

现在是时候用删除围绕这部电影那些恼人的黑边

ffmpeg -i YourMovie.mp4 -vf "crop=640:256:0:36" YourCroppedMovie.mp4

这将导致在这样的预期的输出:

裁剪

最终解释,在一个更​​一般的方式作物过滤器使用的参数,在这里我们去:

作物过滤器有四个参数  crop=out_width:out_height:x:y  并且可以作为解释

out_width / output_height 代表视频的裁剪输出宽度。

的x / y是从左上角开始坐标。

在我的例子中裁剪输出宽度为640px,输出高度在总256PX,从(0,36)开始坐标。

与固定值裁剪

另一种方法是裁剪你的视频到一个固定的区域。这可以通过使用作物过滤器配置内的正则表达式来完成。

对于如裁剪上顶部/底部使用左/右16px的这个配置你的视频32PX crop=iw-64:ih-32:32:16。参数  IW-64是由输入宽度计算的裁剪输出宽度- 64PX,因为我们想从每边裁剪32PX。同样是为输出高度与完成_IH-32 32PX - - ​​> 16像素的每个顶部和底部,这导致计算的裁剪输出高度。起始坐标是x_ = 32和 = 16。

我希望我能告诉你如何有用和强大的裁剪是您喜欢阅读。试试吧,有乐趣...