c++ ffmpeg如何获取RTP包中的Seq和timestamp

c++ ffmpeg如何获取RTP包中的Seq和timestamp,第1张

avformat_open_input这些代码打开文件

然后av_read_frame不停的读文件内容

然后decode,然后encode。然后avio_open打开输出文件,然后不停的将encode结果av_interleaved_write_frame到文件里。

因为在设计一个树形结构的实体中用到了多对一,一对多的映射关系,在加载其关联对象的时候,为了性能考虑,很自然的想到了懒加载。

比如:@OneToOne(fetch = FetchTypeLAZY, cascade = CascadeTypeALL)

也由此遇到了N+1的典型问题 : 通常1的这方,通过1条SQL查找得到1个对象,而JPA基于Hibernate,fetch策略默认为select(并非联表查询),由于关联的存在 ,又需要将这个对象关联的集合取出,集合数量是N,则要发出N条SQL,于是本来的1条联表查询SQL可解决的问题变成了N+1条SQL

JPA21 支持 通过@EntityGraph及其子类型@NamedEntityGraph来定义获取和负载它们可以被直接在实体类上,用来配置查询结果的获取计划获取的方式(获取/负载)可以通过@EntityGraph的type属性来进行配置

在一个实体类上定义 @NamedEntityGraph(name = "GroupInfodetail",attributeNodes =@NamedAttributeNode("members"))

在repository接口中对需要进行关联查询的方法接口上引用实体类上定义的@NamedEntityGraph

@EntityGraph(value = "GroupInfodetail", type = EntityGraphTypeFETCH)

它也可以通过@EntityGraph注解来直接点对点的指定entity graphs假如依照EntityGraph attributePaths可以被正确的找到,就可以不用在实体类上写@NamedEntityGraph注解了

@EntityGraph(attributePaths ={"certData"})

在hibernate的query接口查询出一个list后

list里有两个方法

listsetFirstResult(int a);

listsetMaxSize(int a);

第一个方法用来设置当前页要显示的第一条记录是从哪一个记录开始的

第二个方法用来设置每页的最大记录数

通过这个就足以实现分页了,先实现了功能再说吧,这样做反正是不太好呵呵

这是JPA或者hibernate注解生成主键方式中的一种:序列。不过这个要用Oracle数据库才行,好像DB2也有序列这个概念,我说的是在SQLServer、mysql、Oracle这三类数据库中的。一般Oracle用的是序列生成主键。

这个注解SequenceGenerator的意思是:用序列seq_sys_office生成主键,初始化值为200,也就是说第一个生成的主键值为200。在这个注解的源码当中好像默认增长值是50,也就是第二个主键值是250,依次类推。你可以调整它的增长值allocationSize=1

        JPA中使用原生sql查询出的结果中每一条记录是object数组,如下所示

        String sql = "select id,group_name from form_temp_type";

        Query query = entityManagercreateNativeQuery(sql);

        List<Object[]> list = querygetResultList();//最终的结果集是object数组

        我们在使用的时候需要从数组中逐个取出,比较麻烦。很多情况下我们需要的是对象或者Map

       String sql = "select id,group_name from form_temp_type";

        Query query = entityManagercreateNativeQuery(sql);

        queryunwrap(SQLQueryclass)setResultTransformer(TransformersALIAS_TO_ENTITY_MAP);

        List<Map> list = querygetResultList();//这里的结果是Map,我们可以通过字段名称获取到相应的值

public static List findRelatives(Stringsql,Map<String,Object>params,EntityManagerentityManager,Class<>clazz){

        Sessionsession=entityManagerunwrap(Sessionclass);

        NativeQueryquery=sessioncreateNativeQuery(sql);

        queryunwrap(NativeQueryImplclass)setResultTransformer(TransformersaliasToBean(clazz));

        for(Stringkey:paramskeySet()){

                Objectvalue=paramsget(key);

                querysetParameter(key,value);

        }

        entityManagerclose();

        returnquerygetResultList();

}

