作者:leisure
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10297002.html
错误难免,逐渐完善。
本文介绍FFmpeg最基础的概念,了解FFmpeg的简单使用,帮助理解FFmpeg工程源码。内容主要节选和翻译自书籍《FFmpeg Basics》及官网文档“Documentation-ffmpeg”
1. 概述
FFmpeg是一款用于多媒体处理的自由软件工程,基于GPL许可证发布。FFmpeg提供的最核心的命令行工具是ffmpeg,ffmpeg命令行工具的主要特征是输出快速、高品质、文件尺寸小。“FFmpeg”中“FF”表示“Fast Forward”,“mpeg”表示“Moving Pictures Experts Group”。
FFmpeg提供如下四个命令行工具:
-- ffmpeg 音视频编码器/解码器
-- ffplay 媒体播放器
- ffprobe 显示媒体文件信息
-- ffserver 多媒体流广播服务器,使用HTTP和RTSP协议
FFmpeg提供如下软件开发库:
-- libavcodec software library for various multimedia codecs
-- libavdevice software library for devices
-- libavfilter software library containing filters
-- libavformat software library for media formats
-- libavutil software library containing various utilities
-- libpostproc software library for post processing
-- libswresample software library for audio resampling
-- libswscale software library for media scaling
2. 命令行格式
命令行基本格式为:ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
格式分解如下:
1 2 3 4 5 6 7 8 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”选项指定(后续“Steam 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”是输出选项。 ffmpeg -y -i video.avi -s vga video.mp4
其中“-y”是全局选项,“-s vga”是输出选项。
3. 转码过程
_______ ______________| | | || input | demuxer | encoded data | decoder| file | ---------> | packets | -----+|_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ || | | | || output | <-------- | encoded data | <----+| file | muxer | packets | encoder|________|
