写在前面

Abdullah A. Muhit等人在2012年发表的论文[1],[2]。并发布了开源H.264 matlab版的代码。笔者会就着这套源码进行分解讲解。一方面为了加强自己的理解,另一方面也给学习这套源码的同学提供参考。笔者水平有限,难免会有一些错误,请各位读者批评指正。
注:这里的代码笔者进行了一些修改,剔除了一些与编码关系不大的代码。属于伪代码。

Main 函数总览

  • 写在前面
  • 一、预操作
  • 二、设置参考帧+I帧编码(后续博客详细介绍,这里是介绍整体框架)
  • 三、比特流拼接
  • 四、设置新的参考帧,为下一次的P帧编码做准备
  • 五、P帧编码(后续博客详细介绍,这里是介绍整体框架)
  • 六、保存最终的比特流+解码
  • 七、参考文献

一、预操作

读入视频序列

obj=VideoReader('formancif.mov'); %obj 类中基本包含了一个视频的所有信息。

获取需要进行编码的视频序列mov

for k = 1 : nFrames  %获取obj类的视频序列存入movmov(k).cdata = read(Obj, k);
end

设置需要编码的GOP组

// 设置需要编码的一个GOP(group of picture)组
%% Encoding Video Paramiters
Frame_start = 1;            % I frame
Frame_end = 5;             % Following P frames
NumberOfFrames=Frame_start+Frame_end;

由于进行压缩编码的部分通常为Y分量,所以对读入的视频序列,还要转YUV。

Resize(mov,Frame_start,Frame_end,Videow,Videoh)%1色彩空间的转换,2修改大小(不是必要的)

设置最终将会输出的比特流

bitstream = '';                 % Initialize output bitstream

对比特流头部施加标记1111,代表将进行I帧编码

bitstream = [bitstream '1111'];     % Appending I-Frame header ('1111')

小节总结:
进行到此,基本有了:
1、需要进行编码的视频序列 mov 为了后续方便识别记作Seq
2、一个附加了头部信息1111的比特流 bitstream=1111
3、一个GOP组,起始帧和结束帧 Frame_start = 1; Frame_end = 5;

二、设置参考帧+I帧编码(后续博客详细介绍,这里是介绍整体框架)

由于进行编码的帧格式为 IPPP格式,也就是说第一个帧是I帧,后续的都是P帧。
所以设置第一帧参考帧X为自身:

X(:,:,1)=Seq(:,:,1) %解释一下Seq为啥是3维数组,前两位代表每个帧的像素值,最后一位代表是第几帧

进行I帧编码(这个函数下一篇博客详细介绍,这次主要从整体把握编码框架)

[Seq_r(:,:,1),bits] = encode_i_frame(Seq(:,:,1),QP);    % Encoding
%encode_i_frame函数是编码I帧的函数,
%函数内主要操作为:熵编码,残差块,预测等
%QP为质量因子
%返回的结果Seq_r为重构帧,bits为进行编码后的比特流

三、比特流拼接

将获得的bits与先前的bitstream进行拼接。

bitstream = [bitstream bits];   % Appending I-Frame bitstream

现在的bitstream是:1111bits。(bits是一堆01序列)
多提一嘴:最后进行解码,传输的也是bitsteam.
由bitstream足以还原出重构帧seq_r。

四、设置新的参考帧,为下一次的P帧编码做准备

X(:,:,1) = Seq_r(:,:,1);%用重构帧进行后续的参考

五、P帧编码(后续博客详细介绍,这里是介绍整体框架)

理解了I帧编码的整体架构,P帧编码的架构也是类似的。
由于是IPPP结构,所以后续的帧都是P帧。这里放上P帧编码部分的伪代码。

for K = 2:Frame_endk = K-1;bitstream = [bitstream '0000'];     % Appending P-Frame header ('0000')X(:,:,2) = Seq(:,:,2); % X[2]: Rnter coded Frame (P-Frames)[Seq_r(:,:,2),bits] = encode_p_frame(X,QP,ext,block_size); % Encodingbitstream = [bitstream bits]; % Appending P-Frame bitstream ('1100...')X(:,:,1) = Seq_r(:,:,2); % X[1]: Refrence Frame (for the next P-Frames)
end

六、保存最终的比特流+解码

save(‘BitStream.mat’,‘bitstream’);

解码部分就是根据bitstream与先前附加的头标记,来判断哪部分是I帧,哪部分是P帧,解码部分就是编码的逆过程。核心还是在encode_i_frame,encode_p_frame函数里面。

七、参考文献

[1] A A Muhit, M R Pickering, M R Frater and J F Arnold, Video Coding using Elastic Motion Model and Larger Blocks,IEEE Trans. Circ. And Syst. for Video Technology, vol. 20, no. 5, pp. 661-672, 2010.

[2] A A Muhit, M R Pickering, M R Frater and J F Arnold, Video Coding using Geometry Partitioning and an Elastic Motion Model,accepted for publication in Journal of Visual Communication and Image Representation.

