音视频数据相关

视频编码H264

理论依据:参照一段时间内图像的统计结果表明,在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内。

实现策略:所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。

具体定义:在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。

H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。

一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

音频编码aac(Advanced Audio Coding

音频相关参数:

1.采样频率:每秒钟取得声音样本的次数,22050 的采样频率是常用的,44100已是CD音质,超过48000或96000的采样对人耳已经没有意义

2.采样位数:每个采样数据记录的是振幅, 采样精度取决于采样位数的大小:
        1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;
        2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;
        4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了.

3.通道数

音视频合成格式flv

因为rtmp协议所传输的视频流,就要求是flv格式。

程序从相机和麦克风捕获到音视频数据后,分别转成 aac和h264格式的音视频帧。

然后将aac和h264音视频帧合成flv格式的视频后发送到rtmp服务器。客户端就可以播放我们推的流了。

简单说来,flv的组成如下:

    flv header + script tag + video tag + audio tag + ... + video tag + audio tag

flv由 flv header 和无数的tag组成的。

flv header 内容是固定的。

一个tag就像是一个数组中的元素。是一个单独的储存了信息的数据块。

script tag 内存储了视频相关信息,如:宽高,码率,fps,文件大小,音频信息等等。

video tag 中 存储的是完整的视频压缩格式的一帧数据,如h264数据。

audio tag 中 存储的是完整的音频压缩格式的一帧数据,如 aac数据。

这样把所有数据拼接在一起,写入文件。这个文件就是flv格式。可以使用播放器播放了。


猜你喜欢

转载自blog.csdn.net/zhangbinHn/article/details/80264570