MPEG2/TS 获取PMT PID

本文介绍了一个用于从MPEG2-TS文件中提取节目映射表PID(PMT PID)的C语言函数。该函数通过遍历传输流包(TS packets),识别并返回第一个遇到的有效PMT PID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个简单的从指定MPEG2/TS文件中获取PMT PID的函数,

注意代码中的注释。

 

#define MAKE_PID(p) (((p[0]<<8) + p[1]) & 0x1fff)

[html]  view plain  copy
  1. ushort GetPmtPid(const char* filename)  
  2. {  
  3. #define TSPACKET_SIZE     188    
  4.     ushort pid;  
  5.     uchar buf[TSPACKET_SIZE];  
  6.     uchar* p = buf;  
  7.     FILE*  fp;  
  8.   
  9.     fp = fopen(filename, "rb");  
  10.     if (fp == NULL) {  
  11.         fprintf(stderr, "Failed to open the file %s: %s\n", filename, strerror(errno));  
  12.         return 0;  
  13.     }  
  14.   
  15.     while (fread(buf, 1, TSPACKET_SIZE, fp) == TSPACKET_SIZE) {  
  16.         if (buf[0] != MPEG_TS_SYNC_BYTE) {  
  17.             fprintf(stderr, "No sync byte where one was expected!\n");  
  18.             break;  
  19.         }  
  20.   
  21.         p = buf;  
  22.         pid = MAKE_PID((p+1));  
  23.         if ( pid != 0 ) {  
  24.             // 不是PAT包  
  25.             continue;  
  26.         }  
  27.   
  28.         // Skip the TS header  
  29.         p += MPEG_TS_HEADER_SIZE; //@MPEG_TS_HEADER_SIZE = 4  
  30.   
  31.         // Adaptation field exist or not  
  32.         if ((buf[3] >> 4 & 0x03) & 0x2) {  
  33.             fprintf(stderr, "Adaptation field exist\n");  
  34.             p += 1 + p[0];  // p[0]是Adaptation field长度, 1为长度域  
  35.         }  
  36.   
  37.         // p[0] 为 Point field长度, 1为Point field  
  38.         p += 1 + p[0];  
  39.   
  40.         // 8 为PAT表头长度,如果定义了表头,则用sizeof运算符  
  41.         p += 8;  
  42.   
  43.         // NIT Program exist??  
  44.         if( *((ushort*)p) == 0) {  
  45.             p += 4; // PAT的节目结构为4字节  
  46.         }  
  47.   
  48.         p += 2; // 节目号为两个字节  
  49.   
  50.         fclose(fp);  
  51.         return MAKE_PID(p);  
  52.     }  
  53.   
  54.     fclose(fp);  
  55.     return 0;  
  56. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值