使用ffmpeg做简单的音视频剪辑

写给小白的入门文

(图文无关)

说是”简单”的音视频剪辑,其实在日常的音视频工作中,也应当是最常用的功能。
使用ffmpeg做音视频的剪辑,缺点当然显而易见,就是使用命令行操作,操作繁琐,大多数人都不适应。但是也有至少两个优点是用其它方法甚至专业视频处理软件所不能比的:1.程序小,运行速度快。2.操作是在原文件基础上直接处理,不经过传统视频处理软件的再次渲染环节,没有质量损失。3.对技术人员来说,可控性强,可以用脚本之类的方法实现自动化处理。

剪辑通常包括两个重要操作,一是对录制的音视频进行修剪,只保留下来我们需要的部分;二是把我们组织好的多个音视频片段,接续在一起,成为一个完整的作品。先说修剪的操作:

  • 首先准备一个工作用的文件夹,比如在桌面上建立一个文件夹:medias,把需要处理的音视频文件,放到这个文件夹。这一步可以在图形界面操作,以下为了讲解方便,我们假设medias中已经放了一个视频文件GoodMovie.mp4,当然以下的讲解对于音频文件比如MP3文件也是相同的,只是把对应的文件换成音频文件即可。
  • 首先要知道我们需要保留的音视频,从哪个时间点开始,到哪个时间点结束。通常在专业的拍摄中,这个时间点会有场记人员专门记录下来,俗称“打点”。一般情况下,预览视频文件,就可以得到我们要的时间点,这些时间点要使用笔记本记录下来,精确度建议到秒,不要过于相信你的大脑,相信我,不写下来最多超过3个时间点你就会搞混的。
  • 一般MP4/MP3文件,在Mac电脑直接按空格键即可“预览”,预览的过程中,窗口的下方会有时间条,我们可以记录下来每一段需要保留下来视频的开始时间和持续时间。
  • 打开终端软件,可以在Launchpad中找图标,也可以使用右上角的Spotlight来搜索Terminal,正常情况下Sportlight也有快捷键COMMAND+SPACE。
  • 在终端命令行中,把工作目录换到我们建立的medias文件夹:cd ~/Desktop/medias。作为给小白的第一篇,这里多解释一些:
    • 命令行中所有的命令,都应当使用英文及英文符号,除了极个别参数可能是中文或者中文符号(比如中文的文件名)。这一点非常重要,对于很多入门者来说,大多的错误都是用错了字符或者符号。
    • cd是更换当前工作目录的命令。
    • 后面的空格代表命令跟参数之间的分割,是必须有的。
    • 再后面的~符号,键盘上位于左上角ESC键之下,代表系统中当前用户的基本目录,也叫HOME目录,在Mac/Linux中(以后我们会简称类Unix系统),cd命令不带任何参数就是换到这个目录。
    • /除法符号代表目录与目录之间的间隔,是必须有的。完整的文件名包含一层一层的目录嵌套,中间用/隔开,也称为”路径”(PATH),很形象的说法是吧。
    • 在类Unix系统中,文件名、目录名是区分大小写的,比如abc跟aBc是两个不同的文件名,而在Windows系统中,是不区分大小写的,也就是说abc跟aBc会当做同一个文件。
    • 一行命令输入完成,使用回车键执行。命令行功能十分强大,往往也没有图形界面中很多的警告提示,所以一行命令输入完成,要养成习惯仔细检查无误,再敲回车键执行,因为很多操作即使错误,也是无法撤销的。
  • 执行命令:
    ffmpeg -ss 01:12 -t 02:15 -i GoodMovie.mp4 -c copy keepPart1.mp4
    

    下面对这行命令做一个详细的解释:

    • ffmpeg代表使用ffmpeg软件包的基本命令,其后那么多内容,都是执行ffmpeg的参数,命令和参数之间,及参数和参数之间都使用空格键隔开。
    • -ss 01:12是一个参数,指的是对输入的视频,从1分12秒开始处理。-减号表示开始一个参数,ss是参数的名称,后面的01:12是参数的值,参数名跟参数值之间用空格隔开。这里要多说一句,在unix类系统中,有些参数名跟参数之间可以没有空格,直接连续写下来,但这种情况并不通用,比如ffmpeg一般就不允许直接连写。所以习惯上参数名和参数值之间直接打上一个空格会比较安全,至少99%的软件都不会有问题。
    • -t 02:15表示处理从当前点开始,一直延续2分15秒长,这个当前点指的是上面-ss 01:12所指出的时间点。
    • -i GoodMovie.mp4表示要处理的文件名,也就是输入的文件名,这里只写一个文件名还说明这个文件就在当前目录,也就是上面cd命令换到的~/Desktop/medias目录。
    • -c copy参数,-c是指的编码格式(codec),copy表示剪辑处理保留原有编码设置,编码形式直接拷贝过来,不做改动。
    • 最后的keepPart1.mp4表示被处理的部分保存到哪个文件,也就是处理完输出的文件名。有一点需要注意,输出的文件名,不能跟输入的文件名相同,否则会把输入的文件,也就是你的原始音乐文件破坏掉。同理,如果输出文件名所代表的文件已经存在,那已经存在的文件也会被覆盖掉,不过还好ffmpeg会给出一个提示,告诉你目标文件已经存在,是否覆盖,并由你确定下一步的操作。但这种提示并非所有命令行软件都有,所以还是老话,养成输入完命令行仔细确认,然后再执行的习惯很重要。
    • 参数的顺序一般都是有特殊意义的,除非你确定了解,否则暂时先生硬记住这些参数顺序吧。对于新手的一个习惯,通常是完整把命令行记录到自己的笔记中,需要使用的时候,拷贝出来,根据需要修改成需要的参数,然后粘贴到命令行去执行。
  • 如果需要剪出多段,应当重复上面命令多次,保存出来多个剪辑的文件,当然保存出来的多个剪辑记住一定要用不同的文件名。

