一、介绍
文章最后有福利
是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库,为了保证高可移植性和编解码质量,里很多code都是从头开发的。
框图如图所示:
二、编解码基础知识
(1)封装格式
所谓封装格式是指音视频的组合格式,例如最常见的封装格式有mp4、mp3、flv等。简单来说,我们平时接触到的带有后缀的音视频文件都是一种封装格式。
(2)编码格式
以mp4为例,通常应该包含有视频和音频。视频的编码格式为,音频的编码格式为PCM。再以编码格式为例。我们知道通常图像的显示为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)注册组件
//注册和初始化封装器和网络设备
(2)打开文件和创建输入设备
表示一个封装器,
在读取多媒体文件的时候,它负责保存与封装和编解码有关的上下文信息。
(3)遍历流并初始化解码器
封装器中保存了各种流媒体的通道,通常视频通道为0,音频通道为1。
除此以外可能还包含字幕流通道等。
第2步和第3步基本就是打开多媒体文件的主要步骤,
解码和转码的所有参数都可以在这里获取。
接下来我们就需要循环进行读取、解码、转码直到播放完成。
(4)读取压缩数据
/*之所以称为压缩数据主要是为了区分和两个结构体。
表示一幅经过了关键帧或过渡帧编码后的画面,
表示一个经过解码后的完整YUV画面*/
(5)解码
(6)视频转码
// 720p输出标准
/*
这里需要解释一下 * * 4计算理由:
720p标准的视频画面包含720 * 480个像素点,
每一个像素点包含了RGBA4类数据,每一类数据分别由1个byte即8个bit表示。
因此一幅完整画面所占的大小为 * * 4。
(7)音频转码
四、代码地址
基于qt的客户端(Linux版本):
服务端可采用服务器 ,参考博文:
零 背景知识
本章主要介绍一下都用在了哪里(在这里仅列几个我所知的,其实远比这个多)。说白了就是为了说明:是非常重要的。
使用作为内核视频播放器:
使用作为内核的 :
使用作为内核的转码工具:
事实上,的视音频编解码功能确实太强大了,几乎囊括了现存所有的视音频编码标准,因此只要做视音频开发,几乎离不开它。
1.程序的使用
项目由以下几部分组成:
1.2 谁在使用
2.如何安装
可以在、Linux还有Mac OS等多种操作系统中进行安装和使用。
分为3个版本:、 、 Dev
3.怎么使用
3.1 命令行工具的使用
3.11 .exe
用于转码的应用程序:
-i input.avi -b:v 640k .ts
具体用法参考: 参数中文详细解释
详细的使用说明(英文):
3.12 .exe
主要用于播放的应用程序
播放test.avi
ffplay test.avi
具体的使用方法可以参考:的快捷键以及选项
3.13 .exe
是用于查看文件格式的应用程序。
3.2 使用库进行开发
To Be …
高级篇
基本环境搭建及编译
的解封装基本处理
用于硬件设备解码的关键扩展数据处理
用于硬件的track mode基本控制
虚拟机安装
由于是在自己家里,不是工作环境,电脑还是装的系统,于是开始安装虚拟机,我平时一直都喜欢用这个虚拟机,上次买了新电脑后一直都没有安装,这次必须先安装上。先是安装了最新的 11 + .04,发现跑起来巨慢无比,难道是我的电脑落伍了?没有办法,也不想去折腾这个事情,还是老老实实换了一个 10.0.1 build- + -12.04.4–i386,最好跑起来还凑合。具体虚拟机和的安装过程就不详述了,网上文章一大堆。
配置并编译
下载最新版本的,目前稳定版本是-2.6.1。进入虚拟机解压:
配置
然后进行make编译,最后出现错误:
原来忽略了直接在的共享目录中,解压到Linux目录中便不会出现这个问题了。当然如果我们编译的不是共享库,而是静态库,也不会出现这个问题,因为没有Linux的链接文件。
在Linux目录下,编译成功,生成我们的动态库:
这样我们生产了我们需要的动态库和头文件。
大家可能糊涂了,我现在是在pc上编译的,不能用于嵌入式设备上。这个我知道,我也没有办法,现在我已经没有以前的那些ARM的编译环境。大家如果是在实际的交叉环境下,配置的时指定交叉编译参数,估计大概如下面的配置:
./ –=./ — — —gpl — –cross-=arm-none-linux– —cross- —os=linux –extra-=”-mcpu=arm9 -W -Wall –arith — – – -O2 -Wall” –arch= –cpu=arm9
当然这些既是根据具体的环境修改了。这里就不多说,本文只有在PC上来讲解。
总结
视频大小
ntsc:408P,对应分辨率为720*480,建议码率为
snits:对应分辨率640*480
hd720:720P,对应分辨率为1280*720,建议码率为
:1080P,对应分辨率为1920*1080,建议码率为
可变码率(VBR):动态比特率编码,指编码器的输出码率可以根据编码器输入源信号的复杂度自适应调整,目前是达到输出质量保持不变。VBR适于存储,不适合流式传输,它能有效利用有限空间。
固定码率(CBR):指编码器输出码率固定,不适合存储,CBR对于复杂内容可能没有足够码率进行编码,
帧数:每秒钟播放的图片数(fps)。高的帧率可以得到更流畅、更逼真的画面。但是帧率很大会浪费图形处理的能力,因为显示器不能以更快的速度更新,则超过刷新率的帧率就浪费掉。同一视频,统一码率情况下,帧数越多,画质越不好。因为每张画面会分担每秒有限的文件体积,如果画面越多,那么每张画面所能表现的内容越有限。一般30fps就基本流畅,50fps就有行云流水感觉,很难区分60fps与区别。
分辨率:画面大小,单位是像素。和编码率的关系:越高的分辨率,需要越高的编码率。因为图像细节多,需要文件体积大。同一码率,画面越大,图像马赛克程度越明显。
采样率:每秒钟对音频信号的采样次数,采样率越高声音还原度越高,声音越自然,单位Hz。一般音频文件采样率,即1秒钟采样44100次。低于这个值,声音会有明显损失,高于这个值,人耳难以分辨,同时会增加音频文件所占用的空间。
参考资料 :私信‘资料’可MF领取相关资料,C++、linux,
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666