Android音视频开发——H264的基本概念

准备

  • ffmpeg下载:(选择红色区域的)
    http://www.ffmpeg.org/download.html
    image.png

ffmpeg常用命令

  • 播放视频
ffmpeg -i h265.mkv -vcodec hevc output.h265
  • 用ffmpeg命令将mp4视频提取h264
ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
  • 播放H264视频
ffplay -stats -f h264 out.h264
  • 提取音频
ffmpeg -i input.mp4 -acodec copy -vn  output.aac
ffmpeg -i input.mp4 -f mp3 -vn apple.mp3
ffplay -ar 48000 -channels 2 -f f32le -i output.pcm
  • 视频倒放,无音频
ffmpeg.exe -i input.mp4 -filter_complex [0:v]reverse[v] -map [v] -preset superfast reversed.mp4
  • 视频倒放,音频不变
ffmpeg.exe -i input.mp4 -vf reverse reversed.mp4
  • 音频倒放,视频不变
ffmpeg.exe -i input.mp4 -map 0 -c:v copy -af "areverse" reversed_audio.mp4
  • 音视频同时倒放
ffmpeg.exe -i input.mp4 -vf reverse -af areverse -preset superfast reversed.mp4
  • 视频裁剪
ffmpeg  -i ./input.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:05:00 ./cutout1.mp4 -y
ffmpeg  -i ./input.mp4 -vcodec copy -acodec copy -ss 00:05:00 -to 00:10:00 ./cutout2.mp4 -y
ffmpeg  -i ./input.mp4 -vcodec copy -acodec copy -ss 00:10:00 -to 00:14:50./cutout3.mp4 -y

视频文件封装格式

  • 封装格式也叫做容器
  • 将已经编码压缩好的视频轨和音频轨按照一定的格式放入到一个文件中,
  • 视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗


    image.png

封装格式

视频文件格式 视频封装格式
.avi AVI(Audio Video Interleaved)
.wmv、.asf WMV(Windows Media Video)
.mpg、.mpeg、.vob、.dat、.3gp、.mp4 MPEG(Moving Picture Experts Group)
.mkv Matroska
.rm、.rmvb Real Video
.mov QuickTime File Format
.flv Flash Video
  • 其实不管rmvb、avi、mp4还是 flv 大都由h264进行编码。
  • 当然也会有不同的 如 mpeg4 、vp9,这样比较冷门的编码。
  • 无论是h264 mpeg4 vp9 都是基于宏块的方式进行编码,原理是一样的,只不过实现的算法不一致罢了

音视频编码方式

编码的本质就是压缩数据

1、视频编码方式
  • 视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。
HEVC(H.265) MPEG/ITU-T 2013 研发中
名称 推出机构 推出时间 目前使用领域
H.264 MPEG/ITU-T 2003 各个领域
MPEG4 MPEG 2001 不温不火
MPEG2 MPEG 1994 数字电视
VP9 Google 2013 研发中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微软平台
2、 音频编码方式

音频编码的作用: 将音频采样数据(PCM 等)压缩成音频码流,从而降低音频的数据量。 常用的音频编码方式有以下几种:

名称 推出机构 推出时间 目前使用领域
AAC MPEG 1997 各个领域(新)
MP3 MPEG 1993 各个领域(旧)
WMV Microsoft Inc. 1999 微软平台
AC-3 Dolby Inc. 1992 电影

H264概述

压缩技术

H264压缩技术主要采用了以下几种方法对视频数据进行压缩。包括:

  • 帧内预测压缩,解决的是空域数据冗余问题。
  • 帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。
  • 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。
  • CABAC压缩:无损压缩技术。

如果一个场景,有一个亭子,那么上一秒和下一秒这个亭子都不会动,那就是用帧内压缩,如果下一秒亭子倒了,那么就是帧间压缩

h264视频编解码原理
编码.png

解码.png

经过压缩后的帧分为:I帧,P帧和B帧:

  • I帧:关键帧,采用帧内压缩技术(最大)。
  • P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。
  • B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧(P帧)。采用帧间压缩技术(最小)。

除了I/P/B帧外,还有图像序列GOP。

  • GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧
  • GOP说白了就是两个I帧之间的间隔


    GOP.png