接着介绍合并的操作。假设已经有两个剪辑片段,第一个文件名字叫keepPart1.mp4,第二个文件名字叫keepPart2.mp4,我们下面把两段剪辑合并在一起,合并完成后,keepPart1.mp4的内容在前,接着是keepPart2.mp4的内容:

	ffmpeg -i concat:"keepPart1.mp4|keepPart2.mp4" -c copy allPart.mp4
  • 下面来解释一下这条命令:
    • -i依然是指出输入的文件名,但这里后面不是一个确定的文件名,而是一个子命令concat:,表示后面是一组文件,用双引号引起来,其中的文件之间用|间隔,这个是键盘上回车上面的键也就是\键的第二功能键,按住shift+\可以打出来。插一句关于引号的作用,大多数参数可以不用引号,但如果这个参数比较复杂可能引起歧义,甚至比如有的文件名、路径名中包含空格,就必须使用引号把参数引起来。
    • -c copy,如上解释,编码保留原有的设置。
    • allPart.mp4,输出的文件名,注意别覆盖其它存在的文件。

好了,两个基本的剪辑功能介绍完了。你会发现,对于大多数情况,ffmpeg比通常的图形界面视频处理程序都要快很多倍。通常ffmpeg同其他专业的视频处理软件,会差在两个视频片段衔接的功能上,专业软件一般会包含很多过场转换特效,从而让两个画面的衔接更自然有趣,而ffmpeg则只是把两个片段生硬的连接在一起。

再次注意:命令行程序强大非常,很多的图形界面的软件都是基于命令行程序开发的,用于降低使用难度。而命令行程序因为缺乏易用性,所以很容易出错,而且出错了之后往往没办法补救,因此每个命令仔细检查,特别是各项参数、文件名,空格、符号、大小写都要注意。确定无误再回车执行。

(文中的操作,除非特别注明,均以macOS为例。)