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

准备

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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容