总结TS文件格式,早在几个月前就有了这个想法,但一直拖到今天才真正准备写一篇博文来介绍。

再不介绍的话,估计几月后又要去故纸堆里翻东西了,毕竟个人笔记中总结记录的东西太多,搞不好哪天给意外弄丢了。

1. Android的实现

  本次博文(下个博文介绍细节吧)以Android实现的MPEG2TSWriter.cpp来介绍,其包括两部分功能:ts_muxer + writer,前者是文件格式封装,

后者是写数据到文件。如果想读懂Android的实现,则需要对native层多媒体开发的基础库——foundation的实现有一定的了解,尤其是AMessage/

ALooper/AHandler/HanderReflect这些Android消息处理模型,否则,你可能都不知道函数调用到哪儿了。

  当然,为了理解消息处理模型,我特地写了一个demo,抛开文件封装的细节来验证Android的消息模型。

  同时,我也用另外一种方式,抛开Android依赖,使用C语言,实现了一个ts_muxer,参考这个。这个实现的封装格式细节,大部分是移植Android

的,当然,为了解决诸多兼容性问题,加入了我的一些优化。有需要的可以拿去,就当我是雷锋。。。

2. TS格式是什么?有什么特点?

  TS格式跟MP4格式类似,是一种视频文件封装格式(当然,内部可以有声音数据)。

  TS格式的存在,有其核心竞争力——录制中系统crash,已存入存储设备的数据,仍能回放。相反,MP4封装格式数据写入过程中,如果意外终止,

那么前面写入的数据就都废了,不能播放。

3. TS与MP4封装格式差异

  上面第2条给出了结论,但是为什么是这样的结果?答案是——封装格式差异导致其能否在中断后进行回放。

  再进行更细节解释:

  3.1. MP4这种封装格式,只有在写完最后一笔音视频帧后,由其用户发起结束封装,才能写入文件头数据。因此,假如还没写头就意外crash,

文件头自然就写不到文件中,也就不能进行播放。

  3.2. TS这种封装格式,每写入一帧数据,都会将头数据和编码数据一起打包,写入到文件中。而在播放时,即使某帧数据异常,而该帧后面的帧只要数

据正常,根据头信息,仍能抽取出该编码帧,就可以进行解码了。

  3.3. 能否播放的一个前置条件是,能否从文件中抽取完整的编码帧出来,能的话就可以恢复回放,不能的话就无法回放。

4. 一个形象的比喻

  上面第3段是用比较专业的术语来回答能否回放以及背后原因,但作为一个外行人来看,可能还是一头雾水,那么我就做个形象的比喻来讲背后的机制。

  毕业论文,我们都写过,目录整理,是在什么时候做的?

  当然是在每一个章节都仔细校对、排版完成后,才能进行!因为目录里要加入每一个章节的开始页码!

  对了,MP4就是类似一本书,用文件头记录每一帧的起始地址、大小、时间戳等信息。

  TS格式呢?其实也是类似一本书,但是这本书是特制的,现在读书的小朋友已基本不再使用了,那就是——毛笔字练习本。每一页只能写固定数量的字,

如果欲写入的一段故事内容已经完成,该页还空着几个空格,那么就留空吧!下一个故事必须从下一页开始写起。

  而TS文件格式呢,是按照188Bytes的包来写的,一个编码帧肯定不止188个字节(aac音频帧除外),因此,一个编码帧通常打包到若干个188Bytes的

基础包中,而在解封装(demux)时,再从这若干个188Bytes基础包中抽取出来。每帧的第一个188Bytes的包,会加入一些同步字节来标记帧类型、帧时间

戳等信息,用于分割前后不同的编码帧。

5. 应用场景

  TS这种格式,通常用于误码严重的场景中,因为方便找到同步字节进行恢复。

  例如,电视台的无线信号,传到家用电视机里,由于信道不稳定,可能产生了误码,这个没事,干脆就把该帧数据丢掉不要即可,等到检测到下一帧的

同步起始包,再进行新包的数据提取。再比如,行车记录仪类产品,一般也用该封装格式,当撞车发生时,记录仪设备可能瞬间物理损坏,如果是mp4格式,

则不能查看事故前的视频图像。

