二、视频编解码基础知识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二、视频编解码基础知识相关的知识,希望对你有一定的参考价值。
参考技术A图像信息经采集后生成的原始视频数据,数据量非常大,对于某些采集后直接本地播放的应用场合,不需要考虑压缩技术。但现实中更多的应用场合,涉及视频的传输与存储,传输网络与存储设备无法容忍原始视频数据的巨大数据量,必须将原始视频数据经过编码压缩后,再进行传输与存储。
(1)未经压缩的数字视频的数据量巨大
(2)存储困难,如:一张DVD只能存储几秒钟的未压缩数字视频
(3)传输困难,如:1兆的带宽传输一秒的数字电视视频需要大约4分钟,720p RGB 15帧每秒码率计算: 1280 x 720 x 3 x 15 ≈ 41MB ≈ 331Mb
将视频数据中的冗余信息去除,寻找像素之间的相关性,还有不同时间的图像帧之间的相关性。
视频编码 是压缩和可能改变视频内容格式的过程,有时甚至将模拟源更改为数字源。在压缩方面,目标是减少占用空间。这是因为它是一个有损的过程,会抛弃与视频相关的信息。在解压缩以进行回放时,创建原始的近似值。应用的压缩越多,抛出的数据越多,近似值与原始数据相比越差。
视频编解码器是通过软件或硬件应用程序完成的视频压缩标准。编解码器,如:H.264,VP8,RV40以及其他标准或更高版本(VP9)
注:音频编解码器,如:LAME / MP3,Fraunhofer FDK AAC,FLAC等。
根据已经编码好的块信息得到一个预测值,这样只需要编码实际值与预测值之间的差异即可。
空间冗余的消除:
帧内预测:根据同一帧中相邻已编码好的块信息得到预测数据,编码差异数据
时间冗余的消除:
帧间预测:根据已编码帧中的块信息得到预测数据,编码差异数据
I 帧:仅采用帧内压缩技术,压缩效率最低,编解码无需用到其他帧的信息,是GOP的起始点。
P 帧:前向预测帧,编解码只参考前一个帧,可作为其他图像编码时的参考帧,属帧间压缩技术。
B 帧:双向预测帧,编解码既参考前一帧也可参考后一帧,压缩效率最高,复杂度高,时延较大,属帧间压缩技术。
GOP(group of pictures)一般指两个I帧之间的间隔帧数,两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。
H.264 原始码流(⼜称为 裸流),是由⼀个接⼀个的 NALU 组成的,而它的功能分为两层:视频编码层VCL 和 网络提取层NAL。
VCL负责有效表示视频数据的内容。
H264除了实现了对视频的压缩处理之外,为了方便网络传输,提供了对应的视频编码和分片策略;类似于网络数据封装成IP帧,在H264中将其称为组(gop)、片(slice)、宏块(Macroblock)这些一起组成了H264的码流分层结构;H264将其组织成为序列(GOP)、图片(pictrue)、片(Slice)、宏块(Macroblock)、子块(subblock)五个层次。
宏块:视频编码的基本单元,h264通常宏块大小为16x16个像素,所以编码器一般会对图像的宽 高有要求,需要为16的倍数。
Slice:条带,图像的划分,一帧图像可编码成一个或者多个条带,每条带包含整数个宏块。
SPS: 序列参数集,包含应用于完整视频序列的语法元素,比如图像宽,高等。
PPS: 图像参数集,包含应用于编码图像的语法元素,比如量化参数,参考帧列表大小等。
NAL定义了数据封装的格式和统一的网络接口,负责格式化VCL数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。
NAL基本单元为NALU,每一个NALU包含一个字节的头信息和其后的负载数据。
参考文档
https://zhuanlan.zhihu.com/p/31056455
https://blog.csdn.net/knowledgebao/article/details/86716428
重点链接:NAL/NALU详解可以查阅:
https://www.jianshu.com/p/1b3f8187b271
http://www.wendangku.net/doc/039e95757fd5360cba1adb46.html
附上几篇文章:
https://blog.csdn.net/knowledgebao/article/details/86716428
https://zhuanlan.zhihu.com/p/31056455
https://www.jianshu.com/p/0c296b05ef2a
android平台市面上大部分的芯片厂商的硬编硬解都适配,例如:高通,三星Exynos,联发科,海思等;windows平台上支持Intel qsv硬编硬解。
分辨率:(矩形)图片的长度和宽带,即图片的尺寸。影响图像大小,与图像大小成正比;分辨率越高,图像越大;分辨率越低,图像越小。
分辨率是指视频画面横向和纵向被切分成多少块。
区别 1080P , 3MP ,4K
P 720P 、1080P 表示的是"视频像素的总函数" ,\' P \' (Progressive的缩写)表示的是"逐行扫描"
K 2K 、4K 等是表示 "视频像素的总列数" ,4K表示的是视频有4000列的像素数,具体是3840列或4096列。
MP 代表的是像素总数,指像素的行数(P)与列数(K)相乘后的一个结果(百万像素)。
帧率 是指每秒图像的数量,一帧代表的就是一副静止的画面,连续的帧就形成了动画。影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。
码率 指编码器每秒编出的数据大小,单位是kbps 。
视频文件在单位时间内使用的数据流量,指把每秒显示的图片进行压缩后的数据量。影响体积,与体积成正比:码率越大,体积越大,码率越小,体积越小。(体积=码率X时间)
压缩前的每秒数据量 = 帧率 x 分辨率(单位是字节)
压缩比 = 压缩前的每秒数据量 / 码率(对于同一视频源并采用同一种视频编码算法,压缩比越高,画面质量越差)
清晰度
在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。
在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
好文章理解分辨率、帧率和码率三者之间的关系: https://blog.csdn.net/qq_39759656/article/details/80701965
都看到这里了,点个赞呗 0.0
视频编解码的理论和实践2:Ffmpeg视频编解码
近几年,视频编解码技术在理论及应用方面都取得了重大的进展,越来越多的人想要了解编解码技术。因此,网易云信研发工程师为大家进行了归纳梳理,从理论及实践两个方面简单介绍视频编解码技术。
相关阅读推荐
《视频编解码的理论和实践1:基础知识介绍》
1、Ffmpeg介绍
《视频编解码的理论和实践1:基础知识介绍》介绍了视频编码的基础知识,本篇文章,我们一起看看实际应用中的视频编码是如何操作的。
在实际工程项目中,ffmpeg是应用最多的多媒体处理框架,它提供了音视频采集、编解码、图像处理,格式转换等功能,并且拥有很强的扩展能力,通过ffmpeg可以很容易集成第三方库(例如:x264、openh264等),通过这种能力,它可以实现更强大的功能。Ffmpeg由下面几个部分构成:
Libavformat:音视频格式处理
Libavcodec:音视频编解码
Libavfilter:音视频滤镜
Libavdevice:音视频设备采集
Libswscale:图像缩放、转换
Libswresample:音频重采样
Ffmpeg:一个命令行的转码工具
Ffplay:一个命令行播放器
Ffprobe:简单的媒体格式分析工具
2、Ffmpeg视频编码
视频编码是ffmpeg提供的基本功能之一,通过ffmpeg可以很容易实现视频编码操作。使用ffmpeg进行视频编码之前需要把x264、openh264等第三方编解码库集成到ffmpeg中才能使用。编码步骤如下:
(1) 注册编码器
(2) 根据名字或者ID查找你想使用的编码器(例如x264、x265、openh264等)
(3) 创建一个编码器上下文对象
(4) 在编码器上下文对象中设置编码器参数
(5) 打开编码器
(6) 读取一帧图像进行编码,一直重复该过程,直到处理结束
(7) 关闭编码器
示例代码如下:
avcodec_register_all(); // 注册所有可用的编码器
codec = avcodec_find_encoder_by_name(“libx264”); // 查找编码器
ctx = avcodec_alloc_context3(codec); // 创建编码器上下文
ctx->width = 1280; // 设置编码器参数
ctx->height = 720;
// ….其他的参数设置
avcodec_open2(ctx, codec, NULL); // 打开编码器
while(read_frame(frame)){
AVPacket pkt; // 存放编码之后的数据
int got_output = 0; // 是否成功编码得到一个图像
avcodec_encode_video2(ctx, &pkt, frame, &got_output); // 编码
if(got_output){
// 得到编码后的数据,进行后续操作
}
}
avcodec_free_context(&ctx); // 关闭编码器
可以看到,ffmpeg隐藏了大部分的编码细节,调用者不需要了解预测、变换、量化、熵编码等细节,这些细节都已经被ffmpeg封装好了,开发者只要把编码参数设置好,然后调用相关的接口函数,即可实现视频编码功能。当然,这知识最基本的编码功能,要想在画面质量和压缩率之间取得平衡,必须了解视频编码的细节,然后设置相应的参数
3、Ffmpeg视频解码
Ffmpeg自带了H264的视频解码器,开发者可选择直接使用ffmpeg自带的H264解码器或者第三方的解码库进行视频解码。和视频编码一样,解码操作的大部分细节都已经被ffmpeg隐藏起来了,开发者只需要设置好相关的解码参数,然后调用接口函数就可以实现解码功了。解码流程如下:
(1) 注册解码器
(2) 查找解码器
(3) 创建解码器上下文对象
(4) 设置解码参数
(5) 打开解码器
(6) 读取数据进行解码,直到结束
(7) 关闭解码器
代码示例如下:
avcodec_register_all(); //注册解码器
codec = avcodec_find_decoder_by_name(“h264”); // 查找解码器
ctx = avcodec_alloc_context3(codec); // 创建解码器上下文对象
//…设置解码参数
avcodec_open2(ctx, codec, NULL); // 打开解码器
while(read_packet(pkt)){
AVFrame frame; // 存放解码之后的图像数据
int got_frame = 0;
avcodec_decode_video2(ctx, frame, &got_frame, pkt); // 解码
if(got_frame){
// 解码得到一帧图像,进行后续操作…
}
}
avcodec_free_context(&ctx); // 关闭解码器
可以看到ffmpeg是个非常强大的多媒体处理框架,通过ffmpeg我们可以很容易进行音视频方面的处理。上面介绍的只是ffmpeg的冰山一角,要想熟练使用ffmpeg,必须花很多时间去熟练使用它。
更多即时通讯、音视频技术的干货文章,请关注网易云信博客。
以上是关于二、视频编解码基础知识的主要内容,如果未能解决你的问题,请参考以下文章