thisemployee_id = employee_id;}} 其它几个属性的getter和setter省略,这里我们要用到ejb3-persistencejar,JPA的注解类就在这个包中,下面详细说明上面使用到的注解。@Entity:通过@Entity注解将一个类声明为一个实体bean@Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名)@Id:用于标记属性的主键@Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如:@Column(name = EMPLOYEE_NAME)private String employee_name; 或者@Column(name = EMPLOYEE_NAME)public String getEmployee_name() {return employee_name;} 这两种方式都是正解的,根据个人喜好来选择。大象偏向于第二种,并且喜欢将属性名与字段名设成一样的,这样可以省掉@Column注解,使代码更简洁。@TableGenerator:表生成器,将当前主键的值单独保存到一个数据库表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式是很常用的。这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。大象推荐这种方式管理主键,很方便,集中式管理表的主键,而且更换数据库不会造成很大的问题。各属性含义如下:name:表示该表主键生成策略的名称,这个名字可以自定义,它被引用在@GeneratedValue中设置的generator值中table:表示表生成策略所持久化的表名,说简单点就是一个管理其它表主键的表,本例中,这个表名为GENERATOR_TABLEpkColumnName:表生成器中的列名,用来存放其它表的主键键名,这个列名是与表中的字段对应的pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义滴valueColumnName:表生成器中的列名,实体表主键的下一个值,假设EMPLOYEE表中的EMPLOYEE_ID最大为2,那么此时,生成器表中与实体表主键对应的键名值则为3allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50@GeneratedValue:定义主键生成策略,这里因为使用的是TableGenerator,所以,主键的生成策略为GenerationTypeTABLE,生成主键策略的名称则为前面定义的”tab-store”。这里大象想说下,网上有很多文章写的是strategy = GenerationTypeAUTO或是strategy = GenerationTypeSEQUENCE,采用SEQUENCE序列是因为Oracle数据中不支持identity自动增长,要想使用它,还得在数据库中创建一个序列,如果要更换数据库,那将是一个非常麻烦的事情。SEQUENCE生成方式我们暂且不谈,这里说下采用AUTO和IDENTITY的生成方式,本例采用的是SQL Server 2000作为数据库,所以如果想使用AUTO或是IDENTITY生成策略,则一定要对主键加上identity标识,如identity(1,1)。不过对于AUTO来说,是根据不同的数据库选择最合适的自增主键生成策略。如果使用MySQL,则主键要定义AUTO_INCREMENT,如果是Oracle,则要创建Sequence来实现自增。不管采用何种生成策略,增、删、改这些方法中一定要加入事务,否则数据是不会添加到数据库中滴~~~这是大象反复测试过的结果!

大约一年以前 我为了学习一些Hibernate专业知识 因此我参加了一个Hibernate项目 从那时起 我一直在使用Hibernate框架下的JPA(Java持久API)实现 使用的思想仍就是一样的 那个项目使用了一个数据库 这个数据库规模有些大 略显落后 并且还被许多的应用程序共用 为了尽快加入到项目中 我开始学习一些Hibernate知识 从书本上的例子开始学习 感觉很简单 学起来也很快 但是发现从零开始开发一个项目 并且控制它又是另外一回事了 试着在一个大型 复杂 被许多应用程序共用的数据库上使用Hibernate就又完全不同了 弄清楚了我可能遭遇到的技术难点 我开始想别的招了 要尽快从另外的方向开始 克服困难

在最终的学习和实践中 我发现我还是学到了许多重要的东西 虽然我们的项目还没有完全做完 但是我认为我们目前已经非常漂亮的应用了Hibernate/JPA的一些思想 现在我需要重新思考反省我所学到的东西 如下便是我学到的一些心得

)和数据库管理员成为朋友

目前存在一个趋势 就是一些Java开发者忽视数据库管理员的重要性 这便犯了一个很大的错误 对于要取得任何的ORM(对象关系映射)技术的成功 和数据库管理员保持一个良好的工作关系是至关重要的 有如下两个原因

单独数据库管理员虽然不能使Hibernate项目成功 但是他们通常可以让这些项目失败

数据库管理员对数据库本身具有很好的洞察力 很好的职业习惯 告诉你一些易犯的错误和 *** 作建议 我能记起这样的很多例子 一个数据库管理员的建议节约了我们很多的时间和提供给我们一个很好的解决方案

在大多数情况下 拥有好的数据库管理员 并且和他们保持良好的关系对你ORM(对象关系映射)工作至关重要

)从一开始使用(最好强制使用)好的命名标准