1.正常播放的视频的第一帧永远是I帧
2.与I帧相似程度达到95%以上,编码成B帧
3.相似程度达到70%编码成P帧
4.码流顺序:I帧之后一定是P(I->P->B),并且一定不可能出现把后面B帧跑到前面P帧。原因是B帧放到了缓冲区
5.场景变化则会新编成一个I帧,I帧频率越高,视频文件越大

  • pts:播放顺序是按照pts进行播放,每个视频播放都不是从0开始,一般都有个默认的大小

h264块

  • 视频播放的本质实际是宏块的移动
  • 宏块包括宏块类型,宏块预测数据,残差数据
  • 划分宏块
    • 把一张图片划分成若干个小的区域,这些小的区域称之为宏块
    • H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小


      宏块.png

如上图的宏块是88,默认情况存储的是88的信息,而h264编码存储的实际是左边的信息和顶部的信息

image.png
  • 划分子块
    H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。

  • 亮度块预测


    4x4亮度块预测.png
模式 描 述
模式0(垂直) 由A、B、C、D 垂直推出相应像素值
模式1(水平) 由I、J、K、L 水平推出相应像素值
模式2(DC) 由A~D 及I~L 平均值推出所有像素值
模式3(下左对角线) 由45°方向像素内插得出相应像素值
模式4(下右对角线) 由45°方向像素内插得出相应像素值
模式5(右垂直) 由26.6°方向像素值内插得出相应像素值
模式6(下水平) 由26.6°方向像素值内插得出相应像素值
模式7(左垂直) 由26.6° 方向像素值内插得出相应像素值
模式8(上水平) 由26.6° 方向像素值内插得出相应像素值
  • 16x16亮度预测模式


    17.png
18.png
模式 描 述
模式0(垂直) 由上边像素推出相应像素值
模式1(水平) 由左边像素推出相应像素值
模式2(DC) 由上边和左边像素平均值推出相应像素值
模式3(平面) 利用线形“plane”函数及左、上像素推出相应像素值,适用于亮度变化平缓区域
  • 8×8色度块预测模式
    • 每个帧内编码宏块的8×8色度成分由已编码左上方色度像素预测而得,两种色度成分常用同一种预测模式。
    • 4种预测模式类似于帧内16×16预测的4种预测模式,只是模式编号不同。其中DC(模式0)、水平(模式1)、垂直(模式2)、平面(模式3)

1、4×4亮度子块有9种可选预测模式
2、16×16亮度块有4种预测模式
3、色度块也有4种预测模式

H264码流组成

组成码流的结构中,包含了以下几个部分,从大到小依次是:
H264视频序列,图像,片组,片,NALU,宏块,像素

H264码流组成.png

image.png

  • H264编码分层

    • NAL层(Network Abstraction Layer,视频数据网络抽象层):在网络上传输的过程中会传包,而每个包以太网是1500字节,但是H264的帧往往会大于1500个字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包后者组包都是通过NAL层去处理
    • VCL层(Video Coding Layer,视频数据编码层):对视频原数据进行压缩
  • H264码流相当于一条河流。它的起始码是0x 00 00 00 01 或者 0x 00 00 01作为分隔符。

  • 两个 0x 00 00 00 01之间的字节数据 是表示一个NAL Unit

h264编码格式

H264功能分为两层:

  • 视频编码层
  • 网络提取层

1.H264视频序列包括一系列的NAL单元,每个NAL单元包含一个RBSP。


NAL单元格式.png

2.一个原始的H.264由N个NALU单元组成
3.NALU单元由[StartCode][NALU Header][NALU Payload]三部分组成

Start Code 用于标示这是一个NALU 单元的开始,必须是"00 00 00 01" 或"00 00 01"。
4.RBSP类型 : 包括序列参数集 SPS 和 图像参数集 PPS


image.png

5.NAL Header
由三部分组成forbidden_bit(1bit)(禁止位),nal_reference_bit(2bits)(优先级,,值越大,该NAL越重要),nal_unit_type(5bits)(类型)

nal_unit_type

  • 标识NAL单元中的RBSP数据类型
  • nal_unit_type为1, 2, 3, 4, 5及12的NAL单元称为VCL的NAL单元
  • 其他类型的NAL单元为非VCL的NAL单元。
NALU类型 .png

6.NAL的解码单元的流程如下


NAL的解码单元.png
H.264码流结构图
H.264码流结构图.png
  • 起始码:
    • 如果NALU对应的Slice为一帧的开始,则用4字节表示,即0x00000001;否则用3字节表示,0x000001。

你可能感兴趣的:(Android音视频开发——H264的基本概念)