H264编码标准中游程编码应用介绍

news2024/11/17 13:27:25

H264编码标准

H.264编码标准,也被称作MPEG-4 AVC(Advanced Video Coding),是一种被广泛使用的数字视频压缩标准。它由国际电信联盟(ITU-T)和国际标准化组织(ISO)共同开发,旨在提供比以往标准更高的视频压缩效率,同时保持或提高视频质量。

主要特点:

  • 高压缩率:H.264能够在保持高质量的同时提供高压缩比,这使得它非常适合网络传输和存储。
  • 多种分辨率和帧率支持:H.264支持从低分辨率到高分辨率的多种格式,以及不同的帧率,使其应用范围非常广泛。
  • 帧内和帧间预测:H.264使用帧内预测和帧间预测技术来减少图像的冗余信息,提高压缩效率。
  • 变换编码:采用整数变换编码技术,将图像数据从空间域转换到频域。
  • 量化:H.264的量化算法更加精细,支持可变量化参数,适应不同的应用场景和传输条件。
  • 环路滤波:采用先进的环路滤波技术,对解码后的图像进行后处理,减少压缩带来的图像失真。

应用场景:
H.264因其出色的压缩性能和图像质量,被广泛应用于视频监控、视频会议、流媒体服务、数字电视广播等领域。

参考代码

  • JM:https://iphome.hhi.de/suehring/
    在这里插入图片描述

  • x264:https://www.videolan.org/developers/x264.html

git clone https://code.videolan.org/videolan/x264.git

在这里插入图片描述

  • openh264:https://github.com/cisco/openh264
    在这里插入图片描述

游程编码

行程编码(Run Length Encoding,RLE),又称游程编码、行程长度编码、变动长度编码等,是一种统计编码。主要技术是检测重复的比特或字符序列,并用它们的出现次数取而代之。比较适合于二值图像的编码,但是不适用于连续色调图像的压缩,例如日常生活中的照片。为了达到较好的压缩效果,有时行程编码和其他一些编码方法混合使用。

该压缩编码技术相当直观和经济,运算也相当简单,因此解压缩速度很快。RLE压缩编码尤其适用于计算机生成的图形图像,对减少存储容量很有效果。

【——百度百科】

游程编码的基本原理是将连续的重复数据用一个对来表示,这个对包含两个部分:

  • 计数值:表示数据重复的次数。
  • 数据值:表示被重复的数据。

应用场景

游程编码常用于图像压缩、文本压缩等领域,尤其是在数据中存在大量连续重复的模式时。

优缺点

优点

  • 简单:算法实现简单,易于理解和实现。
  • 高效:对于具有大量连续重复数据的文件,压缩比可以非常高。

缺点

  • 不适用:对于没有连续重复数据的文件,游程编码可能不会减少数据大小,甚至可能增加数据量(因为需要额外存储计数值)。

示例

假设我们有一串二进制数据:00011111111000011111110,应用游程编码后,可以表示为:

3 0(表示三个0)
7 1(表示七个1)
3 0(表示三个0)
7 1(表示七个1)

c++实现游程编码

  • RLE编码
#include <iostream>
#include <string>
#include <vector>

// 函数用于对字符串进行RLE编码
std::string rle_encode(const std::string& input) {
    std::string output;
    char last_char = 0;
    int count = 1;

    for (size_t i = 1; i <= input.size(); ++i) {
        if (i == input.size() || input[i] != last_char) {
            // 添加到输出
            output += std::to_string(count);
            output += last_char;
            // 重置计数器和最后一个字符
            count = 1;
            last_char = input[i];
        } else {
            // 如果当前字符与上一个相同,增加计数器
            ++count;
        }
    }

    return output;
}

// 主函数
int main() {
    std::string data = "AAAABBBCCDAA";
    std::string encoded_data = rle_encode(data);
    std::cout << "Encoded data: " << encoded_data << std::endl;
    return 0;
}
  • RLE解码
#include <iostream>
#include <string>
#include <cctype>

// 函数用于对RLE编码的字符串进行解码
std::string rle_decode(const std::string& input) {
    std::string output;
    for (size_t i = 0; i < input.length(); ) {
        // 解析计数
        int count = 0;
        while (i < input.length() && std::isdigit(input[i])) {
            count = count * 10 + (input[i++] - '0');
        }
        // 添加字符到输出
        while (count-- > 0) {
            output += input[i++];
        }
    }
    return output;
}

// 主函数中可以测试解码功能
int main() {
    std::string encoded_data = "4A3B2C1D2A";
    std::string decoded_data = rle_decode(encoded_data);
    std::cout << "Decoded data: " << decoded_data << std::endl;
    return 0;
}