我们知道对命名标准的讨论将会有争议的 但是我们必须明确一件事情 我们的命名要让我们的数据模型有意义 这能让开发者使用起来简单 以免他们迷惑 所以 如何命名实体和属性是非常重要的 我有我喜欢命名标准 并且认为他们是最好的 但是在这里我不想把他们强加于你们 最重要的是你自己做出决定使用什么样的命名标准 并且让所有人使用它 实际上 不仅仅命名标准需要统一 其它的也需要(如 布尔型用 Y/N 或者 / 表示)

)不要试着映射所有的属性

我们总是设法使用工具 如Dali来映射所有的东西 然后形成一张表格(一些表格有上百列 !) 这最终会很麻烦 为什么?因为我们使用的是共用的 先前的数据库 有许多的字段是我们并不关心和从来不使用的 映射它们只会导致性能问题和造成混乱

)让数据库做自己擅长的工作

我们想有一个好的 清晰的数据模型 因此我们不惜任何代价写一些额外的查询语句来获取对象相关数据 要么使用存储过程 要么使用函数 这是做法是错误的 数据库优势在于存储 而不是保持Hibernate创建或读写的数据 举个例子 我们有一个对象 与之相关联的有一个状态 这个状态在整个应用程序中都要用到 因此 它毫无疑问是要执行的 但是 我们不想每次都要单独的写一个查询语句 这个问题在于 这个状态是从一些统计计算中派生出来的 并且这些统计计算需要用到一对多的关系 每次从加载的对象中读取数据的代价是非常高的 后来跟我们其中的一位数据库管理员交流了一下 发现一个我们可以使用的sql函数能够很快的获得该状态 我们使用@Formula来映射成一个状态属性 就能得到我们所需要的所有东西 这仍就是域模型的一部分 但是执行起来非常好 有时像这样的一个折衷的办法能够起到很大的效果

)分解数据库

在一开始 我就想在Hibernate中模型化整个数据库 结果发现这是不切实际的 原因如下 a)这是一项巨大的工程 并且要花费几周的时间 而用户根本看不到你做了什么实际的工作

b)我不可能在第一次就把它弄好 后继的开发者无论如何都会修改它们的

现在有一个趋势 就是希望在开始之前 将所有的事情都进行映射 但是 当时你开始这么做后 你不需在这上面花很多的时间 我后来发现一个好的办法 就是将数据库分解 工作的时候一块一块的进行 发现这很有帮助

)密切注意触发器

密切注意数据库触发器有如下两个原因

a)在后台触发器很隐蔽的执行了一些功能 让你很是疑惑 不知道发生了什么

b)当你在Hibernate端需要复制一些东西的时候 触发器会做一些手脚 之前我们好几次没有认识到这个教训 导致我们丢失了很多数据 这些都是由触发器引起的 这几乎让我们很是郁闷

)避免使用工具来自动生成你的模型

没错 这些工具的使用可以节约时间(虽然我们发现了Dali有一个很严重的bug 但是我们还是使用它) 但是最后你不得不重新做很多的事情 其实手动也花费不了你很多的时间 当你亲自做的时候 这可以让你有机会熟悉那些数据

) 尽量多的使用命名查询语句(NamedQueries)

虽然很容易写查询语句 但是在许多的情况下 使用NamedQueries会更好 这会有助于你完成两件事情

a)它能更加重用 因为被命名的查询语句通常在代码的重要地方

b)你的查询语句在开始的时候就是正确的 那么在查询语句中的错误更加容易发现

要习惯这样做需要花一些时间 但是这么做是值得的

)预期管理

对于任何一种框架 技术 甚至观念来说 这是非常重要的 要铭记在心 由于某些原因 人们倾向于专注某一个特征 这些特征实际上或许不存在 或许被夸大 有时它很小 很容易理解(举个例子 理解一些实际的工作 需要在Hibernate中映射) 有时我也不知道他们是如何管理实现一些概念(如Hibernate是如何管理计划修正的) 无论如何 找到预期目标是什么 然后管理它们是非常重要的 如果你的团队认为Hibernate会使得数据库管理员没有用处 把他们解雇 那么你将会有一个潜在的问题存在

)使用富域模型(rich domain modeling)

lishixinzhi/Article/program/Java/ky/201311/28274

以上就是关于c++ ffmpeg如何获取RTP包中的Seq和timestamp全部的内容,包括:c++ ffmpeg如何获取RTP包中的Seq和timestamp、jpa 关于懒加载的问题、在JPA进行分页查询时,Query接口中的什么方法用于设定需要获取的总行数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9800113.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存