数据压缩实验七:H.264码流分析

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary
摘要由CSDN通过智能技术生成

一、H.264

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。

H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想参考解码)、Hypothetical Stream Scheduler(HSS,假想码流调度器)。

 

二、实验要求

1.选择一个.mp4或者.264文件

2.在码流分析仪软件中打开该文件,从几个层次进行分析:

(1)分析SPS和PPS里都包含哪些主要的信息,给出参数值(例如分辨率、帧率、GOP结构等)

(2)以一个GOP为例,分析如下信息:

①每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。

②以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。

③以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。

④以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。

三、实验过程

1.选择视频文件

 

2.分析sps

sequence parameter set,描述了sequence的所有信息

 sps的参数:

(1)profile_idc

标识当前H.264码流的profile。H.264中定义了三种常用的档次profile:

  • 基准档次:baseline profile;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
压缩算法的实现。 好的,下面是代码实现: ```matlab % 读取原始图像 I = imread('lena.bmp'); % 转换为灰度图像 I = rgb2gray(I); % 图像大小 [h, w] = size(I); % 分块大小 block_size = 8; % DCT变换矩阵 T = dctmtx(block_size); % 量化矩阵 q50 = [16 11 10 16 24 40 51 61; 12 12 14 19 26 58 60 55; 14 13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81 104 113 92; 49 64 78 87 103 121 120 101; 72 92 95 98 112 100 103 99]; % 图像分块 blocks = mat2cell(I, repmat(block_size, 1, h/block_size), repmat(block_size, 1, w/block_size)); % DCT变换和量化 for i = 1:numel(blocks) % DCT变换 blocks{i} = T * double(blocks{i}) * T'; % 量化 blocks{i} = round(blocks{i} ./ (q50 * block_size)); end % Zigzag扫描 zigzag = @(block_struct) zigzag_scan(block_struct.data); blocks_zigzag = blockproc(cell2mat(blocks), [block_size block_size], zigzag); % 熵编码 symbols = unique(blocks_zigzag); counts = hist(blocks_zigzag(:), symbols); dict = huffmandict(symbols, counts); huffman_data = huffmanenco(blocks_zigzag(:), dict); % 将压缩后的数据写入文件中 fid = fopen('lena.jpg', 'w'); fwrite(fid, huffman_data, 'uint8'); fclose(fid); % 读取压缩后的数据 fid = fopen('lena.jpg', 'r'); huffman_data = fread(fid, inf, 'uint8'); fclose(fid); % 熵解码和Zigzag逆变换 blocks_zigzag_recover = huffmandeco(huffman_data, dict); blocks_recover = mat2cell(blocks_zigzag_recover, repmat(block_size, 1, h/block_size), repmat(block_size, 1, w/block_size)); zigzag_recover = @(block_struct) zigzag_recover_scan(block_struct.data); blocks_dct_recover = blockproc(cell2mat(blocks_recover), [block_size block_size], zigzag_recover); % 量化逆操作和DCT逆变换 for i = 1:numel(blocks_dct_recover) % 量化逆操作 blocks_dct_recover{i} = blocks_dct_recover{i} .* (q50 * block_size); % DCT逆变换 blocks_dct_recover{i} = T' * blocks_dct_recover{i} * T; end % 组合图像 I_recover = cell2mat(blocks_dct_recover); I_recover = uint8(I_recover); % 显示原始图像和压缩后的图像 figure; subplot(1, 2, 1); imshow(I); title('Original Image'); subplot(1, 2, 2); imshow(I_recover); title('Compressed Image'); % 计算压缩比 n_original = h * w * 8; n_compressed = numel(huffman_data) * 8; compression_ratio = n_original / n_compressed; fprintf('Compression ratio: %.2f\n', compression_ratio); ``` 其中,`zigzag_scan()`和`zigzag_recover_scan()`是Zigzag扫描和逆扫描的函数实现,代码如下: ```matlab function [zigzag_data] = zigzag_scan(data) % 将矩阵按照Zigzag扫描转换为一维数组 [h, w] = size(data); % 生成Zigzag扫描的索引矩阵 index_mat = zeros(h, w); for i = 1:h for j = 1:w if mod(i+j, 2) == 0 index_mat(i,j) = (i+j-2)*w/2 + j; else index_mat(i,j) = ((i+j-1)-1)*w/2 + i; end end end % 按照Zigzag扫描的索引矩阵转换为一维数组 zigzag_data = data(index_mat(:)); end function [data] = zigzag_recover_scan(zigzag_data) % 将一维数组按照Zigzag扫描逆转换为矩阵 block_size = 8; data = zeros(block_size, block_size); % 生成Zigzag扫描的索引矩阵 index_mat = zeros(block_size, block_size); for i = 1:block_size for j = 1:block_size if mod(i+j, 2) == 0 index_mat(i,j) = (i+j-2)*block_size/2 + j; else index_mat(i,j) = ((i+j-1)-1)*block_size/2 + i; end end end % 按照Zigzag扫描的索引矩阵逆转换为矩阵 data(index_mat(:)) = zigzag_data; end ``` 运行上述代码,即可将lena.bmp压缩为lena.jpg,并输出压缩比。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值