这两个函数分别实现了RLE的编码和解码过程。编码函数rle_encode读取输入字符串,并为每个连续的字符序列生成一个计数和该字符。解码函数rle_decode则将编码后的字符串转换回原始字符串,它通过读取计数和紧跟的字符来重建原始数据。

H264编码标准中游程编码

  • 图像在进行离散变换后能量集中字啊低频和直流区域,其系数经过量化后低频和直流分量有少量较大值,高频区域除了有少量的较小值外大部分为零。为了更加有效的编码,可以根据系数的统计特性采用熵编码进一步压缩数据,在熵编码前可以根据从高到低的统计特性,对系数进行锯齿扫描和游程长度编码。
  • 在H264编码标准中,游程编码用3个量表示一个非零系数:第一个量是非零系数前0的个数;第二量为非零系数的值;第三个量为终止标志,常用1表示游程编码结束,0表示游程编码未结束。

示例

  • 如下图是以8x8的图像块,经过变换、量化后的系数按照zigzag扫描,排序成串行行数据序列:

12,0,0-6,4,6,0,0,0,0,0,-7,0,0,0,-2,0,0,…

  • 经过游程编码后的结果为:

(0,12,0)(2,-6,0)(0,4,0)(4,-7,0)(3,-2,1)

在这里插入图片描述

参考

  • 深入理解视频编解码技术——基于H.264标准及参考模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3后台管理系统推荐

目录 项目概述 &#x1f35f; 项目展示 功能特点 &#x1f957; 结语 &#x1f4a8; 项目概述 &#x1f35f; 基于Vue 3框架与Element-Plus UI组件库技术精心构建的后端管理模板。该模板系统已成功实现一个基础的权限管理模块&#xff0c;宗旨在于为追求高效二次开发的开发…

The_Maya_Society

突然发现自己做了一些逆向题都没有写笔记 今天&#xff0c;发现这道题有意思 1.解压文件 三个文件The Maya Society.html&#xff0c;maim.cc,maya.png 当时我看到这个题的时候&#xff0c;我以为是不是会是js逆向 看来是我蠢了 这三个文件&#xff0c;main.css和maya.png这两…

<计算机网络自顶向下> 路由器组成

路由器结构概况 路由&#xff1a;运行路由选择算法/协议&#xff08;RIP, OSPF, BGP&#xff09;生成路由表转发&#xff1a;从输入到输出链路交换数据包-根据路由表进行分组的转发中间的fabric是用来接收输入的分组交给输出端口的&#xff0c;完成局部的转发&#xff08;根据…

GPT-SoVITS声音克隆训练和推理(新手教程,附整合包)

环境: Win10 专业版 GPT-SoVITS-0421 整合包 问题描述: GPT-SoVITS声音克隆如何训练和推理教程 解决方案: Zero-shot TTS: Input a 5-second vocal sample and experience instant text-to-speech conversion.零样本 TTS:输入 5 秒的人声样本并体验即时文本到语音转换…

震惊!小红书矩阵账号管理-批量发布笔记

“小红书引流软件矩阵工具-笔记批量发” 昨天&#xff0c;有个粉丝急匆匆地来找我&#xff0c;一脸焦急地说&#xff1a;“大佬&#xff0c;我现在运营着好几个小红书账号&#xff0c;每天都要发布内容&#xff0c;可把我忙坏了&#xff0c;有没有什么高效的管理方法啊&#xf…

1.PROXY-代理内容

SwitchyOmega&#xff0c;浏览器插件&#xff08;edge&#xff0c;火狐插件库都是存在的&#xff09;&#xff0c;安装后的样式 1.安装 2.设置 我们常用的功能&#xff0c;主要是设置一个代理ip访问学习网站入github等&#xff0c;或者docker服务等 3.启动代理 4.验证 https…

Python爬取AppStore脚本获取评论数据Python脚本获取苹果软件评价

Python爬取AppStore脚本获取评论数据Python脚本获取苹果软件评价 效果: # -*- coding: utf-8 -*- import urllib.request import json import xlsxwriter page=1; appid=726029718 workbook = xlsxwriter.Workbook(app评论.xlsx) worksheet = workbook.add_worksheet() forma…

【python】随机模拟——赶火车问题、醉汉回家

问题描述 1.赶火车问题。2.模拟二维随机游动&#xff08;醉汉回家&#xff09; 1.赶火车问题。 一列列车从A站开往B站&#xff0c;某人每天赶往B站上车。他已经了解到火车从A站到B站的运行时间是服从均值为30min&#xff0c;标准差为2min的正态随机变量。火车大约下午13&#…