H.264压缩技术之总览(Overview)——Matlab源码解析相关推荐

  1. H.264压缩技术之视频基础(foundation of learning video)——Matlab源码解析

    前言 为了后续能更好的理解,I帧编码与P帧编码,所以笔者先对数字视频中的一些基础概念进行铺垫.后续比较复杂的帧内预测,与帧间预测理解起来就会相对容易些. 关于Matlab中h.264的main函数部分 ...

  2. Android技术栈--HashMap和ArrayMap源码解析

    1 总览 WARNING!!:本文字数较多,内容较为完整并且部分内容难度较大,阅读本文需要较长时间,建议读者分段并耐心阅读. 本文会对 Android 中常用的数据结构进行源码解析,包括 HashMa ...

  3. MediaCoder的CUDA H.264编码技术预览及测试报告

    MediaCoder的CUDA H.264编码技术预览及测试报告 近两年NVIDIA的CUDA技术似乎成为业界新宠,其优良的科学运算加速能力确实首屈一指,引领着并行运算潮流,各行业都纷纷采用它来加速, ...

  4. Java压缩技术(五) GZIP相关——浏览器解析

    转载自   Java压缩技术(五) GZIP相关--浏览器解析 GZIP本身就是一种网络流压缩算法,而且应用相当广泛.如果网络访问过程中,其数据流较大,势必降低网络访问效率,此时就需要考虑使用压缩!当 ...

  5. 【CV/Matlab系列】基于matlab的视频质量仿真评价系统设计【含Matlab源码】

    DATE: 2020.12.20 文章目录 前言 1.代码获取方式 2.设计要求 3.视频评价系统展示 3.1.MPEG-2压缩 3.2.H.264压缩 前言 在之前毕业设计时,实现了基于matlab ...

  6. 【电力预测】基于matlab GUI灰色模型电力负荷预测【含Matlab源码 769期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab GUI灰色模型电力负荷预测[含Matlab源码 769期] 获取代码方式2: 通过订阅紫极神光博客付费专 ...

  7. 【A_star二维路径规划】基于matlab A_star算法无人机二维路径规划(起终点障碍物可设置)【含Matlab源码 1321期】

    ⛄一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[A_star二维路径规划]基于matlab A_s ...

  8. 【RRT三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 1363期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab RRT算法无人机三维 ...

  9. Android技术栈(五)HashMap(包括红黑树)与ArrayMap源码解析

    1 总览 本文会对 Android 中常用HashMap(有红黑树)和ArrayMap进行源码解析,其中 HashMap 源码来自 Android Framework API 28 (JDK=1.8) ...

最新文章

  1. java addfirst()_Java addFirst(),addLast() 在链表(LinkedList)的开头和结尾添加元素
  2. 【chrome错误】Cross origin requests are only supported for protocol schemes: http, data,chrome-extension
  3. Linux之shell脚本(2)
  4. 网络聊天室的技术与发展
  5. Android Studio中的APK分析器
  6. [20150831]中文符号在sql语句.txt
  7. 大数据技术对互联网的影响
  8. Android NavigationView中设置menu中的item字体颜色
  9. 新建samba配置步骤
  10. 职场 | 因特尔(Intel)无线modem系统设计师实习岗位面试总结
  11. TCGA数据库ensembl id 转为 gene Symbol,提取出需要的RNA种类表达谱列表信息
  12. 软件开发团队成员分工_分析软件开发人员的能力–选择合适的团队成员
  13. 2017 ACM Arabella Collegiate Programming Contest
  14. 做抖音为什么需要海外抖音服务器?如何自建海外抖音服务器站点?
  15. p设计一个Person类,属性有姓名、年龄、性别,创建方法personInfo,打印输出这个人的信息;创建Student类,继承Person类,属性有学院college,班级Group,重写父类Per
  16. 使用 SSM 框架实现发送手机短信验证码
  17. 伴风网易博客linux,推开窗,让春色伴随你我
  18. 半年学好英语能有多简单?
  19. 瑞星杀毒助手 升级到 0.1.0020版
  20. 内部存储器分区 android,Android的存储器类型(RAM V内部存储器)

热门文章

  1. 【单片机基础】stc89c52单片机实现流水灯的三种编程方式
  2. 485通讯的校验和_三菱FX系列PLC与三菱变频器通讯应用实例(RS485)
  3. oppo a125 JAVA_游戏、娱乐、交友尽在掌中
  4. Deprecated(since=“9“) newInstance()方法
  5. 夏季防雷的综合应用解决方案
  6. DDD实战课(3):实战篇上
  7. java实现驾校考试系统,基于jsp的驾照考试练习系统-JavaEE实现驾照考试练习系统 - java项目源码...
  8. ios微信点击失效之on
  9. ios 应用内跳转微信
  10. 看穿读心术系列( 基斯巴利)