libdvbpsi是VLC中用于解复用的一个库,可以在VLC的主页中下载,笔者用的是0.1.7版本。
static int ReadPacket(int i_fd, uint8_t* p_dst) { int i = 187; int i_rc = 1; p_dst[0] = 0; while((p_dst[0] != 0x47) && (i_rc > 0)) { i_rc = read(i_fd, p_dst, 1); } while((i != 0) && (i_rc > 0)) { i_rc = read(i_fd, p_dst + 188 - i, i); if(i_rc >= 0) i -= i_rc; } return (i == 0) ? 1 : 0; }
这里假定是188字节的TS文件(还有另外两种)。第一个while是读到一个0x47(TS packet的同步字节),第二个while是读入剩下的187字节,如果剩下不到187字节函数将返回失败。
接下来的回调函数DumpPAT很简单就是打印些东西,不熬述。
看main函数:
int main(int i_argc, char* pa_argv[]) { int i_fd; uint8_t data[188]; dvbpsi_handle h_dvbpsi; int b_ok; if(i_argc != 2) return 1; i_fd = open(pa_argv[1], 0); h_dvbpsi = dvbpsi_AttachPAT(DumpPAT, NULL); b_ok = ReadPacket(i_fd, data); while(b_ok) { uint16_t i_pid = ((uint16_t)(data[1] & 0x1f) << 8) + data[2]; if(i_pid == 0x0) dvbpsi_PushPacket(h_dvbpsi, data); b_ok = ReadPacket(i_fd, data); } dvbpsi_DetachPAT(h_dvbpsi); return 0; }
1. open一个文件,在win下面编译可能要改一下;
2. dvbpsi_AttachPAT,注册一个回调函数,用来打印一些PMT的东东;
3. 接下来就对文件中的每一个packet看看是不是PID为0x00(PAT的packet),直接丢给dvbpsi_PushPacket,最后就由DumpPAT打印出来。
这个例子没什么作用,o(∩_∩)o 哈哈。