精华内容
下载资源
问答
  • Fragment mp4 优点 与TS对比

    千次阅读 2018-06-09 15:56:26
    MPEG-DASH 整个标准对fMP4这种格式的强烈倾向性。HLS倒是一直喜欢和TS打交道,不过在最新的标准中,也加入了对fMP4的...媒体数据与元数据的分离在mp4格式中,元数据可以媒体数据很好地分开存储,后者都在mdat b...

     MPEG-DASH 整个标准对fMP4这种格式的强烈倾向性。HLS倒是一直喜欢和TS打交道,不过在最新的标准中,也加入了对fMP4的支持。大家可能会有疑惑,好好的TS格式已经用了有20年了,这些新时代下的streaming协议干嘛还要搞一个新格式来用呢?本文就来简单介绍一下fmp4相对于ts的各种优点。

    媒体数据与元数据的分离

    在mp4格式中,元数据可以和媒体数据很好地分开存储,后者都在mdat box中,而在ts中,诸多es流和header/metadata信息是复用在一起的。(TODO:介绍ts中的metadata信息怎么存储)。 
    元数据的分离允许我们在streaming中先读取各个流的元数据,知道他们的媒体内容的属性(比如不同的视频质量、不同的语言等),从而可以更好地在不同的media data之间做自适应切换。 
    当然,在更实际的应用场景中,比如在dash协议中会直接把这些元数据信息写在mpd中,player可以只读一个mpd就知道各个媒体数据的属性

    各个Track独立存储

    在fmp4中,不仅媒体数据和metadata相互独立的存储,音视频track的数据也可以分开存储,这里的“分开”已经不仅仅局限于box层面的分开,而是真的可以分开存储于不同的目录。在这种情况下,player只需要读一个记录了它们各自存储位置的manifest,即可去对应的位置download它们的分片,只要做好音视频分片之间的同步工作,就可以正常的播放。 
    举个例子,下面是一个dash中常见的mpd: 
    这里写图片描述
    在这个mpd中我们看到视频的分片都是存储在video/1/这个目录下,而音频分片都存储在audio/und/mp4a/1这个目录下,而player还是可以将它们拼接到一起完成播放。 
    相对地,在streaming TS流时,音视频往往是复用在一起的,以HLS这个应用场景为例的话,server端一定还需要提前将TS切片做好,这样就会带来几个问题: 
    1. 媒体文件存储成本和媒资管理成本增加 
    假设server端将video track编码为三个质量级别V1, V2, V3,audio track也被编码为三个质量级别A1, A2, A3,那么如果利用fmp4格式的特性,我们只需要存储这6份媒体文件,player在播放时再自主组合不同质量级别的音视频track即可。而对于TS,则不得不提前将3x3=9种不同的音视频复用情况对应的媒体文件都存储到server端,平白无故多出三份文件的存储成本。实际中,因为要考虑到大屏端、小屏端、移动端、桌面端、不同语言、不同字幕等各种情况,使用TS而造成的冗余成本将更加可观。同时,存储文件的增加也意味着媒资管理成本的增加。这也是包括Netflix在内的一些公司选择使用fmp4做streaming格式的原因。 
    2. manifest文件更加复杂 
    fmp4格式的特性可以
    确保每一个单独的媒体分片都是可解密可解码的(当然player需要先从moov box中读到它们的编解码等信息),这意味着server端甚至根本不需要真的存储一大堆分片,player可以直接利用byte range request技术从一个大文件中准确地读出一个分片对应的media data,这也使得对应manifest(mpd)文件可以更加简洁,如下: 
    这里写图片描述
    针对不同语言的音频,都只需要存一个大文件就够了。 
    相对地,在streaming TS流时,不得不在manifest(m3u8)文件中把成百上千个ts分片文件全都老老实实地记录下来。 
    3.服务器的cache效率会降低 
    实际的streaming应用场景中,往往需要cdn的支持,经常会被client请求的媒体分片就会存在距离client最近的edge server上。对于fmp4 streaming的情况,因为需要的文件更少,cache命中率也就更高,举个例子:可能某一个audio track会和其他各种video track组合,那么就可以将这个audio track放在edge server上,而不用每次都跟origin server去请求。 
    相对地,在streaming TS流时,
    因为每一个音视频组合的都需要以复用文件的形式存储,组合数又非常多,相当于分母大了,edge server就会有很大的几率没有缓存需要的组合而要去向orgin server请求。

    对Trick-play的支持

    所谓Trick-play,就是快进、快退、直接跳到章节起点、慢动作播放这些“花式”播放功能。支持这些功能往往意味着要快速找到播放流中的关键帧,以快进播放为例,如果利用fmp4格式的特点,可以通过只读取每个媒体分片的moof加上mdat的起始(包含了关键帧图像)部分即可,说白了就是通过只显示关键帧的方法达到“快进”的视觉效果。因为fmp4格式中可以保证每一个分片一定是以IDR帧开始的,这就使得上述的方案实现起来非常方便。 
    相对地,在streaming TS流时,没有办法保证关键帧一定在什么位置,所以你可能需要解析一大堆TS packets才能找到关键帧的位置。

    无缝码流切换

    无缝码流切换实现的关键在于:当第一个码流播放结束时,也就是发生切换的时间,第二个码流一定要以关键帧开始播放。在streaming TS流时,因为不能保证每一个TS chunk一定以关键帧开始,做码流切换时就意味着要同时download两个码流的相应分片,同时解析两个码流,然后找到关键帧对应的位置,才能切换。同时下载、解析两个码流的媒体内容对网络带宽以及设备性能都形成了挑战。而且有意思的是,如果当前网络环境不佳,player想要切换到低码率码流,结果还要在本来就不好的网络环境下同时进行两个码流的下载,可谓是雪上加霜。 
    而在fmp4中,除了保证各个分片一定以IDR帧开始外,还能保证不同码流的分片之间在时间线上是对齐的。而且
    streaming fmp4流时因为不要求音视频复用存储,也就意味着视频和音频的同步点可以不一样,视频可以全都以GOP边界作为同步点,音频可以都以sync frame作为同步点,这都使得无缝码流切换更简单。 
    TODO:介绍在分片中间进行切换的情况

    与DRM的集成

    所谓DRM即数字版权管理,说白了就是对流进行加密,这东西在国内用的不多,但是在国外可是每一个内容提供商必须要有的东西。和编码标准一样,业界也存在很多DRM方案,为了避免每采用一个新的加密方案就要重新编一个码流,MPEG推出了通用加密(CENC)标准(23001-7 - Common Encryption)。使用这一标准的码流,就可以将一个码流应用于各种不同的DRM方案。在DASH spec中,也定义了Content Protection字段来对应这种加密方案。 

    CENC使用的就是fMP4格式,这是利用了fMP4中音视频可以不复用同时还能提供独立于media data存储的metadata的特点。TS流就享受不了这样的好处了。TODO:介绍TS应用DRM的方法。


    我觉得还有一种优势,就是如果发现fmp4中哪一个地方需要删减界面或者增加内容,可以减少mpd的改动。这点是比regular MP4好的地方

    结语

    在以前的广播时代,每一个用户(player)只是被动的接收、播放码流,服务端可以简单地把一种码流推给所有用户(一对多),而如今的streaming,用户(player)的主动性更强,会根据自己的环境请求各种各样的码流(一对一),整个client-server模型都复杂了很多,在这样的背景下,TS流也就难免会有力不从心的时候。


    展开全文
  • 一个简单的纯 java MPEG-TS 媒体,具有流畅的 API。 例子: // Set up packet source MTSSource movie = MTSSources . from( new File ( " /Users/abaudoux/movie.ts " )); // Set up packet sink. We ...
  • 用TypeScriptJavaScript编写HTML5 MPEG2-TS流播放器。 mpegts.js针对低延迟的实时流播放进行了优化,例如DVB / ISDB电视或监视摄像机。 该项目基于 概述 mpegts.js的工作原理是将MPEG2-TS流转换为ISO BMFF(分段...
  • TS2MP4 TS2MP4将一组TS文件转换为...它包括提取TS文件的音频视频基本,并将它们保存到磁盘上的两个不同文件中。 (使用tsdemux 1.52的修改版本)第二步是将两个基本混合。 它包括将两个基本组合成一个MP4文件。
  • 将H.264视频裸与AAC声音数据打包成TS格式码,用于网络传输,例如RTSP
  • (1)ES- Elementary Streams (原始),对视频、音频信号及其他数据进行编码压缩后的数据称为原始。原始包括访问单元,比如视频原始的访问单元就是一副图像的编码数据。 (2) PES-Packetized Elementary ...

    (1)ES- Elementary Streams (原始流),对视频、音频信号及其他数据进行编码压缩后的数据流称为原始流。原始流包括访问单元,比如视频原始流的访问单元就是一副图像的编码数据。

    (2) PES-Packetized Elementary Streams (分组的原始流),原始流形成的分组称为PES分组,是用来传递原始流的一种数据结构

    (3)节目是节目元素的集合。节目元素可能是原始流,这些原始流有共同的时间基点,用来做同步显示。

    (4)传输流和节目流TS-Transport Stream翻译为“传输流”PS-ProgramStream  翻译为“节目流”PS用来传输和保存一道节目的编码数据或其他数据。PS的组成单位是PES分组。TS用来传输和保存多道节目的编码数据或其他数据,TS的组成单位是节目。PS适用于不容易发生错误的环境,以及涉及到软件处理的应用,典型应用如DVD光盘的文件存储TS适用于容易发生错误的环境,典型应用就是数字电视信号的传输。TS和PS是可以互相转换的,比如从TS中抽取一道节目的内容并产生有效的PS是可能。 

    (5)传输流分组和PES分组原始流分成很多PES分组,保持串行顺序,一个PES分组只包含一个原始流的编码数据。PES分组长度很大,最大可为64K字节。PES分组分为“分组首部(header)”和“有效负载(payload)”。“有效负载”指跟随在首部字节之后的字节。首部的前4个字节构成分组的起始码,标识了该分组所属原始流的类型和ID号。TS分组也就是传输流数据形成的数据包。每个TS分组长度为188字节,包括“分组首部”和“有效负载,前4个字节是分组首部,包含了这个分组的一些信息。有些情况下需要更多的信息时,需在后面添加“调整字段(adaptionfield)”。两者之间的关系:PES分组是插入到TS分组中的,每个PES分组首部的第一字节就是TS分组有效负载的第一字节。一个PID值的TS分组只带有来自一个原始流的数据。 

    (6)PSI 全称Program Specific Information,意为节目专用信息。传输流中是多路节目复用的,那么,怎么知道这些节目在传输流中的位置,区分属于不同节目呢?所以就还需要一些附加信息,这就是PSI。PSI也是插入到TS分组中的,它们的PID是特定值。MPEG-2中规定了4个PSI,包括PAT(节目关联表),CAT(条件访问表),PMT(节目映射表),NIT(网络信息表),这些PSI包含了进行多路解调和显示节目的必要的和足够的信息。应用中可能包括更多的信息,比如DVB-T中定义了SDT(服务描述表),EIT(环境信息表),BAT(节目组相关表),TDT(时间日期表)等,统称为DVB-SI(服务信息)。 PSI的PID是特定的,含PSI的数据包必须周期性的出现在传输流中。

     PMT (Program MapTable )节目映射表PMT所在分组的PID由PAT指定,所以要先解出PAT,再解PMT。PMT中包含了属于同一节目的视频、音频和数据原始流的PID。找到了PMT,解多路复用器就可找到一道节目对应的每个原始流的PID,再根据原始流PID,去获取原始流。

    PAT (Program Association Table)节目关联表PAT所在分组的PID=0 PAT中列出了传输流中存在的节目流PAT指定了传输流中每个节目对应PMT所在分组的PIDPAT的第一条数据指定了NIT所在分组的PID ,其他数据指定了PMT所在分组的PID。

    CAT (Conditional Access Table )条件访问表CAT所在分组的PID=1CAT中列出了条件控制信息(ECM)和条件管理信息(EMM)所在分组的PID。CAT用于节目的加密和解密 NIT(Network Information Table)网络信息表NIT所在分组的PIDPAT指定NIT提供一组传输流的相关信息,以及于网络自身特性相关的信息,比如网络名称,传输参数(如频率,调制方式等)。NIT一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考。几种PSI之间的关系,如下图所示:首先PAT中指定了传输流中所存在的节目,及每个节目对应的PMT的PID号。比如Program 1对应的PMT 的PID=22,然后找到PID=22的TS分组,解出PMT,得到这个节目中包含的原始流的PID,再根据原始流的PI

    D去找相应的TS分组,获取原始流的数据,然后就可以送入解码器解码了。 

     

    数据结构(1TS分组前面提到,TS分组由188个字节构成,其结构如下:  transport_packet(){  sync_byte                                                                   // 8 transport_error_indicator                                          //1payload_unit_start_indicator                                    //1transport_priority                                                      // 1  PID                                                                             //13transport_scrambling_control                                  // 2adaptation_field_control                                           //2 continuity_counter                                                     //4if(adaptation_field_control=='10'  ||adaptation_field_control=='11'){   adaptation_field()  }  if(adaptation_field_control=='01' ||adaptation_field_control=='11') {    for(i=0;i<N;i++){    

    data_byte                                                                   //8   } }  } 

    前面32bit的数据即TS分组首部,它指出了这个分组的属性。

    sync_byte  同步字节,固定为0x47 ,表示后面的是一个TS分组,当然,后面包中的数据是不会出现0x47的

    transport_error_indicator传输错误标志位,一般传输错误的话就不会处理这个包了

    payload_unit_start_indicator这个位功能有点复杂,字面意思是有效负载的开始标志,根据后面有效负载的内容不同功能也不同,后面用到的时候再说。

    transport_priority  传输优先级位,1表示高优先级,传输机制可能用到,解码好像用不着。

    PID 这个比较重要,指出了这个包的有效负载数据的类型,告诉我们这个包传输的是什么内容。前面已经叙述过。 

    transport_scrambling_control加密标志位,表示TS分组有效负载的加密模式。TS分组首部(也就是前面这32bit)是不应被加密的,00表示未加密。

     adaption_field_control  翻译为“调整字段控制”,表示TS分组首部后面是否跟随有调整字段和有效负载。01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。为00的话解码器不进行处理。空分组没有调整字段

     continuity_counter   一个4bit的计数器,范围0-15,具有相同的PID的TS分组传输时每次加1,到15后清0。不过,有些情况下是不计数的。如下:(1)TS分组无有效负载(2)复制的TS分组和原分组这个值一样(3)后面讲到的一个标志discontinuity_indicator为1时 

    adaptation_field()调整字段的处理

    data_byte有效负载的剩余部分,可能为PES分组,PSI,或一些自定义的数据。

     (2  PAT数据结构如下: program_association_section(){    table_id                                // 8

      section_syntax_indicator               // 1    '0'                                     // 1    reserved                               //2    section_length                          // 12    transport_stream_id                     // 16    reserved                                // 2    version_number                          // 5    current_next_indicator                  // 1    section_number                          // 8    last_section_number                     // 8    for (i=0; i<N;i++) {        program_number                         // 16        reserved                               // 3      if(program_number == '0') {          network_PID                           // 13        }     else {        program_map_PID                      // 13       }   } CRC_32                                 //  32 }

    table_id 固定为0x00,标志是该表是PAT

    section_syntax_indicator段语法标志位,固定为1

    section_length         表示这个字节后面有用的字节数,包括CRC32。假如后面的字节加上前面的字节数少于188,后面会用0XFF填充。假如这个数值比较大,则PAT会分成几部分来传输。

    transport_stream_id    该传输流的ID,区别于一个网络中其它多路复用的流。

    version_number范围0-31,表示PAT的版本号,标注当前节目的版本.这是个非常有用的参数,当检测到这个字段改变时,说明TS流中的节目已经变化了,程序必须重新搜索节目.

    current_next_indicator表示发送的PAT是当前有效还是下一个PAT有效。

    section_number分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段

    last_section_number 最后一个分段的号码

     program_number节目号

    network_PID 网络信息表(NIT)的PID,网络信息表提供了该物理网络的一些信息,和电视台相关的。节目号为0时对应的PID为network_PID

    program_map_PID节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个

    CRC_32  CRC32校验码

    上面program_number,network_PID,program_map_PID是循环出现的。program_number等于0时对应network_PID,program_number等于其它值时对应program_map_PID。

     

    (3)PMT   PMT数据结构如下: TS_program_map_section(){ table_id                               // 8section_syntax_indicator             //  1 '0'                                   //  1 reserved                              //  2 section_length                        //  12 program_number                        //  16 reserved                              //  2 version_number                        //  5 current_next_indicator                //  1 section_number                        //  8 last_section_number                   //  8 reserved                              //  3 PCR_PID                               //  13 reserved 4program_info_length                  //  12 for (i=0; i<N; i++){   descriptor() } for (i=0;i<N1;i++){   stream_type                           //  8  reserved                             //  3   elementary_PID                        //  13  reserved                             //  4   ES_info_length                        //  12  for (i=0; i<N2; i++) {   descriptor()   } } CRC_32                                 //  32 }

    table_id  固定为0x02 ,标志是该表是PMT。

    section_syntax_indicator section_length      version_number       current_next_indicator 以上四个字段意思和PAT相同,可参考上面解释

    section_number   last_section_number 以上两个字段意思和PAT相同,不过值都固定为0x00,我觉得这样的原因可能是因为PMT不需要有先后顺序,因为先定义哪个节目都是无所谓。

    program_number 节目号,表示该PMT对应的节目  

    PCR_PID PCR(节目时钟参考)所在TS分组的PID,根据PID可以去搜索相应的TS分组,解出PCR信息。

    program_info_length 该节目的信息长度,在此字段之后可能会有一些字节描述该节目的信息

    stream_type 指示了PID为elementary_PID的PES分组中原始流的类型,比如视频流,音频流等,见后面的表

    elementary_PID 该节目中包括的视频流,音频流等对应的TS分组的PID

    ES_info_length 该节目相关原始流的描述符的信息长度。stream_type对应的类型:

    展开全文
  • ts-mp4 - MP4 媒体,作为 Apache TrafficServer 的插件实现 地位 该模块正在积极开发中,并已做好生产准备。 描述 该模块为 MP4 文件提供媒体服务器支持。 用户可以使用以秒为单位的start参数向服务器发送 HTTP ...
  • python爬虫相关: 由于很多网站上的视频只提供在线观看,...利用requests获取网页源代码中的m3u8链接,对链接进行逐步解析,获取ts列表,下载所有ts文件,将其合并生成mp4文件。做到对视频的爬取。 同名博文相关代码。
  • 网络流媒体(四)———TS流

    千次阅读 多人点赞 2019-08-04 11:54:59
    MPEG-2是MPEG(Moving Picture Experts Group,运动图像专家组)组织制定的视频音频有损压缩标准之一,它的正式名称为“基于数字存储媒体运动图像语音的压缩标准”。与MPEG-1标准相比,MPEG-2标准具有更高的...

    1. 数字视频压缩MPEG-2标准

             MPEG-2是MPEG(Moving Picture Experts Group,运动图像专家组)组织制定的视频和音频有损压缩标准之一,它的正式名称为“基于数字存储媒体运动图像和语音的压缩标准”。与MPEG-1标准相比,MPEG-2标准具有更高的图像质量、更多的图像格式和传输码率的图像压缩标准。MPEG-2标准不是MPEG-1的简单升级,而是在传输和系统方面做了更加详细的规定和进一步的完善。它是针对标准数字电视和高清晰电视在各种应用下的压缩方案,编码率从3 Mbit/s~100 Mbit/s。
             MPEG-2标准特别适用于广播质量的数字电视的编码和传送,被用于无线数字电视、DVB(Digital Video Broadcasting,数字视频广播)、数字卫星电视、DVD(Digital Video Disk,数字化视频光盘)等技术中。

         如上图,MPEG2标准DVB数据发送、传输、接收的流程。

    2. MPEG-2传输流系统层

            在MPEG-2标准中,有两种不同类型的码流输出到信道,一种是节目码流(PS:program stream),适合没有误差产生的媒体存储,比如,DVD等存储介质;另外一种是传输流(TS:Transport Stream),适用于有信道噪声产生的传输,可在网络中进行远距离的传送。这样的TS便于综合多路节目为单路节目进行复用。多个节目或者不必具有共同的时间基准。由于MPEG-2要求这些包由传送,则在MPEG-2 TS中传送包的大小定义为4*47B=188B长度。另外,这样的TS作为一个固定长度包大小,便于找到帧的起止位置,易于从包丢失中恢复,适合于有误码的环境,但是与PS相比难于生产与复用。
             TS 全称是 MPEG 2 Transport Stream,即MPEG-2 标准中的传输流。于此同时,我们常规使用的PS 是MPEG-2标准中的节目流。TS广泛用于广播电视系统,比如说数字电视,以及IPTV。

    3. PS和TS的区别      

          通常我们开发中往往会遇到,PS、RTP、 TS、MP4这四种封装最为常见。
          其中:从发布者范畴来看,MP4 规范上为MPEG-4标准,而PS、TS属于MPEG-2标准、RTP属于国际电信联盟ITU-T的RFC系列标准。 
          从使用范围来看, MP4主要适用于文件的存储。 TS、RTP适用于数据流的传输,不具有存储属性。PS既有存储属性又可以做实时流的传输。 
          从复杂度来看MP4封装最为复杂、其次PS、再次RTP和TS。

    种类

    MP4

    PS

    TS

    RTP

    本地保存

    支持,可以文件级别获取码流属性

    支持,可以GOP级别获取码流属性

    安卓、window支持直接播放。

    IOS必须配合m3u8文件构成流媒体服务器方可预览

    不支持。文件级别流属性参数不具备

    实时传输

    支持,但是必须是前置打包的机制。

    支持,属性只能获取GOP级别的参数。 海康在文件头增加流媒体属性私有信息用于辅助

    支持,配合m3u8文件构成流媒体服务器

    支持。必须配合RTSP协议双方获取文件属性。

    复杂度

    简单

    简单

    4. TS包层

            TS文件的基本存储单位为TS包,每一个包大小固定为188个字节。TS标准中有的地方是支持204字节的,204字节就是188个字节后面增加,16个字节的RS冗余校验信息。 一般默认188个字节。

            每一个TS包的内部包含4个字节的TsPacketHeader。184字节的负载数据TsPacketPayloadData。
            当TsPacketPayloadData中的实际有效数据不足184的时候,需要填充adaptation field数据,则按照如下格式。其中,填充规则按照4.1.2节描述。


    4.1 TS包文件头模块

            一共四个字节,8个标记。如下图

           结构体描述如下面的表:
                                                                                           Ts header结构

    sync_byte

    8b

    同步字节,固定为0x47, 采用固定宏TS_SYNC_0X47替代。每一次PATPMT和每一帧数据处理的时候都要添。

    transport_error_indicator

    1b

    传输错误指示符,表明在ts头的adapt域后由一个无用字节,通常都为0

    payload_unit_start_indicator

    1b

    负载开始标志位,用来表示TS包的有效净荷带有PES包或者PSI数据的情况,占位1bit;另若此值为1,且负载为PSI数据时,则在TS头后,负载起始字节会有1个调整字节point_field

    transport_priority

    1b

    传输优先级,0为低优先级,1为高优先级,通常取0

    pid:

    13b

    pid(Packet ID号码,唯一的号码对应不同的包)

    指示有效负载中的数据类型,占位13bit;0x0000代表PAT,0x0001代表CAT,0x0002-0x000F保留,0x1FFF表示空包;

    transport_scrambling_control

    2b

    传输加扰控制,00表示未加密

    adaptation_field_control

    2b

    调整字段标志,表示此TS首部是否跟随调整字段还是负载数据,占位2bit,其中00位保留,01表示无调整字段,只有有效负载数据,10表示只有调整字段,无有效负载,11表示有调整字段,且其后跟有有效负载;空分组此字段应为01

    continuity_counter

    4b

    固定为11递增计数器,从0-f,起始值不一定取0,但必须是连续的

            以上4个字节是必须存在的,但还有一些特殊的。当adaptation_field_control==1x时,会出现Adaptation field字段,Adaptation field字段如下。
                                                                              Adaptation field字段

    adaptation_field_length

    8b

    调整字段长度标示,标示此字节后面调整字段的长度,占位8bit;值为0时,表示在TS分组中插入一个调整字节,后面没有调整字段,紧跟着的是有效负载;adaptation_field_control == 11’时,此值在0~182之间,adaptation_field_control == 10’时,此值为183,若字段没这么长则填充0xFF字段;

    以下字段都是在adaptation_field_length>0是才会出现的

    discontinuity_indicator

    1b

    不连续状态指示符,占位1bit,置位1时表示此TS分组的不连续状态为真;

    random_access_indicator

    1b

    随机访问指示符,占位1bit

    elementary_stream_priority_indicator

    1b

    原始流数据优先级指示符,占位1bit,置位1表示此原始流数据比相同PIDTS包中的其他原始流优先级高;

    PCR_flag

    1b

    PCR标志位,占位1bit,置位1表示调整字段中包含PCR字段,置位0则没有PCR字段;

    OPCR_flag

    1b

    OPCR标志位,占位1bit,置位1表示调整字段中包含OPCR字段,置位0则没有OPCR字段;

    splicing_point_flag

    1b

    splice_countdown标志位,占位1bit,置位1表示调整字段中包含splice_countdown字段,置位0则没有splice_countdown字段;

    transport_private_data_flag

    1b

    transport_private_data标志位,占位1bit,置位1时表示调整字段中含有1个或者多个私有数据字节,置位0则无此字节;

    adaptation_field_extension_flag

    1b

    调整字段扩展标志位,占位1bit,置位1表示含有调整字段扩展字段,置位0则无扩展字段;

        以上8个bit是标识符,后面是根据标识符的值来确定的字段,顺序如下:
     @PCR字段:当PCR_flag == 1时,此字段才存在,占位48bit,依次顺序为:
         program_clock_reference_base字段:占位33bit;
         reserved字段:占位6bit;
         program_clock_reference_extension字段:占位9bit;
    @OPCR字段:当OPCR_flag == 1时,此字段才存在,占位48bit,依次顺序为:
         original_program_clock_reference_base字段:占位33bit;
         reserved字段:占位6bit;
         original_program_clock_reference_extension字段:占位9bit;
    @splice_countdown字段:当splicing_point_flag == 1时此字段存在,占位8bit;
    @transport_private_data字段:私有数据字段,当transport_private_data_flag==1时此字段存在,占位N*8bit,字节顺序为:
         transport_private_data_length:表明私有数据的字节长度,占位8bit;
         private_data_byte:私有数据,长度由前面的长度字段确定;
    @adaptation_field_extension字段:调整字段扩展字段,占用长度不确定,当adaptation_field_extension_flag == 1时此字段存在,字段中也有3个标志位,来确定一些字段存不存在,其具体字节顺序如下:
       adaptation_field_extension_length:调整字段扩展字段的长度,占位8bit;
       ltw_flag:ltw字段标志位,置位1时表示此字段存在,占位1bit;
       piecewise_rate_flag:piecewise_rate字段标志位,置位1时此字段存在,占位1bit;
       seamless_splice_flag:seamless_splice标志位,置位1时此字段存在,占位1bit;
       Reserved:保留字段,占位5bit;
       Ltw字段:当ltw_flag == 1时此字段存在,占位16bit,其由以下两个字段组成
      ltw_valid_flag:占位1bit,当ltw_valid_flag == 1时,ltw_offset才有效;
       ltw_offset:占位15bit;
       piecewise_rate字段:当piecewise_rate_flag == 1时此字段存在,占位24bit,其字节顺序如下:
       reserved字段:保留字段,占位2bit;
       piecewise_rate字段:占位22bit;此字段只有在当ltw_flag == 1和ltw_valid_flag == 1时才有定义,有定义时此字段是一个正整数;
       seamless_splice字段:当seamless_splice_flag == 1时此字段存在,占位40bit;字节顺序依次为:
       splice_type字段:占位4bit;标识delay和rate值;
       DTS_next_AU[32..30]:占位3bit;
       marker_bit字段:占位1bit;
       DTS_next_AU[29..15]字段:占位15bit;
       marker_bit:占位1bit;
       DTS_next_AU[14..0]:占位15bit;
       marker_bit:占位1bit;
       stuffing_byte:填充字段,固定为0xFF;
       Payload_bytes:有效负载字段,字节来自PES包,PSI部分等;
    注意:
            当TS包带有PES包数据时,payload_unit_start_indicator具有以下的特点:置为1,标识TS包的有效净荷以PES包的第一个字节开始,即此TS包为PES包的起始包,且此TS分组中有且只有一个PES包的起始字段;置为0,表示TS包不是PES包的起始包,是后面的数据包。
           当 TS包带有PSI数据时,payload_unit_start_indicator具有以下特点:置为1,表示TS包中带有PSI数据分段的第一个字节,即这个TS包是PSI Section的起始包,则此TS包的负载的第一个字节带有pointer_field;置为0,表示TS包不带有PSI Section的第一个字节,即此TS包不是PSI的起始包,即在有效负载中没有point_field,有效负载的开始就是PSI的数据内容。point_field的定义将在下面的PSI节中进行介绍;对于空包的包,payload_unit_start_indicator应该置为0。
            例如:若TS包载荷为PAT,则当接收到的TS包的payload_unit_start_indicator为1时,表明这个TS包包含了PAT头信息,从这个包里面解析出section_length和continuity_counter,然后继续收集后面的payload_unit_start_indicator = 0的TS包,并判断continuity_counter的连续性,不断读出TS包中的净载荷(也就是PAT数据),用section_length作为收集TS包结束条件。
            TS包头之后,就是负载payload的内容了,里面可以是PES分组的数据,也可以是PSI信息,PSI信息主要由PAT,PMT,CAT等,在这里主要介绍PAT和PMT两种信息表;由上所描述信息可知,payload的类型是由PID来确定的,一般PID==0x0000则payload为PAT,PID== 0x0001,则payload为CAT,而PMT的PID则是在PAT中进行指定的;
           PSI还有可能有一个特殊的字段:
           Point_field字段:跟在包头之后,占位8bit,属于有效负载,表示从此字段开始到负载中PSI Section的第一个字节之间的字节数;当payload_unit_start_indicator == 1时,此字段才存在;若point_field == 0x00,则表示此字节后跟着的就是PSI Section的起始字节;此字段是在有效负载中的,计入有效负载的长度;

           其中PIDTS流中唯一识别标志,Packet Data是什么内容就是由PID决定的。如果一个TS流中的一个PacketPacket Header中的PID0x0000,那么这个PacketPacket Data就是DVBPAT表而非其他类型数据(如VideoAudio或其他业务信息)。下表给出了一些表的PID值,这些值是固定的,不允许用于更改。

    类型

    PID

    PAT

    0x0000

    CAT

    0x0001

    TSDT

    0x0002

    EIT,ST

    0x0012

    RST,ST

    0x0013

    TDT,TOT,ST

    0x0014

                                                                                       表1 pid 类型表

          下面以一个TS流的其中一个Packet中的Packet Header为例进行说明:

     

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    Packet(十六进制)

    4

    7

    0

    7

    e

    5

    1

    2

    Packet(二进制)

    0

    1

    0

    0

    0

    1

    1

    1

    0

    0

    0

    0

    0

    1

    1

    1

    1

    1

    1

    0

    0

    1

    0

    1

    0

    0

    0

    1

    0

    0

    1

    0

    Packet Header 信息

    1 sync_byte=0x47

    2

    3

    4

    5 PID=0x07e5

    6

    7

    8

     

                                                                                    表2 header 例程数据表

          @ sync_byte=01000111,               就是0x47,这是DVB TS规定的同步字节,固定是0x47.
          @ transport_error_indicator=0,             表示当前包没有发生传输错误.
          @ payload_unit_start_indicator=0,         含义参考ISO13818-1标准文档
          @ transport_priority=0,                      表示当前包是低优先级.
          @ PID=00111 11100101即0x07e5,       Video PID
          @ transport_scrambling_control=00,      表示节目没有加密
          @ adaptation_field_control=01             即0x01,具体含义请参考ISO13818-1
          @ continuity_counte=0010                  即0x02,表示当前传送的相同类型的包是第3个

          ts层的内容是通过PID值来标识的,主要内容包括:PAT表、PMT表、音频流、视频流。解析ts流要先找到PAT表,只要找到PAT就可以找到PMT,然后就可以找到音视频流了。PAT表的PID值固定为0。PAT表和PMT表需要定期插入ts流,因为用户随时可能加入ts流,这个间隔比较小,通常每隔几个视频帧就要加入PAT和PMT。PAT和PMT表是必须的,还可以加入其它表如SDT(业务描述表)等。
          ts流最早应用于数字电视领域,其格式非常复杂包含的配置信息表多达十几个,视频格式主要是mpeg2。苹果公司发明的http live stream流媒体是基于ts文件的,不过他大大简化了传统的ts流,只需要2个最基本的配置表PAT和PMT,再加上音视频内容就可以了,hls流媒体视频编码的主要格式为h264/mpeg4,音频为aac/mp3。

    4.2 TS包填充模块

          adaption为自适应填充功能,主要目的为填充凑齐不足188字节的TS包。

                                                                       图6 TS adaptation填充结构

        @ adaptation_field_length:8bit,自适应域长度,后面的字节数 
        @ flag :1bit,取0x50表示包含PCR或0x40表示不包含PCR
        @ PCR:1bit,Program Clock Reference,节目时钟参考,用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。
         @ stuffing_bytes:填充字节,取值0xff
             自适应区的长度要包含传输错误指示符标识的一个字节。pcr是节目时钟参考,pcr、dts、pts都是对同一个系统时钟的采样值,pcr是递增的,因此可以将其设置为dts值,音频数据不需要pcr。如果没有字段,ipad是可以播放的,但vlc无法播放。打包ts流时PAT和PMT表是没有adaptation field的,不够的长度直接补0xff即可。视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

    5. ES层数据

    es层就是音视频裸数据了,常用的音频编码格式为AAC,和MP3 。视频编码格式为H.264和HEVC。
    其数据结构可以分别参考相应的编码规范手册。

    6. PES包层

    pes层是在每一个视频/音频帧上加入了时间戳等信息,pes包内容很多,我们只留下最常用的。

              如图7,按照苹果协议定义规范,PES内容可以是, PMT项数据,PAT项数据, 也可以是正常的音视频数据。

    6.1 PAT格式

            PAT全称Program Association Table,节目关联表,定义了当前TS流中所有的节目,其PID为0x0000,它是PSI的根节点,当播放器对视频开始检索分析的时候,针对每个TS 包的header中pid成员进行判定,直到找到PAT表开始的地方进行有效数据起始分析。

    table_id

    8b

    PAT表固定为0x00

    section_syntax_indicator

    1b

    固定为1

    zero

    1b

    固定为0

    reserved

    2b

    固定为11

    section_length

    12b

    后面数据的长度

    transport_stream_id

    16b

    传输流ID,固定为0x0001

    reserved

    2b

    固定为11

    version_number

    5b

    版本号,固定为00000,如果PAT有变化则版本号加1

    current_next_indicator

    1b

    固定为1,表示这个PAT表可以用,如果为0则要等待下一个PAT表

    section_number

    8b

    固定为0x00

    last_section_number

    8b

    固定为0x00

    开始循环

     

     

    program_number

    16b

    节目号为0x0000时表示这是NIT,节目号为0x0001时,表示这是PMT

    reserved

    3b

    固定为111

    PID

    13b

    节目号对应内容的PID值

    结束循环

     

     

    CRC32

    32b

    前面数据的CRC32校验码

                                                                                     表3 PAT 例程数据表

            PAT结构根据表3 PAT 例程数据表加上我们节目数量为1的时候以得知PAT的数据结构如下:
            因此PAT长度为16个字节,而payloadSize为184个字节, 那么adaptFileLen填充为168个长度。
            根据表3的描述,有如下的例程。
            通过一段TS流中一个Packet分析PAT表,这里我们分析一段TS流其中一个Packet的Packet Data部分:
             首先给出一个数据包,其数据如下:

    Packet Header

    Packet Data

    0x47 0x40 0x00 0x10

    0000 b0 11 00 01 c1 00 00 00 00 e0 1f 00 01 e1 00 24 ac48 84 ff ff…… ff ff

    分析Packet Header如下表所示:

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    Packet(十六进制)

    4

    7

    4

    0

    0

    0

    1

    0

    Packet(二进制)

    0

    1

    0

    0

    0

    1

    1

    1

    0

    1

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    1

    0

    0

    0

    0

    Packet Header Bits

    1 sync_byte=0x47

    2

    3

    4

    5 PID=0x0000

    6

    7

    8

    根据包头数据格式,我们可以知晓整个数据包的属性,列表如下:

    sync_byte

    0x47

    固定同步字节

    transport_error_indicator

    “0”

    没有传输错误

    payload_unit_start_indicator

    “1”

    在前4个字节后会有一个调整字节。所以实际数据应该为去除第一个字节后的数据。即上面数据中红色部分不属于有效数据包。

    transport_priority

    “0”

    传输优先级低

    PID

    0x0000

    PID=0x0000说明数据包是PAT表信息

    transport_scrambling_control

    “00”

    未加密

    adaptation_field_control

    “01”

    附加区域控制

    continuity_counte

    “0000”

    包递增计数器

           如上表所示,我们可以知道,首先PacketPacket DataPAT信息表,因为其PID0,并且在包头后需要除去一个字节才是有效数据(payload_unit_start_indicator="1")。这样,Packet Data就应该是“00 b0 11 00 01 c1 00 00 00 00 e0 1f 00 01 e1 00 24 ac48 84 ff ff …… ff ff”

    Packet Data分析

    第n个字节

      1  

      3  

    4

    5

    6

    7

    8

    9

     10 

     11 

      12 

      13 

    14 

    15 

    16

    17

    18

    19

    20

    Packet Data(除去开头的0x00)

    00

    b0

    11

    00

    01

    c1

    00

    00

    00

    00

    e0

    1f

    00

    01

    e1

    00

    24

    ac

    48

    84

    字段名

    具体值

    次序

    说明

    table_id

    8

    0000

    第1个字节 0000 0000B(0x00)

    PAT的table_id只能是0x00

    section_syntax_indicator

    1

    1

     

    第2、3个字节

    1011 0000 0001 0001B(0xb0 11)

    段语法标志位,固定为1

    zero

    1

    0

     

    reserved

    2

    11

     

    section_length

    12

    0000 0001 0001B=0x011=17

    段长度为17字节

    transport_stream_id

    16

    0x0001

    第4、5个字节 0x00 0x01

     

    reserved

    2

    11

     

    第6个字节 1100 0001B(0xc1)

     

    version_number

    5

    00000

    一旦PAT有变化,版本号加1

    current_next_indicator

    1

    1

    当前传送的PAT表可以使用,若为0则要等待下一个表

    section_number

    8

    0x00

    第7个字节0x00

     

    last_section_number

    8

    0x00

    第8个字节 0x00

     

    开始循环

    program_number

    16

    0x0000-第一次

    2个字节(0x00 00)

    节目号 

    reserved

    3

    111

     

    2个字节

    1110 0000 0001 1111B(0xe0 1f)

     

    network_id(节目号为0时)

    program_map_PID(节目号为其他时)

    13

    0 0000 0001 1111B=31

    -第一次

    节目号为0x0000时,表示这是NIT,PID=0x001f,即31

    节目号为0x0001时,表示这是PMT,PID=0x100,即256

    结束循环

    CRC_32

    32

    --

    4个字节

     

            由以上几个表可以分析出PAT表和PMT表有着内在的联系。也就是之前提到的。PAT表描述了当前流的NIT(Network Information Table,网络信息表)中的PID、当前流中有多少不同类型的PMT表及每个PMT表对应的频道号。

    6.2 PMT格式

            PMT 全称Program Map Table,节目映射表PMT数据的信息可以理解为这个节目包含的音频和视频信息。海康目前用它来填充海康自己内部的私有信息。

    table_id

    8b

    PMT表取值随意,0x02

    section_syntax_indicator

    1b

    固定为1

    zero

    1b

    固定为0

    reserved

    2b

    固定为11

    section_length

    12b

    后面数据的长度

    program_number

    16b

    频道号码,表示当前的PMT关联到的频道,取值0x0001

    reserved

    2b

    固定为11

    version_number

    5b

    版本号,固定为00000,如果PAT有变化则版本号加1

    current_next_indicator

    1b

    固定为1

    section_number

    8b

    固定为0x00

    last_section_number

    8b

    固定为0x00

    reserved

    3b

    固定为111

    PCR_PID

    13b

    PCR(节目参考时钟)所在TS分组的PID,指定为视频PID

    reserved

    4b

    固定为1111

    program_info_length

    12b

    节目描述信息,指定为0x000表示没有

    开始循环

     

     

    stream_type

    8b

    流类型,标志是Video还是Audio还是其他数据,h.264编码对应0x1b,aac编码对应0x0f,mp3编码对应0x03

    reserved

    3b

    固定为111

    elementary_PID

    13b

    与stream_type对应的PID

    reserved

    4b

    固定为1111

    ES_info_length

    12b

    描述信息,指定为0x000表示没有

    结束循环

     

     

    CRC32

    32b

    前面数据的CRC32校验码

                                                                                       表4 PMT数据表

            通过一段TS流中一个Packet分析PMT表,通过分析一段TS流的数据包Packet来学习PMT表。下面给出了一段TS流数据中的一个Packet(十六进制数)。

    Packet Header

    Packet Data

    0x47 0x43 0xe8 0x12

    00 02 b0 12 00 01 c1 00 00 e3 e9 f0 00 1b e3 e9 f0 00 f0 af b4 4f ff ff…… ff ff

    首先解析Packet Header,分析如下:

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    Packet(十六进制)

    4

    7

    4

    3

    e

    8

    1

    2

    Packet(二进制)

    0

    1

    0

    0

    0

    1

    1

    1

    0

    1

    0

    0

    0

    0

    1

    1

    1

    1

    1

    0

    1

    0

    0

    0

    0

    0

    0

    1

    0

    0

    1

    0

    Packet Header Bits

    1 sync_byte=0x47

    2

    3

    4

    5 PID=0x03e8

    6

    7

    8

    Packet Header分析

     

    Packet Header:0x47 0x40 0x00 0x10

    1

    sync_byte

    0x47

    固定同步字节

    2

    transport_error_indicator

    “0”

    没有传输错误

    3

    payload_unit_start_indicator

    “1”

    在前4个字节后会有一个调整字节。所以实际数据应该为去除第一个字节后的数据。

    4

    transport_priority

    “0”

    传输优先级低

    5

    PID

    0x03e8

    PID=0x03e8说明数据包是PMT表信息

    6

    transport_scrambling_control

    “00”

    未加密

    7

    adaptation_field_control

    “01”

    附加区域控制

    8

    continuity_counte

    “0010”

    包递增计数器

            因为payload_unit_start_indicator=‘1’,在解析数据包的时候需要去除Packet Data的第一个字节。下面是对Packet Data的详细解析:

     

    PMT表的Packet Data分析

    第n个字节

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10   

    11   

    12   

    13   

    14  

     15  

    16

    17

    18

    19

    20

    Packet Data

    02

    b0

    12

    00

    01

    c1

    00

    00

    e3

    e9

    f0

    00

    1b

    e3

    e9

    f0

    00

    f0

    1b

    e3

    字段名

    位数

    具体值

    次序

    说明

    table_id

    8

    0x02

    第1个字节

     

    section_syntax_indicator

    1

    1B

     

    第2、3个字节

    1011 0000 0001 0010B=0xb012

    段语法标志

    zero

    1

    0B

     

    reserved

    2

    11B=0x03

     

    section_length

    12

    0000 0001 0010B=0x12

    段长度,从program_number开始,到CRC_32(含)的字节总数

    program_number

    16

    0x0001

    第4、5个字节 0x00 01

    频道号码,表示当前的PMT关联到的频道

    reserved

    2

    11B=0x03

     

    第6个字节

    1100 0001B=0xc1

     

    version_number

     

    5

     

    00000B=0x00

    版本号码,如果PMT内容有更新,则它会递增1通知解复用程序需要重新接收节目信息

    current_next_indicator

    1

    1B=0x01

    当前未来标志符

    section_number

    8

    0x00

    第7个字节0x00

    当前段号码

    last_section_number

    8

    0x00

    第8个字节 0x00

    最后段号码,含义和PAT中的对应字段相同

    reserved

    3

    111B=0x07

    第9、10个字节

    1110 0011 1110 1001B=0xe3e9

     

    PCR_PID

    13

    000111110B=0x3e9

    PCR(节目参考时钟)所在TS分组的PID

    reserved

    4

    1111B=0x0f

     

     

     

    第11、12个字节

    1111 0000 0000 0000=0xf000

     

     

    program_info_length

     

    12

     

     

     

    000000000000B=0x000

    节目信息长度(之后的是N个描述符结构,一般可以忽略掉,这个字段就代表描述符总的长度,单位是Bytes)紧接着就是频道内部包含的节目类型和对应的PID号码了

    stream_type

    8

    0x1b

    第13个字节 0x1b

    流类型,标志是Video还是Audio还是其他数据

    reserved

    3

    111B=0x07

    第14、15个字节

    1110 0011 1110 1001B=0xe3e9

     

    elementary_PID

    13

    000111110 1001=0x3e9

    该节目中包括的视频流,音频流等对应的TS分组的PID

    reserved

    4

    1111B=0x0f

    第16、17个字节

    1111 0000 0000 0000B=0xf000

     

    es_info_length

    12

    0000 0000 0000=0x000

     

    CRC

    32

    ——

    ——

     

     

    6.3 音视频数据封装

           音视频数据是在每一个视频/音频帧上加入了时间戳等信息,pes包内容很多,我们只留下最常用的。

    pes start code

    3B

    开始码,固定为0x000001

    stream id

    1B

    音频取值(0xc0-0xdf),通常为0xc0
    视频取值(0xe0-0xef),通常为0xe0

    pes packet length

    2B

    后面pes数据的长度,0表示长度不限制,
    只有视频数据长度会超过0xffff

    flag

    1B

    通常取值0x80,表示数据不加密、无优先级、备份的数据

    flag

    1B

    取值0x80表示只含有pts,取值0xc0表示含有pts和dts

    pes data length

    1B

    后面数据的长度,取值5或10

    pts

    5B

    33bit值

    dts

    5B

    33bit值

           pts是显示时间戳、dts是解码时间戳,视频数据两种时间戳都需要,音频数据的pts和dts相同,所以只需要pts。有pts和dts两种时间戳是B帧引起的,I帧和P帧的pts等于dts。如果一个视频没有B帧,则pts永远和dts相同。从文件中顺序读取视频帧,取出的帧顺序和dts顺序相同。dts算法比较简单,初始值 + 增量即可,pts计算比较复杂,需要在dts的基础上加偏移量。
          音频的pes中只有pts(同dts),视频的I、P帧两种时间戳都要有,视频B帧只要pts(同dts)。打包pts和dts就需要知道视频帧类型,但是通过容器格式我们是无法判断帧类型的,必须解析h.264内容才可以获取帧类型。
           时钟配置,MPEG2-TS 中规定系统采用45K的基准时钟。而我们DSP进程封装功能为90K(兼容RTP、PS封装目的)。因此需要进行转换。
           假如帧率为25帧每秒, 那么每一帧的系统间隔时间为40ms。按照TS封装45K的采样率基准时钟来计算, 需要1800个时钟(40 * 45)。
          假如音频采样率为16K,单个点耗时1/16ms即62.5us,那么1024个点为一帧一共64ms(62.5us * 1024),,则转为45K下为2880个时钟,(0.0625*45*1024)。
     

    展开全文
  • mpegts.js日本语中文说明用TypeScriptJavaScript编写HTML5 MPEG2-TS流播放器。 mpegts.js针对低延迟的实时流播放进行了优化,例如DVB / ISDB电视或监视摄像机。 该项目基于flv.js。 概述mpegts.js的工作原理是将...
  • linux下使用ffmpeg将ts文件合成mp4文件

    千次阅读 2020-10-17 12:25:45
    首先要安装ffmpeg ...ffmpeg -version 合成命令 ... 1 root root 2196216 十月 17 01:44 segment-1-v1-a1.ts -rwxrwxrwx. 1 root root 2972280 十月 17 01:44 segment-2-v1-a1.ts ffmpeg -i "concat:

    首先要安装ffmpeg
    https://blog.csdn.net/raoxiaoya/article/details/109130549

    ffmpeg -version
    在这里插入图片描述
    合成命令

    cd /data/www/mv
    ll
    -rwxrwxrwx. 1 root root 2196216 十月 17 01:44 segment-1-v1-a1.ts
    -rwxrwxrwx. 1 root root 2972280 十月 17 01:44 segment-2-v1-a1.ts
    
    ffmpeg -i "concat:segment-1-v1-a1.ts|segment-2-v1-a1.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
    

    concat 后面拼接上多个 ts 文件,使用竖线隔开。

    展开全文
  • MP4图形器(MP4 GUI)_FFmpeg GUI简介:一. 基于:FFmpeg(企业级的多媒体转换王)开发的图形界面程序。二. 支持:FFmpeg视频(2k/4k/8k素材)、音频、图片、字幕...查看原始视频参数:视频的转码速度评估、视频轨道(...
  • 参考资料,主要实现包括利用librtmp实现rtmp的接收,并保存成flv格式视频;利用ffmpeg接口实现rtmp保存成.ts, .mkv, .flv, .mp4格式视频; mp4v2源码及封装
  • Digital Video Broadcasting (DVB) Content Protection and Copy Management (DVB-CPCM)
  • ffmpeg系列之mp4ts格式转换

    千次阅读 2021-02-23 22:06:42
    M3U 协议解析1.1、Tag说明2、HLS 与 M3U83、通过ffmpeg进行转换3.1、 mp4格式转换为ts格式3.2、 ts格式拼接命令 1. M3U 协议解析   M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,...
  • TS流批量下载工具

    万次阅读 2018-11-16 11:49:31
    工具目录下有3个文件 ffmpeg.exe: 主要用来 处理TS文件转为PM4文件用到,可以自行到相关... 新建 TS文件的索引文件,*.M3u8,怎么获取,参照“Ts文件说明”。 M3U8文件如果是本地的文件,需要填写 通用地址。 ...
  • 湖南卫视的一段hls切片,5段,每段10s,编码是h264,ts封装
  • 2、如果是正常的m3u8地址,会自动解析出key和ts文件,出现在列表中,点击“下载ts及key文件”按钮就可以开始下载了。 3、如果是动态网址,或者特殊情况,会弹出提示,要求手工修正m3u8地址。 手工调整m3u8地址后,...
  • #VDK Base Pack thx nareix创建了JOY4 一组用于构建服务的库。
  • 目标:爬取网站在线播放的视频 分析: 1.网站:天一影视 视频:天地争霸美猴王第一集 2.request请求 :'...可以看出只有最后不同:视频从001.ts–&g
  • python学习之爬取ts流电影

    千次阅读 2020-04-29 15:25:15
    **简单写下需求**: 输入电影网址,运行程序,即可自动下载电影所有的ts流文件,下载完成后,自动合并成MP4或其他视频格式的文件。 程序结构目录 目录结构释义: movieDownload:根目录 main:主程序目录 function....
  • 网页视频下载(TS流下载合成)

    万次阅读 2019-02-22 10:29:57
    而且ts流命名规范有规律,易下载,一开始打算来个shell脚本用 wget 解决 #!/bin/bash str = "out" for i in ` seq 0 1000 ` do a = $(( 1000 + $i )) str1 = $str ${a:1:3} \.ts # 生成 string ...
  • TS文件解码TS文件解密TS流批量下载解码工具

    万次阅读 多人点赞 2018-05-21 11:02:15
    TS的全称则是Transport Stream,即传输,DVD节目中的MPEG2格式,是MPEG2-PS,MPEG2-TS格式的特点就是要求从视频的任一片段开始都是可以独立解码的。现主流视频网站都采用这种模式。 m3u8是一个TS切片列表文件...
  • 目前android上,录相大多是mp4的视频,这在一般情况下,已经...比如突然撞车了,或者是远程监控断电了,如果这时录的是Mp4的视频,那么就会导致,没有来得及写和mp4的文件头信息,而打不开视频。所以在远程监控录相...
  • 本地E盘有文件roundDeskS02E01.mp4,通过udp推ts流到组播地址如下: E:\BaiduNetdiskDownload>ffmpeg -i roundDeskS02E01.mp4 -f mpegts udp://224.0.0.1:9922 ffmpeg version git-2020-03-06-cfd9a65 Copyright...
  • 利用ffmpeg的API从USB摄像头获取视频并保存为H264的TS流的C语言源代码
  • ts流介绍

    千次阅读 2015-12-14 16:54:18
    苹果公司发明的http live stream流媒体是基于ts文件的,不过他大大简化了传统的ts流,只需要2个最基本的配置表PATPMT,再加上音视频内容就可以了,hls流媒体视频编码的主要格式为h264/mpeg4,音频为aac/mp3。...
  • hls流媒体:ts流格式介绍

    千次阅读 2016-08-10 16:22:51
    1.ts简介 ... ts流最早应用于数字电视领域,其格式非常复杂包含的配置信息表多大十几个,视频格式主要是mpeg2。苹果公司发明的http live stream流媒体是基于ts文件的,不过他大大简化了传统的
  • 下载ts流视频的成功方法

    万次阅读 2020-03-09 12:03:20
    但是,实际情况是并不是所有的直播课程都能轻松下载,比如遇到了以“.ts”后缀的视频,就无法下载,欲哭无泪。怎么办,想办法。 1、什么是ts 网络资料显示:ts是日本高清摄像机拍摄下进行的封装格式,全称为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,504
精华内容 3,401
关键字:

ts流和mp4