一、概述
PS和TS流在广播电视、影音制作、安防监控等领域应用得很广泛。其中,PS流很久前就被应用于DVD光盘里的电影格式的封装容器,我们看过的很多DVD格式电影(即VOB)就是用PS容器封装的;PS流最近几年也迅速应用在安防领域,国标GBT 28181标准规定了视音频流通过网络传输要封装为PS格式;而TS流(传输流)则应用于电视直播领域很长一段时间,电视机顶盒接收的节目数据格式就是MPEG2-TS格式。
关于PS、TS格式的结构组成和解析这篇文章就不提了,主要讲一下我写的PS/TS解析库的使用。
二、分离PS、TS流的SDK
我实现了一个支持PS、TS流解析的模块,该模块支持对PS/TS解封包,最终分立出ES帧,并通过回调接口将数据传给上层。该模块封装成动态库的形式,下面看看库接口的声明:
#include "SDKDef.h"
//初始化SDK
PLAYPT_API BOOL PT_InitSDK();
//注销SDK
PLAYPT_API BOOL PT_UnitSDK();
//获取SDK版本号
PLAYPT_API LONG PT_GetSDKVersion();
//设置缓冲的条件,根据帧数或字节数
//下面两个条件只能一个生效,如果nBufferFrames非0则根据帧数缓冲;如果nBufferFrames为0,BufferBytes不为0,则根据字节数缓冲。
//参数:
//nBufferFrames -- 缓冲要达到的帧数
//BufferBytes -- 缓冲要达到的字节数
PLAYPT_API void PT_SetBufferStreamParams(UINT nBufferFrames, UINT BufferBytes); //设置缓冲参数
//打开PS/TS格式的流,支持从文件或内存读取流
//参数:
//srcType -- 流来自于文件或内存,_FILE_SOURCE--来自于文件,_MEM_SOURCE---来自于内存
// lpszFilePath -- 文件路径,如果是内存流,传NULL
// nFileType --流类型(1--PS, 2--TS)
// bParseESStream -- 是否解析视音频流,提取信息。如果视频流格式不是MPEG2/MPEG4/H264这几种之一,则将该参数设为FALSE
// handle -- 返回的这个句柄来调用其他函数;
// dwError -- 失败时返回的错误码;
//
PLAYPT_API BOOL PT_OpenFile(SOURCE_TYPE srcType, LPCTSTR lpszFilePath, int nFileType, BOOL bParseESStream, int & handle, DWORD & dwError);
PLAYPT_API BOOL PT_CloseFile(int handle); //关闭文件或内存流
PLAYPT_API BOOL PT_Pause(int handle); //暂停播放
PLAYPT_API BOOL PT_Play(int handle); //开始播放
PLAYPT_API BOOL PT_IsRunning(int handle); //是否正在播放
PLAYPT_API BOOL PT_AddStreamData(int handle, BYTE * pData, int nBytes