30分带你从认识FFmpeg到玩转FFmpeg

一、ffmpeg介绍

文章最后有福利

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

框图如图所示:

30分带你从认识FFmpeg到玩转FFmpeg

二、编解码基础知识

(1)封装格式

所谓封装格式是指音视频的组合格式,例如最常见的封装格式有mp4、mp3、flv等。简单来说,我们平时接触到的带有后缀的音视频文件都是一种封装格式。

(2)编码格式

以mp4为例,通常应该包含有视频和音频。视频的编码格式为YUV420P,音频的编码格式为PCM。再以YUV420编码格式为例。我们知道通常图像的显示为RGB(红绿蓝三原色),在视频压缩的时候会首先将代表每一帧画面的RGB压缩为YUV,再按照关键帧(I帧),过渡帧(P帧或B帧)进行运算和编码。解码的过程正好相反,解码器会读到I帧,并根据I帧运算和解码P帧以及B帧。并最终根据视频文件预设的FPS还原每一帧画面的RGB数据。最后推送给显卡。所以通常我们说的编码过程就包括:画面采集、转码、编码再封装。

(3)视频解码和音频解码有什么区别

FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS太低画面会感觉闪烁不够连贯,FPS越高需要显卡性能越好。一些高速摄像机的采集速度能够达到11000帧/秒,那么在播放这类影片的时候我们是否也需要以11000帧/秒播放呢?当然不是,通常我们会按照25帧/秒或者60帧/秒设定图像的FPS值。但是由于视频存在关键帧和过渡帧的区别,关键帧保存了完整的画面而过渡帧只是保存了与前一帧画面的变化部分,需要通过关键帧计算获得。因此我们需要对每一帧都进行解码,即获取画面的YUV数据。同时只对我们真正需要显示的画面进行转码,即将YUV数据转换成RGB数据,包括计算画面的宽高等。

三、代码实现

(1)注册FFmpeg组件

//注册和初始化FFmpeg封装器和网络设备

(2)打开文件和创建输入设备

AVFormatContext 表示一个封装器,

在读取多媒体文件的时候,它负责保存与封装和编解码有关的上下文信息。

(3)遍历流并初始化解码器

封装器中保存了各种流媒体的通道,通常视频通道为0,音频通道为1。

除此以外可能还包含字幕流通道等。

第2步和第3步基本就是打开多媒体文件的主要步骤,

解码和转码的所有参数都可以在这里获取。

接下来我们就需要循环进行读取、解码、转码直到播放完成。

(4)读取压缩数据

/*之所以称为压缩数据主要是为了区分AVPacket和AVFrame两个结构体。

AVPacket表示一幅经过了关键帧或过渡帧编码后的画面,

AVFrame表示一个AVPacket经过解码后的完整YUV画面*/

(5)解码

(6)视频转码

// 720p输出标准

