[TOC]
FFMPEG 目录及作用
Libavcodec: 提供了一系列编码器的实现
libavformat: 实现在流协议,容器格式及基本io访问。
libavutil:包括了hash器,解码器和各例工具函数。
libavfilter:提供了各种音视频过滤器。
libavdevice:提供了访问捕获设备和回放设备的接口
libswresample:实现了混音和重采样
libswscale:实现色彩转换和缩放功能
FFMPEG基本概念
在讲解FFMPEG命令之前,我们首先要介绍一些音视频的基本概念
音/视频流
在音视频领域,我们把一路音/视频称为一路流。如我们小时候经常使用VCD看港片,在里面可以选择粤语和过于声音,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。
容器
我们一般吧MP4,FLV,MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以MP4为例,就可以存放一路视频流,多路视频流,多路字幕流。
channel
channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。
FFMPEG命令
我们按使用目的可以将FFMPEG命令分成以下几类:
基本形象查询命令
录制
分解/复用
处理原始数据
滤镜
切割与合并
图/视互换
直播相关
处理FFMPEG 的基本形象查询命令外,其它命令都按下图所示的流程处理音视频。
…省略了一些
基本形象查询命令
FFMPEG 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的ffmpeg都支持哪些filter,就可以用ffmpeg -filters来查询。详细参数说明如下:
-version 显示版本
-formats 显示可以用的格式(包括设备)。
-demuxers 显示可以用的demuxers. //分流器
-muxers 显示可用muxers //混合器
-devices 显示可用的设备
-codecs 显示libavcodec已经的所有编解码器
-decoders 显示所有可用的解码器。
-encoders 显示所有有用的编码器
-bsfs 显示可用的比特流filter。
-protocols显示可用的协议
-filters 显示可用的libavfilter过滤器。
-pix_fmts 显示可用的像素格式
-sample_fmts 显示可用的采样格式
-layouts 显示channel名称和标准的channel布局.
-colors 显示识别的颜色名称。
接下来介绍的是ffmpeg 处理音频时使用的名利格式和参数。
命令基本格式及参数
下面是ffmpeg的基本命令格式:
ffmpeg [global_options] {input_file_options -i i input_url} …
{[output_file_options] output_url}
ffmpeg 通过 -i 选项读取输入的任意数量的输入 “文件” (可以是常规文件,掼蛋哦,网络流,抓取设备等),并写入任意数量的输出“文件”。
原则上,每个输入/输出“文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。流的数量和/或类型是有容器格式来限制。选择从哪个输入进入到那个输出将自动完成或使用 -map 选项。
主要参数
-f fmt(输入/输出) 强制输入和输出文件格式。格式通常是自动检测输入文件。并从输出文件的文件扩展名中猜测出来,所以在大多数情况下这个选项是不需要的。
-i url (输入) 输入文件的网址
-y (全局参数)覆盖输出文件而不询问。
-n (全局参数)不要覆盖输出文件,如果指定的输出文件以及存在,请立即退出。
-c [: stream_specifier] codec (输入/输出, 每个流) 选择一个编码器(当输出文件之前使用)或者解码器(当在输入文件之前使用是)用于一个或多个流。codec是解码器/编码器的名称或copy(仅输出)以指示该流不被重新编码。如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
-codec [: stream_specifier] codec 同 -c
-t duration (输入/输出)当用做输入选项(在-i之前)时,限制冲输入文件读取的数据的连续时间。当用作输出选项是(在输出url之前),在持续时间之后停止输出
-ss 位置(输入/输出)当用作输入选项时(在-i之前),在这个输入文件中寻找位置。请注意,在大多数格式中,不可能精确搜索。请注意,在大多数格式中,不可能精确搜索,因此ffmpeg将在位置之前寻找最近的搜索点。当解码和-accurate_seek被启用时(默认),搜索点和位置之间的这个额外的分段将被解码和丢弃。当进行流式复制或使用-noaccurate_seek时,它将被保留。当用作输出选项(在输出url之前)时,解码单丢失输入,直接时间戳到达位置。
-frames [: stream_specifier] framecount (out,per-stream) 停止在帧计数之后写入流。
-filter [:stream_specifier] filtergraph …// todo