H264帧内编码与帧间编码

晚上没事干,无聊,所以想写点什么。

为了达到节约空间的目的,视频图像都是经过编码,然后用于各种不同的场合,特别是网络传输,因为带宽的限制,为了更好的传输数据,必须对视频进行压缩处理。而目前最流行的当属H264了。

经过H264压缩的视频,可分为I、B、P三种不同的帧。其中I帧因为不参考其他帧,所以是帧内编码。P帧,要前向参考,而B帧,则要进行双向参考,这两种,都属于帧间编码。

先说说帧内编码:

帧内,顾名思义,就是不求外,只求内。不管外部数据如何,仅仅通过自身已有的数据进行编码。一幅图像里面的物体往往具有空间上的相关性,比如,以下图片:

除了中间的几个字,其他区域都是蓝色的,并且是一模一样的,所以,在空间上,数据就有相当大的冗余。而帧内编码,就是要去除这部分冗余数据。在帧内编码情况下,编码图像仅仅进过DCT(离散余弦变换)、量化器呗编码器就可生成编码比特流。DCT直接用于原始数据。

下面来说说帧间编码:

视频,其实就是一张一张图片而已,而这些图片其实都是相似的,仅仅只有很小的区别,这样就可以达到欺骗我们肉眼的效果,给我们一种动画的感觉。而这,就是所谓的时间相关性。比如上图,如果我们把它想象成一个视频,Media这个单词在里面运动,不管Media运动到哪里,他始终都是Media这个单词,样子都没有任何变化,仅仅是位置变了。而变化量、方向,我们可以用一个矢量表示,这就是所谓的运动矢量。帧间编码与帧内编码的不同之处在于他经过预测环节的处理。步骤如下:

1、计算参考帧与原始帧之间的运动矢量

2、通过参考帧与运动矢量生成原始帧的预测图像

3、讲原始图像与预测像素差值生成差分图像数据

4、对差分图像数据进行DCT变换

5、经过量化器量化

6、编码器生成压缩数据

以上就是笔者对编码的意见简单的理解,后面再有无聊的时候,会对这几个步骤做一些详细的分析

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H.264是一种视频编码标准,其中的预测是其中一种压缩技术。在MATLAB中实现H.264编码可以使用一些开源库和工具,例如JM、x264等。以下是一个示例代码,实现了H.264预测编码: ```matlab % Read input video vidObj = VideoReader('input_video.mp4'); % Create output video object outputVideo = VideoWriter('output_video.mp4','MPEG-4'); outputVideo.FrameRate = vidObj.FrameRate; open(outputVideo); % Set H.264 encoder parameters params = struct('Profile','High','Level','4.0','BitRate',5000000,'FrameRate',vidObj.FrameRate); % Loop through each video frame while hasFrame(vidObj) % Read current frame frame = readFrame(vidObj); % Convert to YCbCr color space YCbCr = rgb2ycbcr(frame); % Split YCbCr into separate components Y = YCbCr(:,:,1); Cb = YCbCr(:,:,2); Cr = YCbCr(:,:,3); % Perform frame intra prediction on Y component Y_pred = intra_prediction(Y); % Combine YCbCr components YCbCr_pred = cat(3,Y_pred,Cb,Cr); % Convert back to RGB color space frame_pred = ycbcr2rgb(YCbCr_pred); % Write encoded frame to output video writeVideo(outputVideo,frame_pred); end % Close output video object close(outputVideo); function Y_pred = intra_prediction(Y) % Block size (8x8) block_size = 8; % Pad input image [rows,cols] = size(Y); Y_pad = padarray(Y,[block_size-1 block_size-1],'replicate','post'); % Perform intra prediction on each block for r = 1:block_size:rows for c = 1:block_size:cols % Get current block block = Y_pad(r:r+block_size-1,c:c+block_size-1); % Calculate prediction mode mode = calculate_mode(block); % Perform prediction switch mode case 0 % DC mode pred = mean(block(:)); case 1 % Horizontal mode pred = repmat(block(1,:),[block_size 1]); case 2 % Vertical mode pred = repmat(block(:,1),[1 block_size]); case 3 % Diagonal mode pred = diag(block); pred = repmat(pred(:),[1 block_size]) + repmat(pred(:)',[block_size 1]); pred = pred/(block_size+1); otherwise error('Invalid prediction mode'); end % Subtract prediction from current block Y_pred(r:r+block_size-1,c:c+block_size-1) = block - pred; end end end function mode = calculate_mode(block) % Calculate sum of absolute differences (SAD) for each mode SAD = zeros(4,1); SAD(1) = sum(abs(block(:)-mean(block(:)))); SAD(2) = sum(abs(block(1,:)-mean(block(:)))); SAD(3) = sum(abs(block(:,1)-mean(block(:)))); SAD(4) = sum(abs(diag(block)-mean(block(:)))); % Find mode with minimum SAD [~,mode] = min(SAD); mode = mode-1; end ``` 这段代码实现了一个简单的预测编码器,基于直接模式选择方法(mode selection),并且使用直流、水平、垂直和对角线预测模式进行预测。在实际应用中,需要使用更复杂的编码器和预测算法,以达到更好的压缩效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值