Skip to content

zqdeveloper/ffmpeg-Android

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

前言

FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如ffmpeg,ffplay,ffprobe,来编辑你的音视频文件。 本文将简要介绍一下FFMPEG库的基本目录结构及其功能,然后详细介绍一下我们在日常工作中,如何使用ffmpeg提供的工具来处理音视频文件。

FFMPEG 目录及作用

libavcodec: 提供了一系列编码器的实现。

libavformat:实现了流协议,容器格式及基本IO访问。

libavutil:包括了hash器,解码器和各类工具函数

libavfilter:提供了各种音视频过滤器

libavdevice:提供了访问捕获设备和回放设备的接口

libswresample:实现了混音和重采样

libswscale:实现了色彩转换和缩放功能。

FFMPEG基本概念

在说ffmepg命令之前,我们先要介绍一些音视频格式的基本概念

音/视频流

在音视频领域,我们把一路音/视频成为一路流。如我们小时候经常看的VCD,在里面可以选择粤语或者国语声音,其实就是CD视频文件中存放了两路音频流,用户选择其中一路进行播放。

容器

我们一般把MP4、FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以MP4为例,就可以存放一路视频流,多路字幕流。

channel

channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道、双声道和立体声。

FFMPEG命令

我们安装使用的目的可以将FFMPEG命令分成一下几类:

  • 基本信息查询命令
  • 录制
  • 分解/复用
  • 处理原始数据
  • 滤镜
  • 切割与合并
  • 图/视转换
  • 直播相关

除了FFMPEG的基本信息查询命令外,其它命令都桉下图所示的流程处理音视频 image.png 然后将编码的数据包传送给解码器(除非为数据流选择了流拷贝,请看进一步描述)。解码器产生未压缩的帧(原始视频/PCM音频/...),可以通过滤波进一步处理(见下一节)。在过滤之后,帧被传送到编码器,编码器并输出编码的数据包,最后,这些传递给复用器,将编码的数据包写入输出文件。 默认情况下,ffmpeg只包含输入文件中每种类型(视频、音频、字幕)的一个流,并将其添加到每个输出文件中,它根据一下标准挑选每一个的‘最佳’:对于视频,它是具有最高分辨率的流;对于音频:它是具有最多channel的流,对于字幕,是第一个字幕流。在相同类型的几个流相等的情况下,选择具有最低索引的流。 您可以通过-vn/-an/-sn/-dn选项来禁用某些默认配置。要进行全面的手动控制,请使用-map选项,该选项禁用刚描述的默认值。下面我们就来详细介绍一下这些命令。

基本信息查询命令

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

-version 显示版本。

-formats 显示可用的格式(包括设备)

-demuxers 显示可用的demuxers.

-muxers 显示可用的muxers.

-devices 显示可用的设备

-codecs 显示libavcoder已知的所有编解码器。

-decoders 显示可用的解码器

-encoders 显示可用的编码器

-bsfs 显示可用的比特流filter.

-protocols 显示可用的协议

-filters 显示可用的采样格式

-pix_fmts 显示可用的像素格式

-layouts 显示channel名称和标准channel布局。

-colors 显示识别的颜色名称

命令基本格式及参数

下面是FFMPEG的基本命令格式: ffmpeg[global_options]{[input_file_options] -i input_url} ... {[output_file_options]output_url} ... ffmepg通过-i选项读取任意数量的输入“文件”(可以是常规文件,管道,网络流,抓去设备等,并写入任意数量的输出“文件)。 原则上,每个输入/输出 ”文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。流的数量和/或类型是由容器格式来限制。选择从哪个输入进入到哪个输出将自动完成或使用-map选项。 要引入选项中的输入文件,您必须使用他们的索引(从0开始)。例如:第一个输入文件是0,第二个输入文件是1,等等。类似地,文件内的流被他们的索引引用。例如:2:3是指第三个输入文件中的第四个流。 上面就是FFMPEG处理音视频的常用命令,下面是一些常用参数:

主要参数

-f fmt(输入/输出)强制输入或输出文件格式。格式通常是自动检测输入文件,并从输出文件的文件扩展名中猜测出来,所以在大多数情况下这个选项是不需要的。

-i url(输入) 输入文件的网址

-y(全局参数)覆盖输出文件而不询问

-n(全局参数)不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出,

-c[:stream_specifier]codec(输入/输出,每个流)选择一个编码器(当在输出文件之前使用)或解码器(当前文件之前使用时)用于一个或多个流。codec是解码器/编码器的名称或copy(仅输出)以指示该流不被重新编码。如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT