ffmpeg 怎样分析ts 流中的 sdt 表

---------------------------------------------------------
author:hjjdebug
date: 2024年 07月 24日 星期三 10:34:08 CST
descriptor: ffmpeg 怎样分析ts 流中的 sdt 表
---------------------------------------------------------
1. sdt 的概念
   sdt 就是服务描述表,就是这个表包含一个或多个服务.
   一个服务对应一个节目,所以服务就是节目的服务.
   上面听起来就是挺虎人的,
   那服务是什么呢? 
   服务就是每个频道对应的频道名称和频道供应商等信息.
   可以简单理解为就是2个字符串!!


2. ffmpeg 怎样保存sdt 表中的字符串
   由于字符串的长度并不固定,所以需要动态分配内存来保存.

    switch (desc_tag) {
    case 0x48: //0x48描述符
        service_type = get8(&p, p_end);
        if (service_type < 0) // 服务类型,0x1为数字电视业务
            break;
// getstr8 会返回动态分配的内存, 该内存的容量往往比字符串长度要大.
// 另getstr8 还会调用icon_open()函数, 该函数有动态内存分配,需调用icon_close()释放动态内存
// 这是我向下跟踪得到的.这里就不展开了.
        provider_name = getstr8(&p, p_end); 
        if (!provider_name)
            break;
        name = getstr8(&p, p_end); // 此处也是动态指针
        if (name) {
//ts->stream 是avformatContext, 先找有没有sid这个节目, 有的话直接返回program
//没有再分配节目, 有动态内存分配,要等释放AVFormatContext 时才会释放program
            AVProgram *program = av_new_program(ts->stream, sid); 
            if (program) {
            //sdt 信息保存在节目的metadata 中, program->metadata是一个字典dictionary
            //添加字典项会有内存再分配
            //而字典项key和value根据flags 可能会被复制,就是说可能有内存分配,
            //只所以要进行字符串复制是因为这里用strdup,会根据字符长度重新分配一次内存,呈紧凑字符串形式
            //它们的内存释放要等到program 被释放的时候
            //关于字典的操作还有很多细节,例如key-value已经有值了怎么办等, 可由flags控制.
                av_dict_set(&program->metadata, "service_name", name, 0);
                av_dict_set(&program->metadata, "service_provider", provider_name, 0);
            }
        }
        av_free(name);  // 释放动态内存, 保持内存平衡,因为这里的字符串存储空间往往比字符串长度大.
        av_free(provider_name);
        break;
    default:
        break;
    }

3. 这些为字符串分配的内存何时释放
   参考第2步的代码注释!
   简单说,临时用的就立即释放了,对象用的要等到对象释放时才释放,
   对象的属性也可能是不断变化的.但对sdt来讲,虽然有很多sdt表,但内容是不变的.

小结: 本博着重从内存分配的角度来描述一下sdt表的存储,是我查内存泄漏的一个小收获!
 

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

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

相关文章

提高性能的常见技术

1.数据库层面&#xff1a; 读写分离&#xff0c;对于大部分业务来说&#xff0c;读取操作要大于写入&#xff0c;同一个库&#xff0c;既读又写的话&#xff0c;负载会比较重&#xff0c;拆分为读库和写入库&#xff0c;可以降低数据库的负载&#xff0c;分时或延迟将写入的数…

AI绘画入门实践|Midjourney:使用 --seed 制作情侣头像与漫画

在 Midjourney 中&#xff0c;seed 是指一个种子&#xff0c;用于生成图像时的起点或基础。 使用格式&#xff1a;--seed 获取的seed值 获取 seed 值 使用 seed 生成图像 a cute boys avatar, background with blue sky and white cloud, Ghibli Studio style, Hayao Miyazaki…

【电子数据取证】网络钓鱼邮件取证:从识别到追踪

文章关键词&#xff1a;电子数据取证、邮件取证、电脑取证 一、前言 在数字化时代&#xff0c;电子邮件已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着技术的不断发展&#xff0c;网络钓鱼邮件这一威胁也日益猖獗&#xff0c;对个人隐私、企业安全乃至国…

Linux的RPM包 -- 制作

1.简单实现rpm包的制作 1.首先我们需要编写源代码 2.把源代码打包成压缩包 3.在自定义的路径下创建一个rpmbuild文件目录,其中必须包括有{SPECS,SOURCES,RPMS,SRPMS,BUILD,BUILDROOT}这几个文件目录 4.将压缩包存储到SOURCE中 5.在SPECS文件目录中创建一个spec file文件,对其进…

铁塔二轮充电桩协议对接稳定运营大数据面板汽车充电桩系统

信号标准名 信号类型 单位 备注 信号量ID 枚举值 告警级别新设备标准 充电口状态 遥测 0&#xff1a;待连接 05102001 1&#xff1a;空闲 2&#xff1a;充电中 3&#xff1a;已充满 4&#xff1a;异常 5&#xff1a;掉线 电压 遥测 V100 总电压放大100倍 05104001 电流 …

智能爬虫管理:定制化数据抓取方案为企业赋能

摘要&#xff1a; 在数据驱动的时代&#xff0c;精准而高效的数据抓取成为企业决策的命脉。本文将探讨如何通过定制化的智能爬虫管理方案&#xff0c;赋能企业实现数据洞察力的飞跃。我们将深入解析定制化数据抓取的核心优势&#xff0c;分享成功案例&#xff0c;并揭秘如何利…

InteliJ IDEA最新2024版下载安装与快速配置激活使用教程+jdk下载配置

第一步&#xff1a;下载ideaIC-2024.1.4 方法1&#xff1a;在线链接 IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com) 选择社区版进行下载 方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1ydS6krUX6eE_AdW4uGV_6w?pwdsbfm 提取…

vue3+g2plot实现词云图

词云图 效果预览: 核心代码: import {WordCloud } from @antv/g2plot;fetch(https://gw.alipayobjects.com/os/antfincdn/jPKbal7r9r/mock.json).then((res) => res.json()).then((data) => {const wordCloud = new WordCloud(container, {data,wordField: x,weigh…

电场、磁场、麦克斯韦方程组

电场和磁场 电场和磁场并不是一个虚拟的概念&#xff0c;而是一种确实存在的物质。法拉第提出了电场和磁场&#xff0c;法拉第认为之所以两个电荷之间有力的作用,是因为有一个电荷会在周围空间产生一种物质,这种物质叫做电场。法拉第提出&#xff1a;电场是由电荷产生的。之后人…

【笔记:3D航路规划算法】二、RRT*

目录 一、RRT*于RRT的不同之处1、路径优化&#xff1a;2、成本计算&#xff1a;3、重连线步骤&#xff1a; 二、图解1、初始化2、路径搜索3、效果展示 3D路径规划是在三维空间中寻找从起点到终点的最短或最优路径的一种技术。它广泛应用于无人机导航、机器人运动规划、虚拟现实…

Linux基础命令之用户管理常用命令

在Linux操作系统中&#xff0c;有许多用于用户管理的命令。以下是一些常用的命令 # 1、whoami 显示当前登录的用户名。 $ whoami将返回当前用户的名称。这个命令在所有Linux发行版中都可以使用。 例如&#xff0c;如果你是 root 用户&#xff0c;那么输出可能是这样的&…

Docker部署Elasticsearch8.6.0 Kibana8.6.0

&#xff08;1&#xff09;Docker部署Elasticsearch8.5.3&#xff08;失败…&#xff09; 为了匹配springboot3.0.x&#xff0c;安装Elasticsearch:8.5.3 拉取镜像&#xff0c;遇到问题&#xff01; [rootserver01 ~]# docker pull elasticsearch:8.5.3 8.5.3: Pulling from…

Modbus转EtherCAT网关将Modbus协议的数据格式转换为EtherCAT协议

随着工业自动化技术的快速发展&#xff0c;不同通信协议之间的互操作性变得越来越重要。Modbus作为一种广泛使用的串行通信协议&#xff0c;与以太网为基础的EtherCAT协议之间的转换需求日益增长。本文将从网关功能、硬件设计、性能以及应用案例来介绍这款Modbus转EtherCAT网关…

数据库-浅谈储存过程

数据库-浅谈储存过程 缘起储存过程示例小结 缘起 数据库&#xff0c;已经是这个时代大部分软件系统架构里的标配。一个可靠的数据管理系统的 ACID特性也保证了我们使用到的数据的准确性。 作为软件架构中的基础部分&#xff0c;数据库的操作不应该暴露给用户应用层。所以相关数…

第31篇 计算数据中最长的连续1的个数<一>

Q&#xff1a;如何用Nios II指令计算一个数据中最长的连续1的个数&#xff1f; A&#xff1a;基本原理&#xff1a;所有Nios II指令都是32位长&#xff0c;除了由处理器直接执行的机器指令外&#xff0c;Nios II指令集还包括许多可用于汇编语言的伪指令程序。本实验我们会用…

权限(linux)

权限就是文件权限&#xff08;linux万物皆文件&#xff09; 本文主要涉及文件/文件夹权限 涉及指令&#xff1a; shell&#xff1a; kernal &#xff1a; linux内核 shell &#xff1a; 外壳 shell可以方便交互与操作 bash是一个具体的shell su su 切换用户 su -root 变…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-1

目录 HR企业入驻 HR企业入驻 - 认证流程解析 HR企业入驻 - 查询企业是否存在 HR企业入驻 - 上传企业logo与营业执照 HR企业入驻 - 新企业&#xff08;数据字典与行业tree结构解析&#xff09; 行业tree 行业tree - 创建节点 行业tree - 查询一级分类 行业tree - 查询子分…

CSS前端面试题之哪些CSS属性可以继承?

推荐答案 在 CSS 中&#xff0c;并不是所有的属性都可以继承。下面是一些常见的可继承属性 font-family font-size font-weight font-style color letter-spacing word-spacing line-height text-align text-indent text-transform visibility 这些属件在父元素中设置后&#…

网络安全之不同阶段攻防手段(四)

前面已经说过信息收集、扫描探测以及初始访问阶段的攻防手段&#xff0c;下面将说一下在攻击者获取到访问权限的情况下会接着如何进一步在网络中建立控制点、提权、横移以及完成攻击后的遗迹隐藏。 4. 建立立足点阶段 **攻击手段&#xff1a;**攻击者通过恶意软件、远程访问工…

普中51单片机:DS1302时钟芯片讲解与应用(十)

文章目录 引言基本特性什么是RAM&#xff1f;什么是涓流充电&#xff1f; 电路图和引脚说明通信协议以及工作流程寄存器控制寄存器日历/时钟寄存器 DS1302读写时序代码演示——数码管显示时分秒 引言 DS1302 是一款广泛使用的实时时钟 (RTC) 芯片&#xff0c;具有低功耗、内置…