设置Linux开发板开机自启动QT程序的报错解决办法

设置Linux开发板开机自启动QT程序报错解决办法 设置开发板开机自启动QT 打开 /etc/init.d/rsC 文件&#xff0c;添加以下内容 cd / ./my_start_run.shmy_start_run.sh 是自己编写的自启动脚本&#xff0c;内容例如下&#xff1a;(也可以将这些直接写到 /etc/init.d/rsC 文件…

Maven | 依赖

Maven项目结构 pom.xml : 配置依赖文件 删除未下载成功依赖 新建一个bat文件&#xff0c;内容如下 echo off rem create by pengchengrem 这里写你的仓库路径 set REPOSITORY_PATHE:\repository rem 正在搜索... for /f "delims" %%i in (dir /b /s "%REPOSIT…

计算机三级网络技术考试第3章IP地址规划技术

IP地址为192.168.15.1/27的 子网掩码可以写为&#xff1a;255.255.255.224。 其中27 表示的是子网掩码的长度&#xff0c;也就是说子网掩码是27个1和5个0组成的&#xff0c;即11111111 11111111 11111111 11100000。 网络地址171.22.168.0的子网掩码为&#xff1a;255.255.248…

元宇宙虚拟空间的角色状态更新(七)

前言 该文章主要讲元宇宙虚拟空间的角色状态更新&#xff0c;基本核心技术点 角色状态更新 对角色设置一个位置判断&#xff08;从中心点向下投射一射线确定角色的位置&#xff09; character.feetRaycast(); feetRaycast的start获取碰撞体的位置&#xff0c;end射线结束的…

基于高斯壳映射的高效三维人体生成

Gaussian Shell Maps for Efficient 3D Human Generation 基于高斯壳映射的高效三维人体生成 Rameen Abdal*1  Wang Yifan*1  Zifan Shi*†1,2  Yinghao Xu1  Ryan Po1  Zhengfei Kuang1 Rameen Abdal *1 王一凡 *1 Zifan Shi *†1,2 Yinghao Xu 1 Ryan Po 1 Jengfei Kuan…

恶补《操作系统》2_3——王道学习笔记

2.3_1 进程同步、进程互斥 1、进程同步 指为了完成某种任务而建立的两个或多个进程&#xff0c;这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。 2、进程互斥 把一个时间段内只允许一个进程使用的资源称…

2024年火爆全网的三款ai智能直播系统,你知道哪一种?

2024年火爆全网的三款ai智能直播系统,你知道哪一种&#xff1f; 如今网络时代&#xff0c;信息运转的速度非常迅猛。 有句话说的好&#xff1a;“若水三千只取一瓢饮&#xff0c;”快速筛选有价值的信息&#xff0c;过滤掉对自己有害的垃圾信息。不要想着把所有钱都赚完&…

基于Spring Boot的家具销售电商平台设计与实现

基于Spring Boot的家具销售电商平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

面试:ThreadLocal

目录 1、ThreadLocal可以实现〔资源对象】的线程隔离&#xff0c;让每个线程各用各的【资源对象】&#xff0c;避免争用引发的线程安全问题 2、ThreadLocal同时实现了线程内的资源共享 3、原理 4、为什么ThreadLocalMap 中的 key (即 ThreadLocal &#xff09;要设计为弱引用…

强力的应用容器引擎---------Docker的资源控制

目录 一、CPU 资源控制 1.1cgroups有四大功能 1.2设置CPU使用率上限 1.2.1查看CPU使用率 1.2.2进行CPU压力测试 1.2.3设置50%的比例分配CPU使用时间上限 1.3设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 1.3.1创建两个容器为hua1 和hua2&#xff0c…

小白学自动化测试​:数据驱动DDT​!

大家好&#xff0c;今天我们开始学习自动化相关的内容&#xff0c;一讲到软件行业的自动化测试一般对于刚入门的同学来讲学习接口测试是一个不错的选择。入门相对容易并且在工作中去实践产生的收益也比较大&#xff0c;所以我们后面会来学习接口自动化测试相关内容。 今天给大…

芒果YOLOv8改进组合161:动态标签分配ATSS+新颖轻量化非对称多级压缩LADH检测头组合改进,LADH作为原创可以发表SCI顶刊论文,小目标高效涨点

💡本篇内容:【芒果YOLOv8改进ATSS标签分配策略|第四集】芒果YOLOv8改进组合161:动态标签分配ATSS+新颖轻量化非对称多级压缩LADH检测头组合改进,小目标高效涨点 💡🚀🚀🚀本博客 标签分配策略ATSS改进+ 新颖轻量化非对称多级压缩LADH检测头组合改进,适用于 YOLOv…