小白:我录了段视频,外面用的音乐是有版权的,而且快过期了,能把音乐去掉吗?

小程拿到视频后,一个快捷键关上命令终端,疾速打下一行命令:

ffmpeg -i 小白.flv -vcodec copy -an -f mp4 quiet.mp4

一个只有视频图像的文件就诞生了。

声画拆散,这当然只是ffmpeg命令的一个利用场景。

那么,FFmpeg是什么呢?

来看看百度百科的解释:

FFmpeg是一套能够用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采纳LGPL或GPL许可证。它提供了录制、转换以及流化音视频的残缺解决方案。它蕴含了十分先进的音频/视频编解码库libavcodec,为了保障高可移植性和编解码品质,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也能够在其它操作系统环境中编译运行,包含Windows、Mac OS X等。这个我的项目最早由Fabrice Bellard发动,2004年至2015年间由Michael Niedermayer次要负责保护。许多FFmpeg的开发人员都来自MPlayer我的项目,而且以后FFmpeg也是放在MPlayer项目组的服务器上。我的项目的名称来自MPEG视频编码标准,后面的"FF"代表"Fast Forward"。

小程用本人的话,再来翻译一下:

FFmpeg是一个开源我的项目,始终有人在加新性能、优化、改bug。这个我的项目,能够进行音视频的录制、编码、流化、解码、成果解决、重采样等一系列的操作......

基本上,有音视频性能的利用,都跟FFmpeg扯上关系,比方暴风影音、QQ影音、mplayer、格局工厂等等。

小白:我可不论谁在用,我只有本人能用就行。

小程:那FFmpeg的开源协定LGPL跟耻辱柱,你也不想听了?

小白:LGPL?老公丑陋?

开源我的项目都制订本人的开源协定,这里我不细说了,你感觉有必要的话能够去搜寻理解。

本文的重点在于,介绍如何应用ffmpeg命令(FFmpeg程序),实现一些罕用的音视频操作性能,比方在视频上增加文字或水印。

我的开发环境是mac,以下的介绍都默认在mac零碎上操作,但FFmpeg命令根本是平台无差别的。

生成FFmpeg程序有两个方法,一个是应用源码编译生成,另一个是间接装置,我别离介绍这两种办法。

(一)源码编译出FFmpeg,并实现水印增加

这个方法是下载FFmpeg源码下来,再编译生成FFmpeg程序。如果想应用FFmpeg来组装本人的程序,这个方法是必经之路。

我这里介绍怎么用ffmepg命令来给视频增加文字或水印,为了实现这个性能,在编译FFmpeg时须要减少特定的参数设置。由此可见,为了满足不同的需要,能够调整编译FFmpeg的编译选项。

小白:把文字写到视频上?还不简略,你要什么色彩,我有彩色笔。

小程:我是说,在视频帧上退出文字,不是让你在屏幕上画个大叉!

在视频帧上退出文字,可抉择的方法有几个,比方能够找一找“编辑视频加广告”、或视频巨匠之类的工具,也能够写程序来实现(比方提取出所有帧,再对图片解决,再整合所有图片),这里介绍的是间接用ffmpeg命令来实现。

这时,须要应用FFmpeg的drawtext滤镜来实现增加字幕。

滤镜,能够了解为视频的编辑性能(视频成果解决),是FFmpeg弱小的性能之一。

先下载FFmpeg的源码

git clone git://source.ffmpeg.org/ffmpeg.git FFmpeg

在FFmpeg目录上面,能够看到FFmpeg的编译配置程序configure。

(1)反对滤镜filter

要保障ffmpeg程序反对filter,否则ffmpeg在应用drawtext时,会看到这样的提醒:

这时,查看FFmpeg配置后(即执行./configure后)生成的头文件config.h(如果配置过就会有这个文件),能够看到:

#define CONFIG_DRAWTEXT_FILTER 0

这是还没有关上drawtext滤镜的体现。

那怎么样让ffmpeg程序反对filter呢?

首先,须要装置yasm,如果以后的macos没有这个执行程序的话(能够用wihch yasm 来查看一下)。yasm是一个汇编编译器,我会在FFmpeg编译给挪动平台应用时再介绍一下yasm,当初间接装置即可:

brew install yasm

你如果不理解brew的话,能够搜寻homebrew进行理解。

装置yasm后,就能够配置FFmpeg,让它反对filter(drawtext依赖于libfreetype):

./configure --enable-libfreetype --enable-avfilter

这时,在配置输入中(执行./configure),能够看到:

而此时,config.h中是这样:

#define CONFIG_DRAWTEXT_FILTER 1

接着,编译出ffmpeg工具即可:

make

小程不倡议执行make install来装置到零碎,因为在介绍第二种装置ffmpeg程序的方法时,会给零碎装置一个ffmpeg。所以,只执行make在当前目录生成ffmpeg即可。

查一下ffmpeg程序,有没有反对到drawtext滤镜:

./ffmpeg -filters

能够看到,曾经有这一项:

(2)应用drawtext滤镜

以一个视频为例,在没有加字幕前,这个视频是这样的:

应用ffmpeg命令,这样加上字幕:

左右滚动的字幕:

./ffmpeg -i ~/Desktop/hello.mp4 -b:v 500K -vf drawtext="fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=0xaaff00:fontsize=18:shadowy=0:\x='if(gte(t,2), (main_w-mod(t*50,main_w)), NAN)':y=(main_h-line_h-10):text='关注广州小程,晋升专业技能。'" hello.mp4

