总结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. JDK 15已发布,你所要知道的都在这里!

    JDK 15已经在2020年9月15日发布!详情见 JDK 15 官方计划.下面是对 JDK 15 所有新特性的详细解析! 官方计划 2019/12/12 Rampdown Phase One (fo ...

  2. Django 的缓存机制

    一 缓存介绍: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会 ...

  3. 冲刺随笔——Day_Ten

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  4. python 爬取喜马拉雅节目生成RSS Feed

    记录于:2020年12月03日用了N年的手机在经历N次掉落之后终于扛不住了,后背都张嘴了,估计再摔一次电池都能飞出来.换了手机,由于之前有听喜马拉雅的习惯,但是手机里自带有播客软件,强迫症逼着我不能下 ...

  5. Spring Boot 集成多个 Kafka

    一.配置文件 application.yml spring: kafka: one: bootstrap-servers: IP:PORT consumer: group-id: YOUR_GROUP ...

  6. 第11.13节 Python正则表达式的转义符”\”功能介绍

    为了支持特殊元字符在特定场景下能表示自身而不会被当成元字符进行匹配出来,可以通过字符集或转义符表示方法来表示,字符集表示方法前面在<第11.4节 Python正则表达式搜索字符集匹配功能及元字符 ...

  7. 第14章 web前端开发小白学爬虫结束语

    老猿学爬虫应该是2019年7月初开始的,到现在2个多月了,有段时间了,这部分一直是老猿期待能给大家带来收获的,因为老猿爬虫实战应用的场景与网上老猿已知的场景基本都不一样,是从复用网站登录会话信息来开发 ...

  8. Flutter · Python AI 弹幕播放器来袭

    AI智能弹幕(也称蒙版弹幕):弹幕浮在视频的上方却永远不会挡住人物.起源于哔哩哔哩的web端黑科技,而后分别实现在IOS和Android的app端,如今被用于短视频.直播等媒体行业,用户体验提升显著. ...

  9. java的jdk8新特性optional怎么样使用

    从 Java 8 引入的一个很有趣的特性是 Optional  类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...

  10. Go语言的context包从放弃到入门

    目录 一.Context包到底是干嘛用的 二.主协程退出通知子协程示例演示 主协程通知子协程退出 主协程通知有子协程,子协程又有多个子协程 三.Context包的核心接口和方法 context接口 e ...