FFmpeg简单使用:过滤器 ---- h264_mp4toannexb

news2025/1/15 13:46:28

H264有两种封装方式:字节流AnnexB格式 AVCC格式。

1. AnnexB格式 ---- 用于实时播放

开始前缀(00000001或000001)+NALU数据  绝大部分编码器的默认输出格式
  一共有两种起始码start_code
   ①3字节0x000001  单帧多slice(即单帧多个NALU)之间间隔
   ②4字节0x00000001 帧之间,或者SPS等之前
4字节类型的开始码在在连续的数据传输中非常有用,因为用字节来对齐、分割流数据,比如:用连续的31个bit0后接一个bit1来分割流数据,是很容易的。

AnnexB格式每个NALU都包含起始码,且通常会周期性的在关键帧之前重复SPS和PPS
  👉👉👉所以解码器可以从视频流随机点开始进行解码,实时的流格式

 2. AVCC格式 ---- 用于存储

AVCC格式不使用起始码作为NALU的分界,这种格式在每个NALU前都加上一个大端格式的前缀(1、2、4字节,代表NALU长度)

所以在解析AVCC格式的时候需要将指定的前缀字节数的值保存在一个头部对象中,这个都通常称为extradata或者sequence header。同时,SPS和PPS数据也需要保存在extradata或者叫’sequence header’中。

3.AVPacket数据格式

AVPacket中的data格式是:size(4个字节)+ nalu + size(4个字节)+ nalu,一个packet可能会存在多个nalu,前面size表示nalu的大小(不包含自身)

图1.

如图1所示,前4个字节表示:第一个nalu大小是0x52d = 1325, 总的pkt的大小是66736。表示存在多个nalu。下一个nalu位置:0x7dc0 + 0x025d + 4 = 0x8021,如图2所示

图2.

 4.AVPacket转换为 AnnexB,使用h264_mp4toannexb

编码:

// 1 获取相应的比特流过滤器
    // FLV/MP4/MKV等结构中,h264需要h264_mp4toannexb处理。添加SPS/PPS等信息。
    // FLV封装时,可以把多个NALU放在一个VIDEO TAG中,结构为4B NALU长度+NALU1+4B NALU长度+NALU2+...,
    // 需要做的处理把4B长度换成00000001或者000001
    // annexb模式: startcode 00000001 AVCC模式: 无startcode (mp4 flv mkv)
    const AVBitStreamFilter *bsfilter = av_bsf_get_by_name("h264_mp4toannexb");
    AVBSFContext *bsf_ctx = NULL;
    // 2 初始化过滤器上下文
    av_bsf_alloc(bsfilter, &bsf_ctx); //AVBSFContext;
    // 3 添加解码器属性
    avcodec_parameters_copy(bsf_ctx->par_in, ifmt_ctx->streams[videoindex]->codecpar);
    av_bsf_init(bsf_ctx);
   // 4 发送和接受if (av_bsf_send_packet(bsf_ctx, pkt) != 0) // bitstreamfilter内部去维护内存空间
    {
          av_packet_unref(pkt);   // 你不用了就把资源释放掉
          continue;       // 继续送
    }
    av_packet_unref(pkt);   // 释放资源
    while(av_bsf_receive_packet(bsf_ctx, pkt) == 0)
    {
          out_pkt_count++;
          // printf("fwrite size:%d\n", pkt->size);
          av_packet_unref(pkt);
     }

 

我们看看filter之后的数据:

图3.

 我们可以看到,和图1相比size变为00 00 00 01.下面我们看下一帧

图4.

 

 

 我们可以看到,下一个并不是简单变为00 00 00 01,而是插入了一个nalu,再下一个nalu(f885位置),才是之前的nalu。我们分析一下中间插入的nalu,看第一下第一个字节表示nalu header.

NALU header格式:

0x67:

F:0 默认为0

R :11 表示这个帧很重要

T:7 表示SPS,到这里可以看出,插入了一个filter

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

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

相关文章

C++面向对象特性——多态

C面向对象之多态什么是多态?为什么使用多态?虚函数的定义虚函数的实现机制哪些函数不能被设置为虚函数?虚函数的访问指针访问引用访问对象访问成员函数中的访问构造函数和析构函数中访问纯虚函数抽象类虚析构函数重载、隐藏、覆盖菱形继承虚拟…

spring boot文档阅读笔记——01

目录标题一、文档地址二、第一个spring boot例子三、 Starters(spring boot 官方提供的启动器)四、SpringBootApplication注释(一)EnableAutoConfiguration(二)ComponentScan五、devtools(热插拔…

当项目经理看世界杯决赛时…

12月18日,2022卡塔尔世界杯决赛,阿根廷在点球大战中击败卫冕冠军的法国队,捧走大力神杯。这场跌宕起伏的“巅峰对决”,给大家呈现了一场精彩绝伦的比赛。 当阿根廷2-0领先七十多分钟的时候,都以为这局稳了&#xff0c…

跨平台应用开发进阶(五十一):HTML5(富文本内容)连续数字、字母不自动换行问题分析及解决

文章目录一、前言二、问题分析三、解决方法3.1 对 input 标签设置3.2 对 input 标签内的 p 标签设置四、延伸阅读 顶部状态栏穿透问题五、拓展阅读一、前言 项目开发过程中,涉及在Web端维护富文本内容,通过APP端查看的相关的功能,功能描述大…

repo init详解

首先选择manifest源,一般直接使用清华或中科大的镜像源 repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest是清华提供的镜像源 repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest是中国科学技术大学的镜像源 repo init推荐使用-b 分…

未来汽车产业新生态高峰论坛在深圳举行

【2022年12月22日发自深圳】汽车产业正面临百年未有之大变局,以数字化技术为特征的智能网联汽车已经成为全球汽车产业转型升级的战略方向。汽车的属性也从一个机械化的交通工具转变成与各个生态相互连通的移动终端和数字空间。12月21日,由工业和信息化部…

【C++初阶】模板进阶

文章目录非类型模板参数模板特化函数模板特化类模板特化全特化偏特化模板的分离编译模板总结所有测试的代码非类型模板参数 模板参数分类类型形参与非类型形参 1.类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 2.非类型形…

创建城市人口总量趋势图

创建城市人口总量趋势图学习目标使用数据人口总量趋势方程数据导入对数据进行处理fct_reorder2的应用对数据进行整理对图像进行可视化操作使用fct_reorder2去掉趋势点内容小结学习目标 我们所采用的学习内容来自B站的Lizongzhang老师的R语言的学习分享 今天学习的主要内容是关…

数据集说明:COCO的两个数据集COCO-stuff和COCO-Caption

数据集图片数量比较 COCO-Caption有33万张图、50万个caption COCO-Stuff有16.4万张图 172个类别(80thing、91stuff、1个未标注类) COCO-stuff的具体类别说明 COCO-Stuff contains 172 classes:80 thing, 91 stuff, and 1 class unlabeled. The 80 thing classes are the same …

群晖nas部署python项目

事件起因是因为想再硬盘里下载小姐姐,在线播放会卡顿很不爽, 开始用一些在线爬的网站,网速非常慢,我发现自己有nas 如果把项目部署再nas上 通过命令行下载就好了 我就开始检索资料,发现网上的都是一些过时的文章&#…

分布式系统关键路径延迟分析实践

作者 | 月色如海 导读 随着对用户体验的不断追求,延迟分析成为大型分布式系统中不可或缺的一环。本文介绍了目前在线服务中常用的延迟分析方法,重点讲解了关键路径分析的原理和技术实现方案,实践表明此方案效果显著,在耗时优化方面…

图解深度学习-提高泛化能力的方法

数据集 在深度学习的训练过程中,神经网络的类型和结构固然重要,但训练样本才是重中之重。 数据增强 当训练样本数量较少时,可以通过数据增强来增加样本的多样性。 数据增强就是通过对样本图像进行平移、旋转、镜像翻转等方式进行变换。除…

【Java】Log4j日志

目录 1.日志概述 日志是什么 为什么会有日志 2.log4j概述 什么是log4j 版本 3.log4j入门案例 步骤 实现 总结 4.log4j1详情:记录器rootLogger 5.log4j1详情:日志级别 6.log4j1详情:输出源appender ConsoleAppender FileAppend…

第二十八章 数论——扩展欧几里德算法与线性同余方程

第二十八章 扩展欧几里德算法一、裴蜀定理1、定理内容2、定理证明二、扩展欧几里德定理1、作用2、思路3、代码三、线性同余方程1、问题2、思路3、代码一、裴蜀定理 1、定理内容 对于任意整数aaa和bbb,一定存在整数xxx,yyy使得axbyaxbyaxby是gcd(a,b)gc…

Linux的基本指令

前言 相对于linux操作系统,其实window也是操作系统,我们这节课说的是Linux的基本指令 那么在window上有没有基本指令呢,答案是有的,我们可以使用windowsr进入cmd就可以用我们的基本指令 基本指令 在本文中,我们基本上都使用类比的…

基于threeJS实现圣诞节孔明灯效果

1.效果图 2.实现思路 使用three.js的套路几乎是固定的: 1 初始化场景(scene) 2.创建透视相机(camera) 3.设置相机位置(position) 4.创建纹理加载器对象(texture) 5.创建…

【SegNeXt】语义分割中对卷积注意力设计的反思

目录 1.摘要 2.相关工作 2.1语义分割 2.2多尺度网络 2.3注意力机制 3.网络结构 3.1卷积编码器 3.2解码器 4.实验 个人总结: 论文链接:论文 代码链接:代码 论文发表于NeurIPS 2022,值得注意的是,在Transforme…

UVM入门和进阶实验0

一. 概述 UVM学习流程仍然按照SV时候的核心流程,即: 如何搭建验证框架验证组件之间的连接和通信如何编写测试用例,继而完成复用和覆盖率的收敛 我们UVM入门和进阶实验0还是同之前SV验证实验0思想一样,让大家通过简单的实验要求…

学习HTTP协议,这一篇就够啦 ~~

HTTP协议一、什么是HTTP1.1 应用层协议1.2 HTTP1.3 HTTP协议的工作过程二、HTTP协议格式2.1 Fiddler抓包工具2.2 协议格式三、HTTP请求 (Request)3.1 认识 "方法" (method)3.1.1 GET 方法3.1.2 POST 方法3.1.3 GET和POST比较3.1.4 其他方法3.2 认识URL3.2.1 URL基本格…

基于迅为3568开发板的多屏同/异显动态方案

iTOP-RK3568开发板采用四核Cortex-A55处理器,芯片内置VOP控制器,支持HDMI、LVDS、MIPI、EDP四种显示接口的多屏同显、异显和异触,可有效提高行业定制的拓展性。 iTOP-RK3568开发板支持以下屏幕: 迅为 LVDS 7 寸屏幕 迅为 LVDS …