MPEG2TS文件格式概述的更多相关文章

  1. InnoDB Plugin文件格式(概述)

    本文将介绍InnoDB Plugin数据表格式的基本概念. 1. 配置参数innodb_file_format 这是一个很容易混淆的概念.目前,在InnoDB Plugin(1.0.6)配置文件中in ...

  2. Linux课程实践四:ELF文件格式分析

    一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...

  3. (2) 深入理解Java Class文件格式(一)

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/21486985 Class文件在Java体系结构中的位置和作用 在上一篇博客中, 大致讲 ...

  4. Mysql 行存储的文件格式

    一.Mysql行存储的文件格式概述 InnoDB存储引擎有两种文件格式 Antelope:compact与redundant两种行记录格式 Barracuda:compress与dynamic两种行记 ...

  5. 多媒体文件格式之RMVB

    [时间:2016-07] [状态:Open] RM/RMVB是Real公司私有的封装格式,常见的后缀形式是rm.ra.rmvb. 通常封装的都是real转悠的编码格式,比如音频中的sipro.cook ...

  6. Linux及安全实践四——ELF文件格式分析

    Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...

  7. 文件格式-CVS:CVS

    ylbtech-文件格式-CVS:CVS 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文 ...

  8. Hadoop、Pig、Hive、Storm、NOSQL 学习资源收集

    (一)hadoop 相关安装部署 1.hadoop在windows cygwin下的部署: http://lib.open-open.com/view/1333428291655 http://blo ...

  9. 深入理解java虚拟机---Class文件(二十)

    无符号数.表 当实现了不同语言的编译器,比如jython,jruby等等,那么就可以利用这些语言编写代码,通过各自的编译器编译成符合jvm规范的字节码文件,就可以利用jvm来执行了. Class文件在 ...

随机推荐

  1. 小知识点 之 JVM -XX:MaxGCPauseMillis 与 -XX:GCTimeRatio

    写在前边 JVM调优更多是针对不同应用类型及目标进行的调整,往往有很大的实验成份,通过实验来针对当前应用设置相对合适的参数,提高应用程序的性能与稳定性 最近在复习JVM,Parallel Scaven ...

  2. sentinel降级误解

    public void initDegradeRule(){ List<DegradeRule> rules=new ArrayList<>(); DegradeRule ru ...

  3. Java进阶专题(十八) 系统缓存架构设计 (下)

    前言 上章节介绍了Redis相关知识,了解了Redis的高可用,高性能的原因.很多人认为提到缓存,就局限于Redis,其实缓存的应用不仅仅在于Redis的使用,比如还有Nginx缓存,缓存队列等等.这 ...

  4. 初学者值得拥有Hadoop单机模式环境搭建

    单机模式Hadoop环境搭建 Hadoop环境搭建流程图 具体过程 文章目录 单机模式Hadoop环境搭建 Hadoop环境搭建流程图 具体过程 1.搭建准备工作 (1)关闭防火墙 (2)关闭seli ...

  5. 【入门】ZooKeeper 相关概念总结

    1. 前言 相信大家对 ZooKeeper 应该不算陌生.但是你真的了解 ZooKeeper 到底有啥用不?如果别人/面试官让你给他讲讲对于 ZooKeeper 的认识,你能回答到什么地步呢? 拿我自 ...

  6. 第2.2节 Python的语句

    上节已经介绍了极简的Python代码编写,已经用到了赋值语句,本节对Python的程序语句进行介绍. 一. 常用命令 在介绍Python语句之前,先介绍一下几个有用的Python命令. dir(模块名 ...

  7. PyQt(Python+Qt)学习随笔:Qt Designer中怎么给toolBar添加按钮

    在Designer中创建了一个MainWindow窗体,当想在其中的toolBar中添加toolButton时发现怎么也放不上去,最终才发现toolBar中的按钮只能通过直接拖拽Action编辑器中的 ...

  8. Python Flask后端异步处理(一)

    Flask是Python中有名的轻量级同步Web框架,但是在实际的开发中,可能会遇到需要长时间处理的任务,此时就需要使用异步的方式来实现,让长时间任务在后台运行,先将本次请求的相应状态返回给前端,不让 ...

  9. typora字体与字体颜色

    字体 基本格式:\字体信息{内容} 罗马体\rm \rm{罗马体abc}>>\(\rm{罗马体abc}\) 意大利体\it \it{意大利体}>>\(\it{意大利体}\) 等 ...

  10. CF1320 Div1 D.Reachable Strings 题解

    题目大意 给定一个长为\(n\)的01串\(S\),每次你可以对一个串的三个连续位置做:\(011 \rightarrow 110\),\(110 \rightarrow 011\)的操作. 有\(q ...