尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

音视频开发之H.264 入门知识

音视频开发之H.264 入门知识 大家如果有做过音视频相关的项目那么肯定对 H.264 相关的概念了解的比较通透这里我为什么还要写这样一篇文章呢一来是为了对知识的总结二来是为了给刚入门音视频的同学一个参考。基础概念H.264又称为MPEG-4, 它是一种面向块基于运动补偿的视频编码标准是目前市面上最常用的一种视频编码格式在Android中你可以通过MediaCodec.createEncoderByType(“video/avc”)的形式来创建一个编码器也可以通过软编avcodec_find_encoder(AV_CODEC_ID_H264) / avcodec_find_encoder_by_name(“libx264”)的形式来创建一个编码器。因为该篇文章的主题是分析 H.264 码流就不再过多介绍怎么来进行编码了。现在就直接来了解一些常用概念吧。GOP两个 I 帧之间形成的一组图片就是 GOP (Group Of Picture) 的概念。I 帧I 帧又称为视频的关键帧你可以理解为它是一帧画面的完整图像可以直接拿这个 I 帧来解码特点:1、它是一个全帧压缩编码帧它将全帧图像信息进行JPEG压缩编码及传输2、解码时仅用 I 帧的数据就可以重构完整图像3、I 帧描述了图像背景和运动主体的详情4、I 帧不需要参考其它画面而生成5、I 帧是 P/B 帧的参考帧其质量直接影响到同组中以后个帧的质量6、I 帧是帧组GOP的第一帧在一组中只有一个 I 帧7、I 帧不需要考虑运动矢量8、I 帧所占数据的信息量比较大B 帧B 帧又称为双向差别帧也就是本帧与前后帧的差别大白话的意思就是要解码 B 帧不仅要拿到之前缓存的画面还要解码之后的画面通过前后画面的叠加来还原最终的画面。特点:1、B 帧是由前面的 I 帧或 P 帧和后面的 P 帧来进行预测的2、B 帧传送的是它前面的 I 帧或 P 帧和后面的 P 帧之前的预测误差及运动矢量3、B 帧是双向预测编码帧4、B 帧压缩率最高因为它只反映参考帧间运动主体的变化情况预测比较准确5、B 帧不是参考帧不会造成解码错误的扩散P 帧P 帧又称为前预测编码帧。P 帧表示的是这一帧跟之前的一个 I 或 P 帧的差别解码时需要用之前缓存的画面叠加上本帧定义的差别来生成最终画面。特点:1、P 帧是 I 帧后面相隔 1~2 帧的编码帧2、P 帧采用运动补偿的方法传送它与前面的 I 或 P 真的差值及运动矢量3、解码时必须将 I 帧中的预测值与预测误差求和后才能重构完整的 P 帧图像4、P 帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 或者 P 帧5、P 帧可以是其后面的 P 帧的参考帧也可以是其前后的 B 帧的参考帧6、由于 P 帧是参考帧所以它可能造成解码错误的扩散7、由于是差值传送所以 P 帧的压缩率比较高基本的帧概念了解的差不多了下一步我们基于代码来分析码流码流分析H.264又称为裸流是由多个NALU组成。如果NALU对应的Slice为一帧的开始那么就用 4 个 字节表示即 0x00 00 00 01 , 否则用 3 字节表示0x00 00 01。要分析H.264码流首先是从码流中搜索起始位也就是刚刚说的0x00 00 00 01 或者 0x00 00 01起始位然后在分离 NALU, 最后再解析各个字段。下面我们先来看下NALU Headertype 代表的含义:type说明0保留1非 IDR 图像中不采用数据划分的片段2非 IDR 图像中 A 类数据划分的片段3非 IDR 图像中 B 类数据划分的片段4非 IDR 图像中 C 类数据划分的片段5IDR 图像的片段6补充增强信心 SEI7SPS (序列参数集)8PPS (图像参数集)9分割符10序列结束符11流结束符12填充数据13序列参数集扩展14带前缀的 NAL 单元15子序列参数集16 - 18保留19不采用数据划分的辅助编码图像片段20编码片段扩展21 - 23保留24 - 31保留在实际开发中用的最多的也就是 1 、5 、7、8 下面我们用代码来进行分析:代码分析代码很简单就是读文件搜索起始码然后一个字节一个字节读这里直接贴结果吧如何进阶学习成体系的音视频入门进阶的资料少之又少一个刚毕业小白可能很难切入理解因为音视频中涉及大量理论知识而代码的书写需要结合这些理论所以搞懂音视频编解码等理论知识至关重要。本人也是从实习开始接触音视频项目看过很多人的文章无意中在GitHub上发现一个标星6.8K的开源项目在这里分享给大家让更多准备学习音视频的同学更快入门进阶。以下是这份开发文档的部分章节阶段一Android多媒体第1章 三种方式绘制图片第2章 AudioRecord录制PCM音频第3章 AudioTrack播放PCM音频第4章 Camera视频采集第5章 MediaExtractor MediaMuxer 实现视频的解封装与合成第6章 MediaCodec硬编解流程与实践阶段二OpenGL ES第7章 OpenGL ES 基本概念第8章 GLSL及Shader的渲染流程第9章 OpenGL ES 绘制平面图形第10章 GLSurfaceView源码解析EGL环境第11章 OpenGL ES矩阵变换与坐标系统第12章 OpenGL ES之纹理第13章 OpenGL ES 滤镜 (篇一)第14章 OpenGL ES 实时滤镜第15章 OpenGL ES粒子系统 - 喷泉第16章 OpenGL ES粒子效果-烟花爆炸阶段三:JNINDK第17章 JNI与NDK的学习和使用第18章 JNI - 引用类型、异常处理、函数注册第19章 NDK构建方式 ndk-build与cmake第20章 指针、内存模型、引用第21章 运算符重载、继承、多态、模版第22章 STL 之 容器子系列 算法第23章 算法系列 - 冒泡排序第24章 算法系列-快速排序第25章 算法系列-堆排序第26章 算法系列-选择、插入排序以及STL中sort的实现第27章 算法序列 - 二叉查找树第28章 算法序列 - 平衡二叉树第29章 算法序列 - 散列表阶段四 : FFmpeg第30章 音视频基础知识第31章 FFMPEG常用命令第32章 FFMPEG OPENSL ES实现音频解码和播放第33章 FFMPEG OPENGLES 边解码边播放视频由于篇幅限制这里只能展示部分内容朋友们如果需要这份完整版的PDF资料合集微信扫描下方CSDN官方二维码【免费获取】。小结音视频行业已经发展很多年了随着近几年移动端越来越多的音视频APP的出现将音视频推向一个高潮但是由于音视频的学习成本很高很多开发者望而却步为了跟紧时代的步伐需要的朋友可以免费获取一下上文的资料给大家破除音视频的“高门槛”希望可以共同进步。总之音视频已经强势崛起相信未来的十年一定是音视频的十年。并且将音视频技术与计算机视觉和人工智能结合将引领未来二十年。以后我将多多分享相关文章关注我不要迷路现在正是学习音视技术的最佳时机大家一定要把握住机会跟上时代的步伐让自己可以在未来大有作为。
返回列表