欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

biTStream功能介绍与应用

程序员文章站 2022-07-14 21:42:30
...

一、 背景

在上一篇《浅析mpeg-ts封装结构》中介绍了mpegts流的封装格式,接下来在了解了基本结构之后就是如何解析了。如果自己写代码一个位一个位的去判断并处理,这固然很有乐趣,但你的老板并不一定这么有耐心,所以借助于成熟的工具势必能让你事半功倍。下面要隆重介绍的biTStream项目就可以实现。
biTStream项目来自大名鼎鼎的开源组织VideoLan发布的一款开源项目。你也许不知道VideoLan,但你一定听说或使用过vlc播放器,这是VideoLan的明星产品。支持mpegts的解析仅是它的一部分功能,它还支持很多其他的多媒体协议规格。
biTStream可支持的协议规格列表:
 ISO/IEC 13818-1 (MPEG-2 systems)
 ISO/IEC 13818-2 (MPEG-2 video)
 ISO/IEC 13818-3 (MPEG-2 audio)
 ISO/IEC 14496-3 (MPEG-4 advanced audio coding)
 ISO/IEC 14496-10 (MPEG-4 advanced video coding)
 ITU-T H.265 (high efficiency video coding)
 ATSC A/52
 ETSI EN 300 468 (Service Information in DVB systems)
 ETSI EN 50 221 (Common Interface Specification)
 ETSI TS 103 194 (DVB Simulcrypt)
 IETF RFC 3550 (Real Time Protocol)
 IETF RFC 2250 (Real Time Protocol for MPEG-1/2 audio/video)
 SMPTE 2022-1 (Forward Error Correction)
 SMPTE 2022-6 (hbrmt)
 SMPTE 291 (Ancillary Data Packet and Space Formatting)
 SMPTE 337 (Non-PCM data in AES3)
 IEEE 802.3 (Ethernet frames)
 SCTE-35 (Splice Information Table)
 SCTE-104 (Automation to Compression Communications API)
该项目使用MIT license 。当然,在官方说明中也提到欢迎使用者补充新的数据结构或者修复现有结构的缺陷。
官方地址: http://www.videolan.org/developers/bitstream.html
获取项目: git clone https://code.videolan.org/videolan/bitstream.git

二、 功能说明

2.1 开发包特点

biTStream由一系列C语言的头文件组成,所有需要用到的功能都实现在.h文件中。而实现方法都声明为static inline方式,我们知道inline声明的方法在编译时会直接以整体代码的方式嵌入调用过程中。它的优点是调用快速,没有压栈出栈的开销。但前面再加上static又有不一样的意义了,这个方法实际会以static方式被编译,优点是避免方法重名带来的命名空间污染问题。
biTStream也被拿来与另一个解析库libdvbpsi进行对比。Libdvbpsi的特点是把数据填充进一个预先定义好的结构体中,但前提是要对所有属性字段进行充分了解才能很好使用。一个典型的场景是你需要访问一个字段,可能只是第100个字节的第5位,但也要把整体解析流程走一遍之后才能从一个庞大的结构体中取得。而biTStream相对来说工作在一个更低一级的层面,它是对二进制数据直接访问实现设置或取值的操作,可以达到按需操作的目的,减少无关的解析操作。
对于解析mpegts来说,我们需要的功能都集中在mpeg子目录下,下面对mpeg目录下的功能进行说明。

2.2 主要功能列举

mpeg/ts.h:此头文件包含了对TS包头的解析与设置方法,还有对自适应区的解析与设置。对于TS包头的结构请参考《浅析mpeg-ts封装结构》的2.1章。对于自适应区的结构请参考《浅析mpeg-ts封装结构》的2.2章
mpeg/psi/psi.h:此头文件包含了对PSI数据的通用操作,例如解析table结构、section结构等。这些结构都在PAT与PMT等包中存在。
mpeg/psi/pat.h:节目关联表的解析与设置方法。PAT的结构请参考《浅析mpeg-ts封装结构》的2.3章。
mpeg/psi/pmt.h:节目映射表解析与设置方法。pmt的结构请参考《浅析mpeg-ts封装结构》的2.4章。
dvb/si/sdt.h:数据流信息描述表的解析与设置方法。Sdt的结构请参考《浅析mpeg-ts封装结构》的2.5章。
mpeg/pes.h:节目元组流包头的解析与设置方法。Pes的结构请参考《浅析mpeg-ts封装结构》的2.6章。
mpeg/h264.h、mpeg/aac.h:主流音频、视频编码格式解析。很有用的功能,例如寻找视频的I帧、P帧。

三、 应用示例

以一个简单的功能说明库的使用。
判断是否TS包,是否是PAT包,如果是的话通过CRC校验其是否完整。

void simple_test()
{
        FILE *fp = fopen("one.ts", "rb");
        uint8_t buff[188];

        fread(buff, 188, 1, fp);

        if ( ts_validate(buff) )
        {
                if ( ts_get_pid(buff) == PAT_PID )
                {
                        char *pat_sec = ts_section(buff);
                        if ( pat_validate(pat_sec) )
                        {
                                printf ( "This is PAT\n" );
                        }
                }
        }
}

四、 基于biTStream实现的个人开源项目

现在已经提交至git clone https://code.csdn.net/think_world_view/ts_get_info.git
欢迎大家共同学习,并提出改进意见。
程序运行截图:
biTStream功能介绍与应用