本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10297002.html
本文介绍FFmpeg最基础的概念,了解FFmpeg的简单使用,帮助理解FFmpeg工程源码。内容主要节选和翻译自书籍《FFmpeg Basics》及官网文档“Documentation-ffmpeg”和“Documentation-ffmpeg-all”。
1. 概述
FFmpeg是一款用于多媒体处理的自由软件工程,基于GPL许可证发布。FFmpeg提供的最核心的命令行工具是ffmpeg
,ffmpeg
命令行工具的主要特征是输出快速、高品质、文件尺寸小。“FFmpeg”中“FF”表示“Fast Forward”,“mpeg”表示“Moving Pictures Experts Group”。
FFmpeg提供如下四个命令行工具:
– ffmpeg 音视频编码器/解码器
– ffplay 媒体播放器
– ffprobe 显示媒体文件信息
– ffserver 多媒体流广播服务器,使用HTTP和RTSP协议。FFmpeg 4.1版本已经删除ffserver,新的替代者还未添加进来。
FFmpeg提供如下软件开发库:
– libavcodec 多媒体编解码器库
– libavdevice 设备库
– libavfilter 滤镜库
– libavformat 媒体格式库
– libavutil software library containing various utilities
– libpostproc 后处理库
– libswresample 音频重采样库
– libswscale software library for media scaling
2. 命令行格式
命令行基本格式为:
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
格式分解如下:
ffmpeg
global_options
input1_options -i input1
input2_options -i input2
...
output1_options output1
output2_options output2
...
ffmpeg
读取任意数量的输入“文件”(可以是常规文件、管道、网络流、录制设备等,由“-i”选项指定),写入任意数量的输出“文件”。命令行中无法被解释为选项(option)的任何元素都会被当作输出文件。
每个输入或输出文件,原则上都可以包含任意数量的流。FFmpeg中流的类型有五种:视频(video)、音频(audio)、字幕(subtitle)、附加数据(attachment)、普通数据(data)。文件中流的数量和(或)流类型种数的极限值由文件封装格式决定。选择哪一路输入的哪一路流输出到哪一路输出,这个选择过程既可以由FFmpeg自动完成,也可以通过“-map”选项指定(后续“Stream selection”章节会深入描述)。
注:关于附加数据(attachment)和普通数据(data)的说明如下:
Attachments could be liner notes, related images, metadata files, fonts, etc.
Data tracks would be for things like timecode, navigation items, cmml, streaming tracks.
参考资料[3] “What are the the data and attachment stream type?”
命令行中的输入文件及输入文件中的流都可以通过对应的索引引用,文件、流的索引都是从0开始。例如,2:3表示第3个输入文件中的第4个流。(后续“Stream specifiers”章节会详细描述)。
一个通用规则是:输入/输出选项(options)作用于跟随此选项后的第一个文件。因此,顺序很重要,并且可以在命令行中多次指定同一选项。每个选项仅作用于离此选项最近的下一输入或输出文件。全局选项不受此规则限制。
不要把输入文件和输出文件混在一起———应该先将输入文件写完,再写输出文件。也不要把不同文件的选项混在一起,各选项仅对其下一输入或输出文件有效,一个选项不能跨越一个文件传递到后续文件。
举几个命令行例子:
- 设置输出文件码率为64kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
其中“-b:v 64k”和“-bufsize 64k”是输出选项。 - 强制输入文件帧率(仅对raw格式有效)是1fps,输出文件帧率为24fps:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
其中“-r 1”是输入选项,“-r 24”是输出选项。 - 转封装:将avi格式转为mp4格式,并将视频缩放为vga分辨率
ffmpeg -y -i video.avi -s vga video.mp4
其中“-y”是全局选项,“-s vga”是输出选项。
3. 转码过程
_______ ______________
|