固定地位的字幕(这里加了两行):

./ffmpeg -i ~/Desktop/hello.mp4 -b:v 500K -vf "drawtext=fontfile=/Library/Fonts/华文黑体.ttf:fontcolor=yellow:fontsize=20:shadowy=0:x=(w-tw)/2-30:y=(main_h-line_h-50):text="关注广州小程",drawtext=fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=0xaaff00:fontsize=18:shadowy=0:x=(w-tw)/2-30:y=(main_h-line_h-20):text='晋升专业技能'" hello1.mp4

把下面加了字幕的mp4文件,转换成gif(因为很多网站反对gif上传而不反对视频),比方:

./ffmpeg -i hello.mp4 -b:v 10K -s 200x200 hello.gif

而后看一下这两个成果,一个是滚动文字,另一个是固定文字:

小程简略解说一下命令中的参数,请参考下图的注解:

另外留神一下,x与y参数指定了地位,是能够变动的值;

如果须要输入多行文字,则能够应用多个drawtext字段;

如果感觉文字的色彩不好调整,那能够思考给文字加上背景框,试一下这些参数:

box --是否应用背景框,默认为0boxcolor --背景框的色彩borderw  --背景框的暗影,默认为0bordercolor  --背景框暗影的色彩

以上是在视频上绘制字幕,如果想在视频上绘制图片,包含动静的gif图,怎么解决呢?

视频增加图片:

./ffmpeg -i ~/Desktop/2.mp4 -acodec copy -b:v 800K -vf "movie=in.png[watermark];inoverlay=main_w-100:main_h-100[out]" out4-1.mp4

其中:

movie --水印图片overlay --三个参数,[距视频原图右边的间隔,距上边的间隔,是否通明],对于视频,最初一个参数不能应用

视频增加动静水印(gif):

./ffmpeg -y -i ~/Desktop/v.mp4 -ignore_loop 0 -i hello.gif -ss 0 -t 9 -filter_complex overlay=main_w-138:0:1 v-3.mp4

因为无奈上传视频,这里就不展现成果了。至此,小程介绍了如何在视频上增加文字、图片及gif动静水印。

接着介绍的是间接装置FFmpeg的方法。

(二)间接装置FFmpeg,并做一些惯例操作

间接装置FFmpeg库,比方在mac机上,间接用brew来装置。如果你的零碎自带ffmpeg,那就不用了。

这样装置FFmpeg:

sudo brew link x264
brew install ffmpeg

如果之前曾经装置过FFmpeg,那要注意提醒,是否新装置的FFmpeg有link胜利。如果没有胜利也是能够应用的,只是要找对文件来运行。如果不想烦扰到原来装置的ffmpeg,也能够起个别名来应用,比方新装置目录是:/usr/local/Cellar/ffmpeg/2.6.2/bin,则在~/.bash_profile中减少一项:alias f26='/usr/local/Cellar/ffmpeg/2.6.2/bin/ffmpeg',便能够应用f26来调动新装置的FFmpeg。

装置方法可能变动的,遇到问题不要慌,按谬误提醒,具体问题具体分析。

装置实现后,这样查看一下ffmpeg的信息:

ffmpeg -version

能够看到,默认装置下,曾经反对lamemp3、x264、librtmp第三方库等。

装置完ffmpeg,就能够做一些惯例操作了。有什么惯例操作呢,提取、合成、转码、录制,等等,这些操作都能够应用ffmpeg命令来实现。

那么问题就来了,这么多命令与参数,能记得住吗?不能。所以一方面能够自行记录一些罕用的命令,另一方面须要晓得在哪里查看命令与参数。所有命令与参数的应用都能够在这个地址查到: https://ffmpeg.org/ffmpeg.html ,或者更具体一点的比方: https://ffmpeg.org/ffmpeg.htm... 。

小程在这里简略列举几个,你应该依据本人的需要来查看适当的命令。

提取视频流:

ffmpeg -i xx.flv -vcodec copy -an output.h264

提取音频流:

ffmpeg -i fx_flash22298734.flv -acodec copy -vn audio.aac

提取音轨(音频流):

ffmpeg -i 起初_MQ.m4a -map 0:0 0.wav

ffmpeg -i 起初_MQ.m4a -map 0:1 1.wav

提取声道:

ffmpeg -i "TFBOYS - 是你.mp3" -map_channel 0.0.0 1.aac -map_channel 0.0.1 2.aac

合成音频与视频:

ffmpeg -i 1.mp4 -i 1.wav -vcodec copy mix_test.mp4

转码:

ffmpeg -i 22298734.flv -vcodec mpeg4 -s 320*240 -an -f m4v test.mp4

保留rtmp流在本地:

ffmpeg -i "rtmp://xxx.com/live/hks live=1" -vcodec copy -acodec copy out.flv

以上介绍了间接装置FFmpeg,并应用ffmpeg命令的内容。


好了,总结一下,本文介绍了如何生成ffmpeg命令程序的方法,包含通过源码编译与间接装置的方法。同时,也演示了应用ffmpeg命令来给视频增加字幕或图像(包含动静图像)的操作,以及列举了可能罕用的ffmpeg命令。有缘再见,see you。