FFmpeg常用方法以及音视频基础原理

658 阅读12分钟

本文旨在通过介绍常见的ffmpeg命令行用法,帮助读者迅速掌握ffmpeg对音视频文件的操作。同时,我们将简要探讨音视频的基础原理,相信通过对音视频编解码的理解,读者将更加轻松地理解和记忆ffmpeg的命令操作。

FFmpeg 是一个开源的多媒体处理工具,以其强大的功能和广泛的格式支持而闻名。通过使用FFmpeg的命令行工具,用户可以进行音视频文件的转码、剪辑、合并等操作。其灵活性使其成为处理各种多媒体任务的理想选择。作为开源项目,FFmpeg免费提供给用户,并在不同平台上广泛应用。

安装使用: 只需要下载 FFmpeg 的压缩包,解压后将 bin 目录添加到环境变量即可。

  • 下载,随便下载一个稳定版本即可。

image.png

  • 将下载好的压缩包解压,并将对应的bin目录加入到系统环境变量中即可。

image.png

image.png

然后检查一下是否配置成功,在命令行窗口输入ffmpeg -version看看是不是正常。

image.png

初体验,例如将2s的视频剪切成1s。

// 从1s处开始裁剪
ffmpeg -ss 00:00:01 -i input.mp4 -t 00:00:03 -c:v copy -c:a copy excerpt.mp4

image.png

音视频基础原理

首先简单介绍一下音视频基础原理,一个视频文件其实就是视频流和音频流结合,随着影音摄像技术的不断发展,现在视频的分辨率越来越高,2k、4k依然成为很多人的选择,最低接受的程度想必也是1080P,那么有没有想过如果没有视频编码压缩,一个视频文件的文件大小能有多大呢?

举个例子,一个未经压缩的AVI格式的视频以每秒25帧播放,每帧画面为1024×768像素、24位彩色,且的1秒钟视频(不考虑声音占用大小),那么需要多少存储空间?计算方式:1024×768×3×25×1等于56.25MB,因此1s的720P视频原生需要的空间就有56.25M,一块硬盘存储的数据量极其有限,因此引入压缩算法就十分重要。

其中视频流有着自己的编码格式,常见的有h264、h265和mpeg-2等,音频也有独立的编码格式:mp3、aac等,这个过程就是音视频数据的压缩和编码,当有了音频流和视频流以后就需要把它们同步,封装到容器里,常见的容器格式有mp4、flv、wmv和mov等,这个过程就是视频封装。

FFmpeg处理音视频的流程

image-20231114175221600.png

  • 输入文件: 封装视频文件
  • demuxer:解封装,获取压缩编码后的数据
  • 编码数据包:压缩编码后的数据
  • decoder:数据解码,恢复成原始数据

相信有了一定的编码原理了解,理解上面ffmpeg对音视频的处理流程不是难事,这个流程非常重要,因为除了ffmpeg的基本信息查询命令外,其它命令都按这个流程处理音视频。

梳理一下上图的流程:首先需要将编码的数据包传送给解码器。 解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过滤波进一步处理。 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包。 最后,这些传递给复用器,将编码的数据包写入输出文件。

FFmpeg的帮助信息和命令格式

基本信息查询

FFMPEG 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 来查询。详细参数说明如下:

  • -version显示版本。
  • -formats 显示可用的格式(包括设备)。
  • -demuxers 显示可用的demuxers。
  • -muxers 显示可用的muxers。
  • -devices 显示可用的设备。
  • -codecs 显示libavcodec已知的所有编解码器。
  • -decoders 显示可用的解码器。
  • -encoders 显示所有可用的编码器。

接下来介绍的是 FFMPEG 处理音视频时使用的命令格式与参数。

命令基本格式及参数

下面是 FFMPEG 的基本命令格式:

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...

常用的命令行参数:

-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。

主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频

FFmpeg的常用命令

学习了大致的信息获取和命令格式,下面直接进入实战

不重新编码就能转换容器格式

可能你正在使用的某个应用只支持MOV容器格式,而你的源文件的容器格式为MP4。你可以使用Adobe Premiere Pro完成上述格式转换,但是Premiere Pro在转换时一定会重新编码,因此很耗时。而使用下面这条FFmpeg命令可以改变容器格式却不需要重新编码:

ffmpeg -i input.mp4 -c:v copy -c:a copy output.mov

命令解释:

  • -c:v copy 指定视频的编码译码器为copy,这告诉FFmpeg直接把压缩后的视频流复制到新的文件而不重新编码。
  • -c:a copy 指定音频的编码译码器为copy,这告诉FFmpeg直接把压缩后的音频流复制到新的文件而不重新编码。

转换.ts文件的容器格式

对于.ts扩展名的MPEG-2容器格式的文件,你需要增加一项命令在传输流文件中处理MPEG-2/4 ADTS头:

ffmpeg -i input.ts -bsf:a aac_adtstoasc -c:v copy -c:a copy outputfromts.mp4

命令解释:

  • -bsf:a aac_adtstoasc 处理ADTS转换。较新版本的FFmpeg会自动增加这条命令。

不重新编码就能裁剪视频

你可能需要裁剪视频中的部分内容,使用Adobe Premiere Pro来裁剪视频需要渲染以及编码,因此很耗时。而使用下面这条FFmpeg命令可以快速裁剪视频:

ffmpeg -ss 00:00:05 -i input.mp4 -t 00:00:03 -c:v copy -c:a copy excerpt.mp4

命令解释:

  • -ss 00:00:05 从视频第5秒开始裁剪。
  • -t 00:00:05 裁剪的视频时长为5秒,如果你不设置这项命令,视频会从-ss设置的开始时间一直裁剪到视频末尾。

当编码译码器设为copy时,FFmpeg会根据关键帧进行查找,因此设置的时间不会完全精准,在多数应用场景下这不会有问题,但是如果你需要精准的时间设置,你可能需要其他视频编辑器。

不重新编码就能裁剪视频

可以使用FFmpeg来裁剪视频,而无需重新编码整个视频文件。下面是一个示例命令:

ffmpeg -ss 00:00:05 -i input.mp4 -t 00:00:03 -c:v copy -c:a copy excerpt.mp4

命令解释:

  • -ss 00:00:05:从视频的第5秒开始裁剪。
  • -t 00:00:03:裁剪的视频时长为3秒。如果不设置该选项,视频将从 -ss 设置的开始时间一直裁剪到视频的末尾。
  • -c:v copy-c:a copy:这些选项指定了视频和音频流的编码器为“copy”,表示直接复制原始流,而不进行重新编码。

请注意,由于FFmpeg根据关键帧进行查找,所以设置的时间可能不会完全精确。在大多数情况下,这不会有问题,但如果你需要精确的时间设置,可能需要使用其他视频编辑工具。

转码和调整分辨率

要转码视频并调整分辨率,可以使用以下命令:

ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4

命令解释:

  • -i input.mp4:指定输入文件。
  • -vf "scale=1280:720":使用视频滤镜scale来调整分辨率为1280x720。
  • -c:v libx264:指定视频编码器为libx264,用于进行H.264编码。
  • -crf 23:设置视频的质量,数值越小表示质量越高,但文件大小也会增加。
  • -c:a aac -b:a 128k:指定音频编码器为AAC,比特率为128kbps。
  • output.mp4:指定输出文件。

根据你的需求,你可以根据需要调整分辨率、视频编码器、音频编码器和其他参数。

提取缩略图

ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 thumbnail.jpg

命令解释:

  • -i input.mp4:指定输入文件。
  • -ss 00:00:05:指定从视频的第5秒开始提取缩略图。
  • -vframes 1:指定提取的缩略图帧数为1。
  • thumbnail.jpg:指定输出的缩略图文件名。

这个命令将从视频的第5秒提取一帧作为缩略图,并保存为thumbnail.jpg

将多个视频合并

要将多个视频拼接成一个,可以使用FFmpeg的concat协议。以下是具体步骤:

  1. 创建一个文本文件,例如input.txt,将需要拼接的视频文件路径逐行写入该文件。确保这些视频文件具有相同的编解码器、分辨率和帧率。
  2. 使用以下命令将视频文件拼接在一起:
ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4

命令解释:

  • -f concat:指定使用concat协议进行拼接。
  • -safe 0:允许使用不安全的文件名,以便读取input.txt中的文件路径。
  • -i input.txt:指定输入文件为input.txt,其中包含了需要拼接的视频文件路径。
  • -c copy:表示直接复制视频和音频流,而不进行重新编码。
  • output.mp4:指定输出文件名。

这个命令将按照input.txt中视频文件的顺序将它们拼接在一起,并将结果保存为output.mp4

压缩视频文件

要使用FFmpeg压缩视频文件,可以通过调整视频编码器和压缩参数来实现。以下是一个简单的例子:

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output_compressed.mp4

命令解释:

  • -i input.mp4:指定输入文件。
  • -c:v libx264:指定视频编码器为libx264,用于进行H.264编码。
  • -crf 23:设置视频的质量,数值越小表示质量越高,但文件大小也会增加。
  • -c:a aac -b:a 128k:指定音频编码器为AAC,比特率为128kbps。
  • output_compressed.mp4:指定输出文件。

通过调整-crf参数,可以平衡视频质量和文件大小。数值越小,视频质量越高,但文件大小也越大。

单独提取视频和音频

要单独提取视频或音频,可以使用以下命令:

提取视频:

ffmpeg -i input.mp4 -c:v copy -an output_video.mp4

命令解释:

  • -i input.mp4:指定输入文件。

  • -c:v copy:表示直接复制视频流,而不进行重新编码。

  • -an:去除音频流。

  • output_video.mp4:指定输出视频文件。

提取音频:

ffmpeg -i input.mp4 -c:a copy -vn output_audio.aac

命令解释:

  • -i input.mp4:指定输入文件。
  • -c:a copy:表示直接复制音频流,而不进行重新编码。
  • -vn:去除视频流。
  • output_audio.aac:指定输出音频文件。

这两个命令分别用于单独提取视频和音频,保留其中一个流而去除另一个。通过这种方式,可以方便地分离视频和音频流。

总结

通过本文的介绍,希望能够帮助各位在开发过程中快速上手FFmpeg,并在实际应用中灵活运用其丰富的功能进行音视频处理。同时,对音视频基础原理的了解有助于深入理解FFmpeg的命令操作。

参考文章

往期年度总结

往期文章

专栏文章