H.264编码解析与C++实现详解
一、H.264编码核心概念
1.1 分层编码结构
H.264采用分层设计,包含视频编码层(VCL)和网络抽象层(NAL)。VCL处理核心编码任务,NAL负责封装网络传输数据。
1.2 NALU单元结构
// NAL单元头部结构示例
struct NALHeader {uint8_t forbidden_zero_bit : 1;uint8_t nal_ref_idc : 2;uint8_t nal_unit_type : 5;
};
NAL单元类型常见值:
-
7: SPS(序列参数集)
-
8: PPS(图像参数集)
-
5: IDR帧
-
1: 非IDR帧
二、C++解析实现关键步骤
2.1 开发环境配置
使用FFmpeg库进行开发:
bash复制
# 安装FFmpeg开发库
sudo apt-get install libavformat-dev libavcodec-dev
2.2 核心代码实现
#include <libavformat/avformat.h>
#include <iostream>void parse_h264_stream(const char* filename) {AVFormatContext* fmt_ctx = nullptr;avformat_open_input(&fmt_ctx, filename, nullptr, nullptr);avformat_find_stream_info(fmt_ctx, nullptr);// 定位视频流int video_stream = -1;for (int i = 0; i < fmt_ctx->nb_streams; ++i) {if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {video_stream = i;break;}}AVPacket packet;while (av_read_frame(fmt_ctx, &packet) >= 0) {if (packet.stream_index == video_stream) {uint8_t* data = packet.data;int size = packet.size;// 解析NALU单元while (size > 0) {int nalu_size = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];data += 4;size -= 4;NALHeader header;header.forbidden_zero_bit = (data[0] >> 7) & 0x01;header.nal_ref_idc = (data[0] >> 5) & 0x03;header.nal_unit_type = data[0] & 0x1F;// 处理不同类型的NALUswitch(header.nal_unit_type) {case 7:parse_sps(data+1, nalu_size-1);break;case 8:parse_pps(data+1, nalu_size-1);break;// 其他类型处理...}data += nalu_size;size -= nalu_size;}}av_packet_unref(&packet);}avformat_close_input(&fmt_ctx);
}
2.3 参数集解析示例
void parse_sps(uint8_t* data, int size) {// 使用指数哥伦布解码int profile_idc = data[0];int constraint_flags = data[1];int level_idc = data[2];// 解析分辨率参数int width_mb = (data[3] & 0xFF) << 8 | data[4];int height_mb = (data[5] & 0xFF) << 8 | data[6];std::cout << "SPS解析结果:\n"<< "Profile: " << profile_idc << "\n"<< "Level: " << level_idc << "\n"<< "Resolution: " << (width_mb*16) << "x" << (height_mb*16)<< std::endl;
}
三、编码优化技巧
3.1 多线程编码
// 设置编码器多线程参数
AVCodecContext* codec_ctx = ...;
codec_ctx->thread_count = 4; // 使用4个编码线程
codec_ctx->thread_type = FF_THREAD_SLICE; // 基于Slice的并行
3.2 SIMD优化
在关键算法(如运动估计、DCT变换)中使用Intel AVX2指令集:
#include <immintrin.h>void dct_transform_avx2(float* block) {__m256 row0 = _mm256_load_ps(block);__m256 row1 = _mm256_load_ps(block+8);// AVX2优化计算...
}
四、开发注意事项
-
内存管理:FFmpeg使用引用计数管理内存,需正确使用
av_packet_ref/av_packet_unref
。 -
时间戳处理:正确计算PTS/DTS,注意B帧带来的时序问题。
-
错误恢复:处理网络传输中的丢包情况,使用FEC或重传机制。
-
兼容性处理:针对不同设备的SPS/PPS参数进行适配。
五、性能测试对比
优化手段 | 1080P编码速度 | 压缩率 |
---|---|---|
单线程基线 | 24fps | 1.0x |
多线程(4核) | 78fps | 0.99x |
SIMD优化 | 92fps | 1.0x |
混合优化 | 105fps | 0.98x |
六、扩展应用方向
-
WebRTC实时通信中的H.264实现
-
硬件加速编码(Intel QSV/NVIDIA NVENC)
-
基于机器学习的率失真优化
-
AV1/H.265的兼容过渡方案
总结
本文从H.264编码原理出发,详细讲解了C++实现中的关键技术点。通过FFmpeg库的灵活运用,结合多线程和SIMD等优化手段,可构建高性能的视频处理系统。实际开发中建议参考ITU-T H.264标准文档,并结合具体应用场景进行参数调优。
相关文章:
H.264编码解析与C++实现详解
一、H.264编码核心概念 1.1 分层编码结构 H.264采用分层设计,包含视频编码层(VCL)和网络抽象层(NAL)。VCL处理核心编码任务,NAL负责封装网络传输数据。 1.2 NALU单元结构 // NAL单元头部结构示例 struc…...
OpenAI即将开源!DeepSeek“逼宫”下,AI争夺战将走向何方?
OpenAI 终于要 Open 了。 北京时间 4 月 1 日凌晨,OpenAI 正式宣布:将在未来几个月内开源一款具备推理能力的语言模型,并开放训练权重参数。这是自 2019 年 GPT-2 部分开源以来,OpenAI 首次向公众开放核心模型技术。 【图片来源于…...
音视频 四 看书的笔记 MediaPlayerService
Binder机制看这里 Binde机智 这是一个分割符 Binder机智 分割(goutou) Binder机制 MediaPlayerService多媒体框架中一个非常重要的服务。MediaPlayerService 我原称之为链接之王 图片来源 MediaPlayer 是客户端 C/S 中的CMediaPlayerService MediaPlayerService::Client 是服…...
android Fragment使用
在 Android Fragment 中,导入 id(findViewById)并给控件赋值的逻辑通常应该写在 onViewCreated() 方法中,而不是 onCreateView()。 Fragment 生命周期 & 适合的位置 方法作用适合的操作onCreateView()创建并返回 Fragment 的…...
LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系统、TileMap等全面升级!
正式版推出前,说明3.3的功能还没开发完。所以,又一大波更新来了~ 下面对重点更新进行说明。 Spine的重要更新 3.3.0-beta.3版本开始,新增了Spine 4.2 的运行时库,Spine动画上可以支持物理特性了。例如,下图右侧女孩在启…...
deepseek v3-0324 化学键线式Canvas编辑器设计
化学键线式Canvas编辑器设计 下面是一个基于HTML5 Canvas的化学键线式编辑器的基本实现方案。这个编辑器允许用户绘制有机化学中常见的键线式结构。 基本HTML结构 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"…...
解决 CMS Old GC 频繁触发线上问题技术方案
目录 一、CMS GC 工作原理 二、现象分析 (一)具体表现说明 (二)触发条件 三、总结优化措施 (一)调整 CMS 启动条件:降低 Old 区触发阈值 1. 原理分析 2. 建议配置 (二&…...
后端实现加解密工具类(记录)
后端利用3DES加解密工具类实现特殊字段加解密,比如个人信息、请求参数等 ,可以自定义密钥和IV加密,代码如下,直接使用即可。 import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory…...
云原生技术赋能企业数字化转型:实战案例与架构演进
引言:数字化转型的云原生机遇 在VUCA时代背景下,某金融科技企业面临系统扩展性差、运维成本高企的困境。通过采用云原生技术栈,6个月内实现资源利用率提升300%,故障恢复时间从小时级缩短至分钟级。本文将深度解析该企业技术演进路…...
驱动开发系列49 - 搭建 Vulkan 驱动调试环境(编译 mesa 3D)- Ubuntu24.04
一:搭建Vulkan运行环境 安装vulkan依赖包: 1. sudo apt install vulkan-tools 2. sudo apt install libvulkan-dev 3. sudo apt install vulkan-utility-libraries-dev spirv-tools 4. sudo apt install libglfw3-dev libglm-dev 5. sudo apt install libxxf86vm-dev libxi-…...
自然语言处理(26:(终章Attention 2.)带Attention的seq2seq的实现)
系列文章目录 终章 1:Attention的结构 终章 2:带Attention的seq2seq的实现 终章 3:Attention的评价 终章 4:关于Attention的其他话题 终章 5:Attention的应用 目录 系列文章目录 前言 一、编码器的实现 二、解…...
Qt5.14.2+mingw64编译OpenCV3.4.14一次成功记录
上一文中编译opencv4.5成功了,但是使用过程中没有成功,网上很多的代码没法跑起来,所以才有了此文来编译一个低版本的opencv3的过程记录,全程截图。 一、软件安装 1.1 Python3.8版本安装路径:C:\Users\Administrator\AppData\Loca…...
【数据库原理】基础篇:MySQL基础入门与实战指南
前言 在当今数字化时代,数据已成为企业运营的核心资产之一。而MySQL作为一款广泛使用的开源关系型数据库管理系统,凭借其高性能、可靠性和易用性,成为众多开发者和企业的首选。本文将从MySQL的基础概念出发,逐步深入到实际操作&a…...
使用Python解析PPT文件并生成JSON结构详解
引言 PowerPoint(PPT)文件的自动化处理是办公自动化和数据提取的常见需求。本文将介绍如何通过Python的python-pptx库,将PPT文件的样式、结构、文本内容等信息解析为标准化的JSON格式,为后续的自动化处理、数据迁移或样式复用提供…...
C#:第一性原理拆解属性(property)
目录 第一步:从最基本的需求出发 第二步:引入控制需求 第三步:优化访问方式 第四步:剖析属性的本质 第五步:进一步简化和演化 自动属性的定义和作用 自动属性的特点和限制 第六步:总结属性的第一性…...
nacos 2.x使用java语言实现自定义Loadbalance
一、核心实现思路 Nacos 2.x 的负载均衡自定义支持两种模式: 基于 Ribbon 的兼容方案(适用于 Spring Cloud 2020 之前版本)基于 Spring Cloud LoadBalancer 的方案(推荐,适配最新 Spring Cloud 2023 和 Nacos 2.x&am…...
torch.nn.Conv2d介绍——Pytorch中的二维卷积层
torch.nn.Conv2d是torch.nn模块中的二维卷积层类,用于构建神经网络中的二维卷积层。 1、基本语法 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone)将 2D …...
ubuntu虚拟机裁剪img文件系统
1. 定制文件系统前期准备 将rootfs.img文件准备好,并创建target文件夹2. 挂载文件系统 sudo mount rootfs.img target #挂载文件系统 sudo chroot target #进入chroot环境3. 内裁剪文件系统 增删裁剪文件系统 exit #退出chroot环境 sudo umount target…...
一文详细讲解Python(详细版一篇学会Python基础和网络安全)
引言 在当今数字化时代,Python 作为一种简洁高效且功能强大的编程语言,广泛应用于各个领域,从数据科学、人工智能到网络安全等,都能看到 Python 的身影。而网络安全作为保障信息系统和数据安全的关键领域,其重要性不言…...
使用QT调试LidarView
前段时间使用VeloView想进行点云的显示,后来发现VeloView的尺子测距不好用,也没有筛选点的功能,就放弃了。kitware同家的还有LidarView,功能多一些,更新的时间更晚,而且还兼容速腾、禾赛等多家点云设备可以…...
JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南
1、简述 Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库,它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API,封装了很多复杂的 ZooKeeper 操作,例如连接管理、分布式锁、Leader 选举等。 在分布式系统中&#…...
【SpringCloud】LoadBalance-负载均衡
4. 负载均衡-LoadBalance 4.1 为什么需要负载均衡? 不知道各位心中有没有女神,通常来说一个女神就会有多个舔狗,那这些舔狗呢,就会心甘情愿的帮女神干活,假设女神小美现在有三个舔狗,小美喜欢让这三个舔狗…...
[250401] OpenAI 向免费用户开放 GPT-4o 图像生成功能 | Neovim 0.11 新特性解读
目录 OpenAI 向免费用户开放 GPT-4o 图像生成功能Neovim 0.11 新特性解读更简化的 LSP 设置和配置内置自动补全改进的悬停文档诊断信息增强更多默认键映射终端模拟器改进其他改进 OpenAI 向免费用户开放 GPT-4o 图像生成功能 2025年4月1日早上,OpenAI CEO Sam Altm…...
VBA数据库解决方案第二十讲:SQL在VBA中几种常见的表达方式
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...
SAIL-RK3588J 核心板技术方案——高精度装配式建筑机器人控制
(本方案契合《建筑机器人产业目录》政策要求) 一、方案背景与政策支持 政策驱动 2025年2月《建筑机器人产业目录》明确将“高精度建筑机器人控制设备”纳入重点补贴范围,要求定位精度≤0.5mm、支持实时质检与多机协同,…...
人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!
人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开! 近年来,人工智能在生物医药行业中的应用受到广泛关注。 2024年10月,2024诺贝尔化学奖被授予“计算蛋白质设计和蛋白质结构预测”,这为行业从业人员带来…...
C#高级:利用LINQ进行实体列表的集合运算
问题引入: Teacher实体的唯一标识符是Name和Classes字段(或者说这两个字段唯一确定一条数据),如何对两个实体列表做交集、差集运算呢?(并集直接调用AddRange方法即可) 一、重写方法实现 1.原…...
Python项目-基于Flask的个人博客系统设计与实现(2)
源代码 续 {% extends base.html %}{% block title %}评论管理{% endblock %}{% block content %} <div class"container py-4"><div class"row"><div class"col-md-3"><div class"list-group mb-4"><a h…...
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题题解)(C++/Java题解)
记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、日期统计-(解析)-暴力dfs(😉蓝桥专属 2、01串的熵-(解析)-不要chu…...
前端界面在线excel编辑器 。node编写post接口获取文件流,使用传参替换表格内容展示、前后端一把梭。
首先luckysheet插件是支持在线替换excel内容编辑得但是浏览器无法调用本地文件,如果只是展示,让后端返回文件得二进制文件流就可以了,直接使用luckysheet展示。 这里我们使用xlsx-populate得node简单应用来调用本地文件,自己写一个…...
在 Fedora 系统下备份远程 Windows SQL Server 数据库的完整方案
一、环境准备与工具安装 1. 安装 Microsoft SQL Server 命令行工具 Fedora 需安装 mssql-tools 和 ODBC 驱动: # 添加 Microsoft 仓库 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安装工具包 …...
从24GHz到71GHz:Sivers半导体的广泛频率范围5G毫米波产品解析
在5G技术的浪潮中,Sivers半导体推出了创新的毫米波无线产品,为通信行业带来高效、可靠的解决方案。这些产品支持从24GHz到71GHz的频率,覆盖许可与非许可频段,适应高速、低延迟的通信场景。 5G通信频段的一点事儿及Sivers毫米波射频…...
从【抖音安全与信任中心】观察企业如何做算法透明
抖音主动公开算法原理树立行业新标杆: “抖音安全与信任中心”网站(95152.douyin.com) 1 算法透明的几点准则 需涵盖技术逻辑公开、治理机制可查、用户参与共建等维度。以下是基于抖音案例总结的可行路径,以及几个准则࿱…...
html处理Base文件流
处理步骤 从服务返回的字符串中提取文件流数据,可能是Base64或二进制。将数据转换为Blob对象。创建对象URL。创建<a>元素,设置href和download属性。触发点击事件以下载文件。删除缓存数据 代码 // 假设这是从服务返回的Base64字符串(…...
MySQL内存管理机制详解
目录标题 MySQL内存管理机制详解1. **内存组成与核心组件**2. **RSS与共享内存的关系**3. **OOM问题排查步骤**4. **典型案例** Buffer Pool(缓冲池) 确实属于共享内存(Shared Memory)的核心组成部分?1. **Buffer Pool…...
《算法笔记》9.7小节——数据结构专题(2)->堆 问题 C: 合并果子(堆)
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,…...
化繁为简解决leetcode第1289题下降路径最小和II
1289.下降路径最小和II 难度:困难 问题描述: 给你一个nxn整数矩阵grid,请你返回非零偏移下降路径数字和的最小值。 非零偏移下降路径定义为:从grid数组中的每一行选择一个数字,且按顺序选出来的数字中,…...
蓝桥杯省模拟赛 数位和
问题描述 只能被 1 和本身整除的数称为质数。 请问在 1 (含)到 1000000 (含)中,有多少个质数的各个数位上的数字之和为 2323 。 提示:599 就是这样一个质数,各个数位上的数字之和为 59923 。…...
MySQL和Oracle批量插入SQL差异详解
文章目录 MySQL和Oracle批量插入SQL差异详解1. 基本批量插入语法1.1 MySQL批量插入1.2 Oracle批量插入 2. 带序列的批量插入2.1 MySQL带自增ID的批量插入2.2 Oracle带序列的批量插入 3. 条件批量插入3.1 MySQL条件批量插入3.2 Oracle条件批量插入 MySQL和Oracle批量插入SQL差异…...
YOLOv5配置训练以及华为昇腾910B推理
参考文章: 保姆式yolov5教程,训练你自己的数据集 - 知乎 Windows 10|11下安装mmyolo-0.5.0版本 - 知乎 Ubuntu22.04安装教程&基于华为Ascend AI处理器的om模型atc转换环境安装_ubuntu安装atc工具-CSDN博客嵌入式AI---在华为昇腾推理自己的yolov5目标…...
Visual Studio Code配置自动规范代码格式
目录 前言1. 插件安装2. 配置个性化设置2.1 在左下角点击设置按钮 ,点击命令面板(或者也可以之间按快捷键CtrlShiftP)2.2 在弹出的搜索框输入 settings.json,打开首选项:打开工作区设置;2.3 在settings.jso…...
【网安面经合集】42 道高频 Web 安全面试题全解析(附原理+防御+思路)
对于正在准备 安全岗求职或实习的同学们来说,Web 安全面试题几乎是必问项。 尤其是一些经常出现的考点,比如 SQL 注入、XSS、CSRF、反序列化、逻辑漏洞、WAF 绕过等等,不仅需要你知道“是什么”,还得能“讲清楚原理、分类、修复和…...
论文笔记(七十五)Auto-Encoding Variational Bayes
Auto-Encoding Variational Bayes 文章概括摘要1 引言2 方法2.1 问题场景2.2 变分下界2.3 SGVB估计器与AEVB算法2.4 重参数化技巧 3 示例:变分自编码器(Variational Auto-Encoder)4 相关工作5 实验6 结论7 未来工作 文章概括 引用࿱…...
前端学习记录之HTML
1. 网页 1.1 什么是网页 网站是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”,通常是HTML格式的文件,它要通过浏览器来阅读 网页是构成网站的基本元素。它通常由图片,…...
程序化广告行业(39/89):广告投放的数据分析与优化秘籍
程序化广告行业(39/89):广告投放的数据分析与优化秘籍 在程序化广告的领域中,数据分析与优化调整是实现精准投放、提升广告效果的核心环节。作为一名热衷于探索程序化广告的学习者,我希望通过这篇博客,和大…...
蓝桥杯 01游戏
问题描述 小蓝最近玩上了 01 游戏,这是一款带有二进制思想的棋子游戏。 游戏在一个大小为 N N 的棋盘上进行。棋盘上的每个位置都需要放置一个数字 0 或 1。初始情况下,棋盘上有一部分位置已经放置了固定的数字,玩家不可以更改这些位置。其…...
NoSQL 数据库的适用场景与局限性分析
NoSQL(Not Only SQL)数据库是一类非关系型数据库,通过灵活的数据模型和分布式架构解决传统关系型数据库在扩展性、性能和数据多样性上的瓶颈。以下从技术特性、适用场景、不适用场景及行业实践展开分析: 一、NoSQL数据库的核心技术特性 四大数据模型 文档型:以JSON/BSON格…...
个人网站:基于html、css、js网页开发界面
1、注册 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>注册页面</title><link rel&qu…...
嵌入式图像采集与显示系统实战详解:基于V4L2与Framebuffer的实现
在嵌入式Linux开发中,图像采集与显示是非常典型的一类应用场景。本文将基于 ARM9(S3C2410) 平台,深入讲解如何使用 V4L2 框架从 USB 摄像头采集图像数据,并通过 Framebuffer 接口实时显示到 LCD 屏幕。内容涵盖驱动架构…...
庙算兵棋推演AI开发初探(6-神经网络开发)
碎碎念: 老师让我和同学组队参加10月底截止报名的庙算比赛,我俩走运进了64强,打的过程中发现了一个重要问题——为什么别人总能打我,但是我都看不见!就像玩dota被对面英雄莫名其妙单杀了但是他就一直隐身我都不知道怎…...