/*

这里需要解释一下outWidth * outHeight * 4计算理由:

720p标准的视频画面包含720 * 480个像素点,

每一个像素点包含了RGBA4类数据,每一类数据分别由1个byte即8个bit表示。

因此一幅完整画面所占的大小为outWidth * outHeight * 4。

(7)音频转码

四、代码地址

基于qt的FFmpeg客户端(Linux版本):

服务端可采用LIVE555服务器 ,参考博文:

零 背景知识

本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多)。说白了就是为了说明:FFMPEG是非常重要的。

使用FFMPEG作为内核视频播放器:

30分带你从认识FFmpeg到玩转FFmpeg

使用FFMPEG作为内核的Directshow Filter:

30分带你从认识FFmpeg到玩转FFmpeg

使用FFMPEG作为内核的转码工具:

30分带你从认识FFmpeg到玩转FFmpeg

事实上,FFMPEG的视音频编解码功能确实太强大了,几乎囊括了现存所有的视音频编码标准,因此只要做视音频开发,几乎离不开它。

1.1ffmpeg程序的使用

FFmpeg项目由以下几部分组成:

  • FFmpeg视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件;
  • ffserver基于HTTP、RTSP用于实时广播的多媒体服务器.也支持时间平移;
  • ffplay用 SDL和FFmpeg库开发的一个简单的媒体播放器;
  • libavcodec一个包含了所有FFmpeg音视频编解码器的库。为了保证最优性能和高可复用性,大多数编解码器从头开发的;
  • libavformat一个包含了所有的普通音视格式的解析器和产生器的库。

1.2 谁在使用ffmpeg

  • 使用FFMPEG作为内核视频播放器:Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...
  • 使用FFMPEG作为内核的Directshow Filter:ffdshow,lav filters...
  • 使用FFMPEG作为内核的转码工具:ffmpeg,格式工厂...

2.如何安装

30分带你从认识FFmpeg到玩转FFmpeg

FFmpeg可以在Windows、Linux还有Mac OS等多种操作系统中进行安装和使用。

FFmpeg分为3个版本:Static、 Shared、 Dev

  • 前两个版本可以直接在命令行中使用。包含了三个exe:ffmpeg.exe,ffplay.exe,ffprobe.exe
  • Static版本中的exe体积较大,那是因为相关的Dll都已经编译进exe里面去了。
  • Shared版本中exe的体积相对小很多,是因为它们运行的时候还需要到相关的dll中调用相应的功能
  • Dev版本用于开发,里面包含了库文件xxx.lib以及头文件xxx.h

3.怎么使用

3.1 命令行工具的使用

3.11 ffmpeg.exe

用于转码的应用程序:

30分带你从认识FFmpeg到玩转FFmpeg

ffmpeg -i input.avi -b:v 640k output.ts

具体用法参考: ffmpeg参数中文详细解释

详细的使用说明(英文):http://ffmpeg.org/ffmpeg.html

3.12 ffplay.exe

主要用于播放的应用程序

播放test.avi


ffplay test.avi

具体的使用方法可以参考:ffplay的快捷键以及选项

3.13 ffprobe.exe

ffprobe是用于查看文件格式的应用程序。

30分带你从认识FFmpeg到玩转FFmpeg

3.2 使用ffmpeg库进行开发

To Be Continue...

FFMPEG高级篇

FFmpeg基本环境搭建及编译

FFmpeg的解封装基本处理

FFmpeg用于硬件设备解码的关键扩展数据处理

FFmpeg用于硬件的track mode基本控制

虚拟机安装

由于是在自己家里,不是工作环境,电脑还是装的windows7系统,于是开始安装虚拟机,我平时一直都喜欢用VMWare这个虚拟机,上次买了新电脑后一直都没有安装,这次必须先安装上。先是安装了最新的VMWare Workstation 11 + Ubuntu14.04,发现跑起来巨慢无比,难道是我的电脑落伍了?没有办法,也不想去折腾这个事情,还是老老实实换了一个VMWare Workstation 10.0.1 build-1379776 + Ubuntu-12.04.4-alternate-i386,最好跑起来还凑合。具体虚拟机和Ubuntu的安装过程就不详述了,网上文章一大堆。

配置并编译

下载最新版本的ffmpeg,目前稳定版本是ffmpeg-2.6.1。进入虚拟机解压:

30分带你从认识FFmpeg到玩转FFmpeg

配置

30分带你从认识FFmpeg到玩转FFmpeg

然后进行make编译,最后出现错误:

30分带你从认识FFmpeg到玩转FFmpeg

原来忽略了直接在windows的共享目录中,解压到Linux目录中便不会出现这个问题了。当然如果我们编译的不是共享库,而是静态库,也不会出现这个问题,因为没有Linux的链接文件。

在Linux目录下,编译成功,生成我们的动态库:

30分带你从认识FFmpeg到玩转FFmpeg

这样我们生产了我们需要的动态库和头文件。

大家可能糊涂了,我现在是在pc上编译的,不能用于嵌入式设备上。这个我知道,我也没有办法,现在我已经没有以前的那些ARM的编译环境。大家如果是在实际的交叉环境下,配置ffmpeg的configure时指定交叉编译参数,估计大概如下面的配置:

./configure --prefix=./install --disable-static --enable-shared --enable-gpl --enable-pthreads --cross-prefix=arm-none-linux-gnueabi- --enable-cross-compile --target-os=linux --extra-cflags="-mcpu=arm9 -W -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -O2 -Wall" --arch=armv4l --cpu=arm9

当然这些既是根据具体的环境修改了。这里就不多说,本文只有在PC上来讲解。

30分带你从认识FFmpeg到玩转FFmpeg

FFmpeg总结

视频大小

ntsc:408P,对应分辨率为720*480,建议码率为1800Kbps

snits:对应分辨率640*480

hd720:720P,对应分辨率为1280*720,建议码率为3500Kbps

hd1080:1080P,对应分辨率为1920*1080,建议码率为8500Kbps

可变码率(VBR):动态比特率编码,指编码器的输出码率可以根据编码器输入源信号的复杂度自适应调整,目前是达到输出质量保持不变。VBR适于存储,不适合流式传输,它能有效利用有限空间。

固定码率(CBR):指编码器输出码率固定,不适合存储,CBR对于复杂内容可能没有足够码率进行编码,

帧数:每秒钟播放的图片数(fps)。高的帧率可以得到更流畅、更逼真的画面。但是帧率很大会浪费图形处理的能力,因为显示器不能以更快的速度更新,则超过刷新率的帧率就浪费掉。同一视频,统一码率情况下,帧数越多,画质越不好。因为每张画面会分担每秒有限的文件体积,如果画面越多,那么每张画面所能表现的内容越有限。一般30fps就基本流畅,50fps就有行云流水感觉,很难区分60fps与100fps区别。

分辨率:画面大小,单位是像素。和编码率的关系:越高的分辨率,需要越高的编码率。因为图像细节多,需要文件体积大。同一码率,画面越大,图像马赛克程度越明显。

采样率:每秒钟对音频信号的采样次数,采样率越高声音还原度越高,声音越自然,单位Hz。一般音频文件采样率44100Hz,即1秒钟采样44100次。低于这个值,声音会有明显损失,高于这个值,人耳难以分辨,同时会增加音频文件所占用的空间。

30分带你从认识FFmpeg到玩转FFmpeg

参考资料 :私信‘资料'可MF领取相关资料,C++、linux,

  • FFMPEG视音频编解码零基础学习方法
  • FFmpeg使用小记
  • FFmpeg官方文档
  • 如何在Windows上安装FFmpeg程序
  • ffmpeg教程 (一) 基本安装

第一时间获得博客更新提醒,以及更多技术信息分享,欢迎关注私信我,

1.直接帮你解答ffmpeg相关疑问c++。linux,TCP。

2.第一时间获得业内十多个领域技术文章

3.针对文章内疑点提出问题,第一时间回复你,帮你耐心解答

4.让你和原创作者成为很好的朋友,拓展自己的人脉资源


分享到:


相關文章: