首页 > 科技 > 《ffmpeg音视频》从认识到安装使用

《ffmpeg音视频》从认识到安装使用

FFMpeg是当今为的面向音视频开发的开源工程,广泛应用于多种音视频的客户端、播放器和流媒体服务器中。使用FFMpeg提供的工具和SDK,可以完成音视频的编码、解码、转码、封装、解封装、转封装、视频水印和视频缩放等多种需求的开发。

关注+私信免费领取一份99的视频学习资料哦

C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,ffmpeg,DPDK,嵌入式 等。。。

FFMPEG简介

1.1 FFMPEG定义

FFMPEG全称为fast forward moving picture expert group,读作“ef ef em peg”,MPEG为大名鼎鼎的ISO的动态图像专家组。ffmpeg的官方网站是:http://ffmpeg.org/。

套用ffmpeg官网用语来定义或者介绍FFMPEG:

“FFmpeg is the leading multimedia framework to decode, encode, transcode, mux, demux, stream, filter and play. It supports the most obscure ancient formats up to the cutting edge. No matter if they were designed by some standards committee, the community or a corporation. It is also highly portable: FFmpeg compiles, runs, and passes our testing infrastructure FATE across Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris, etc. under a wide variety of build environments, machine architectures, and configurations.”

FFMPEG是领先的多媒体框架,提供了音视频的编码,解码,转码,封装,解封装,流,滤镜,播放等功能。它几乎支持所有的音视频格式,不管是标准委员会,社区,还是公司设计的。它是高度可移植,跨平台的:可以在Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris等系统上,在各种不同的编译环境,机器架构,配置下编译,运行,并通过测试。

1.2 FFMPEG历史

2000年, FFMPEG由法国天才程序员Fabrice Bellard开发出初版;

2004年,Michael Niedermayer接手并维护至今,其将滤镜子系统libavfilter加入FFMPEG项目中,使得FFMPEG处理多媒体更加多样化,更加方便;

2011年,FFMPEG项目的一些提交者对项目管理方式不满,构建了另外一个新项目Libav

2015年8月,Michael Niedermayer主动辞去FFMPEG项目负责人职务,在之前的这几年中,其从Libav项目中移植了大量代码和功能到FFMPEG中,其辞职的主要目的是希望两个项目最终能合并在一起发展。

2019年,当前由于越来越多的人使用并参与到FFMPEG代码贡献中,其发展越来越快,当前版本(20190217)已经是4.1

1.3 FFMPEG的影响范围

因为FFMPEG本身是开源项目,并且在LGPL/GPL协议下发布的任何人都可以自由使用,但必须严格遵守LGPL/GPL协议,其被很多开源的项目或者非开源的项目所使用:

1. FMPEG作为内核视频播放器:

ijkplayer,VLC,Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...

2. FFMPEG作为内核的转码工具:

ffmpeg,格式工厂...

3. FFMPEG作为内核的Directshow Filter:

fdshow,lav filters...

4. 其他知名软件:

微信,钉钉,Google Chrome...

1.4 FFMPEG组成

官网介绍FFMPEG是一个多媒体框架,其包含了多个模块库:AVFormat,AVCodec,AVFilter,AVDivice,AVUtil等,并且提供了基于这些库的三个命令行工具: ffmpeg,ffplay,ffprobe。

使用ffmpeg的方式分为两种:一种方式是直接使用ffmpeg提供的这三个命令行工具来进行多媒体处理;另一种是使用ffmpeg封装的这些库进行二次开发。

以下分别对各模块库的功能进行简单的介绍。

1.4.1 AVFormat

AVFormat中实现了当前多媒体领域中绝大多数媒体封装格式,此处分装应明确说明为流媒体网络协议封装以及音视频容器封装。具体地,支持RTMP,RTSP,MMS,HLS等流媒体网络协议;支持MP3,MP4,FLV,MKV,TS等基本上你能想到媒体文件封装格式。并且还可以根据实际需求,对媒体封装格式进行扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块,并重新编译即可。

1.4.2 AVCodec

AVCodec中实现了目前多媒体领域中绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec处理支持MPEG4,AAC,MJPEG等自带的媒体编码格式外,还支持第三方的编解码器。比如支持H.264/AVC编解码,需要使用x264编解码器;支持H.265/HEVC编码,需要使用x265编解码器;mp3编码,需要使用libmp3lame编解码器。进一步如果需要增加自己的编码格式,或者是硬件编解码,则需要在AVCodec中增加相应的编解码器。

1.4.3 AVFilter

AVFilter提供了一个通用的音频,视频,字幕等滤镜处理框架。具体的,将在后续FFMPEG命令行工具使用中介绍滤镜功能。

1.4.4 AVDevice

AVDevice包含音视频采集和渲染相关的输入输出设备接口,兼容多数的通用多媒体输入/输出软件框架,比如Video4Linux, Video4Linux2, VfW, and ALSA。

1.4.5 AVUtil

这个库提供的是基本的工具,提供给其他库来使用,比如文件操作,时间操作,md5 sha加密方法等等。

1.4.6 swscale

FFMPEG的视频图像转化计算模块,提供了高级别的图像转换API, 比如进行图像缩放和像素格式转换,将图像从1080p转换成720p或480p,或者将图像从yuv420p转换成yuyv,或者yuv转rgb等图像格式转换。

1.4.7 swresample

FFMPEG的音频转换计算模块,提供了高级别的音频重采样API。比如操作音频采样,音频通道布局转换与布局调整。

使用 FFmpeg 进行音视频操作

1. FFmpeg 发展历史及它用来解决什么问题

FFmpeg 项目最初是由 Fabrice Bellard 发起,从 2004 年起由 Michael Niedermayer 领导进行维护。许多 FFmpeg 的开发者同时也是 MPlayer 项目的成员,FFmpeg 在 MPlayer 项目中是被设计为服务器版本进行开发。

2011 年 3 月 13 日,FFmpeg 部分开发人员决定另组 Libav,同时制定了一套关于项目继续发展和维护的规则。

FFmpeg 的名称来自 MPEG 视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换,还有流媒体服务等诸多功能,可以说涵盖了音视频开发中绝大多数的领域。

2. FFmpeg 主要模块和基础知识简介

FFmpeg 主要模块:

AVUtil:核心的工具库AVDevice:输入输出设备库AVFormat:封装格式生成和解析AVCodec:编解码库AVFliter:音视频过滤器swresample:音频重采样模块swscale:图像数据格式转换模块

基础知识:

  • 容器一种文件格式,例如 FLV、MKV、MP4 等,是传输视频信息的一种方式。它包括五种流:音频、视频、字幕、附件、数据帧。帧代表静止的图像,分别有 I 帧、P 帧、B 帧。
  • 编解码器:对视频进行压缩,解压缩。复用/解复用,它的本质就是把不同的流按照某种容器规则放入容器中,这种行为叫做复用。把不同的流从容器中解析出来叫做解复用。
  • 音视频常用网络协议有 RTSP、RTP、RTCP、HTTP、RTMP 等。
  • 音频常用封装格式 AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV 等。
  • 视频常用编解码格式有 H.264、MPEG-4、MPEG-2、VP8、VP9、VC-1 等。

FFmpeg 编码和封装流程和编码封装格式以及推流协议:

3. 音视频解码和音视频重采样

重采样流程:

视频经过打包和压缩编码,更加方便传输。得到视频后需要解复用,解压和解码得到原始的音频和视频,才可以播放或者重采样。下面一起来学习调用 FFmpeg API 进行音频重采样。

上图为音频重采样调用 FFmpeg API 的流程,图中也注释了每个 API 的作用,接下来会详细介绍每个 API 的使用。

首先介绍图中第一个 API 它的定义如下:

第一个参数是一个 AVFormatContext 指针变量的地址第二个参数是文件的位置或者网络视频地址后两个参数分别用于指定特定的输入格式以及指定文件打开额外参数的 AVDictionary 结构,可设置为 NULL

API 内部函数调用关系如下图所示:

绝大部分初始化的工作由 init_input () 完成,read_header () 是用来读取多媒体数据,文件头,根据视音频流创建相应的 AVStream。

  • av_probe_input_format2() 根据输入数据查找合适的 AVInputFormat
  • av_probe_input_buffer2() 根据输入的媒体数据推测该媒体数据的 AVInputFormat
  • AVInputFormat 表示输入文件的容器的格式

av_open2() 内部函数调用关系如图所示:

上图为内部函数调用的关系,简单来说 av_open2() 就是完成具体协议的读写任务。

接下来调用了 API:avformat_find_stream_info() 获取文件中的流信息。第二个 API 会读取音视频 packet,并确定文件中所有的流信息。

找出音视频流中的音频流:

今天就更新到这里吧 写想到不到的地方大几可以留下宝贵意见,还有大家记得关注哦 我会明天更新我们一起交流学习,

ffmpeg的链接错误的解决方法

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/260219.html