FFmpeg基础概念

 作者:leisure

本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10297002.html


错误难免,逐渐完善。

本文介绍FFmpeg最基础的概念,了解FFmpeg的简单使用,帮助理解FFmpeg工程源码。内容主要节选和翻译自书籍《FFmpeg Basics》及官网文档“Documentation-ffmpeg

1. 概述

FFmpeg是一款用于多媒体处理的自由软件工程,基于GPL许可证发布。FFmpeg提供的最核心的命令行工具是ffmpegffmpeg命令行工具的主要特征是输出快速、高品质、文件尺寸小。“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|________|       
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信