提取 PAT PMT C语言

时间: 2023-11-23 19:09:20 浏览: 43
PAT(Program Association Table)和PMT(Program Map Table)是数字视频广播领域中的两个协议。 在C语言中,提取PAT和PMT需要进行以下步骤: 1. 打开TS文件,读取TS包,获取PAT表的PID值。 2. 读取TS包,判断PID是否为PAT表的PID值,如果是则解析PAT表。 3. 解析PAT表,获取PMT表的PID值。 4. 读取TS包,判断PID是否为PMT表的PID值,如果是则解析PMT表。 5. 解析PMT表,获取视频流和音频流的PID值。 6. 读取TS包,判断PID是否为视频流或音频流的PID值,如果是则提取数据。 下面是示例代码: ```c #include <stdio.h> typedef struct { unsigned char table_id; unsigned char section_syntax_indicator; unsigned short section_length; unsigned short transport_stream_id; unsigned char version_number; unsigned char current_next_indicator; unsigned char section_number; unsigned char last_section_number; unsigned int program_number; unsigned char reserved_3; unsigned int network_PID; unsigned int program_map_PID; } PAT; typedef struct { unsigned char table_id; unsigned char section_syntax_indicator; unsigned short section_length; unsigned int program_number; unsigned char reserved_3; unsigned char version_number; unsigned char current_next_indicator; unsigned char section_number; unsigned char last_section_number; unsigned short PCR_PID; unsigned short program_info_length; unsigned int stream_type; unsigned short elementary_PID; unsigned short ES_info_length; } PMT; int main() { FILE *fp = fopen("test.ts", "rb"); if (fp == NULL) { printf("Open file failed!\n"); return -1; } unsigned char buffer[188]; PAT pat; PMT pmt; while (fread(buffer, 1, 188, fp) == 188) { // 判断PID是否为PAT表的PID值 if (buffer[1] == 0x00) { pat.table_id = buffer[0]; pat.section_syntax_indicator = (buffer[1] >> 7) & 0x01; pat.section_length = ((buffer[1] & 0x0f) << 8) | buffer[2]; pat.transport_stream_id = (buffer[3] << 8) | buffer[4]; pat.version_number = (buffer[5] >> 1) & 0x1f; pat.current_next_indicator = buffer[5] & 0x01; pat.section_number = buffer[6]; pat.last_section_number = buffer[7]; pat.network_PID = ((buffer[8] & 0x1f) << 8) | buffer[9]; pat.program_map_PID = ((buffer[10] & 0x1f) << 8) | buffer[11]; } // 判断PID是否为PMT表的PID值 else if (buffer[1] == pmt.program_map_PID) { pmt.table_id = buffer[0]; pmt.section_syntax_indicator = (buffer[1] >> 7) & 0x01; pmt.section_length = ((buffer[1] & 0x0f) << 8) | buffer[2]; pmt.program_number = (buffer[3] << 8) | buffer[4]; pmt.version_number = (buffer[5] >> 1) & 0x1f; pmt.current_next_indicator = buffer[5] & 0x01; pmt.section_number = buffer[6]; pmt.last_section_number = buffer[7]; pmt.PCR_PID = ((buffer[8] & 0x1f) << 8) | buffer[9]; pmt.program_info_length = ((buffer[10] & 0x0f) << 8) | buffer[11]; int i = 12 + pmt.program_info_length; while (i < 12 + pmt.section_length - 4) { pmt.stream_type = buffer[i]; pmt.elementary_PID = ((buffer[i+1] & 0x1f) << 8) | buffer[i+2]; pmt.ES_info_length = ((buffer[i+3] & 0x0f) << 8) | buffer[i+4]; i += 5 + pmt.ES_info_length; } } // 提取视频流或音频流的数据 else if (buffer[1] == pmt.elementary_PID) { // TODO: 提取数据 } } fclose(fp); return 0; } ```

相关推荐

#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/shm.h> #include #define SHM_PATH "/mnt/hgfs" struct mt { int num; pthread_mutex_t mutex; pthread_mutexattr_t mutexattr; }; int main () { int iRet=0; unsigned nMemSize=sizeof(struct mt); struct mt *pMt; int iShm_id=0; key_t key =ftok(SHM_PATH, 0); iShm_id=shmget(key,nMemSize,0660|IPC_CREAT); printf("key :iShmID = %d:%d ",key, iShm_id); if(iShm_id<0) { iRet=-1; perror("shmget failed "); return iRet; } pMt = (struct mt*)shmat(iShm_id, NULL, 0); if (-1 == (long)pMt) { perror("shmat addr error "); return -1; } pMt->num=0; pthread_mutexattr_init(&pMt->mutexattr); //???mutex???? pthread_mutexattr_setpshared(&pMt->mutexattr, PTHREAD_PROCESS_SHARED); //?????????? pthread_mutex_init(&pMt->mutex, &pMt->mutexattr); //?????mutex? pid_t child_pid; printf ("the main program process ID is %d ", (int) getpid ()); child_pid = fork (); if (child_pid != 0) { int i=0; int iTmp=0; for (i = 0; i < 1000; i++) { pthread_mutex_lock(&pMt->mutex); iTmp=(pMt->num); printf("-parent----num++ %d ", pMt->num); pMt->num=iTmp+1; pthread_mutex_unlock(&pMt->mutex); usleep(1000); } if (0!= shmdt((void*)pMt)) { perror("shmdt addr error "); return -1; } } else { int i=0; int iTmp=0; for (i = 0; i < 1000; i++) { pthread_mutex_lock(&pMt->mutex); iTmp=(pMt->num); printf("*******************child----num++ %d ", pMt->num); pMt->num=iTmp+1; pthread_mutex_unlock(&pMt->mutex); usleep(1000); } if (0!= shmdt((void*)pMt)) { perror("shmdt addr error "); return -1; } } return 0; }

最新推荐

recommend-type

用PMT函数、fv函数实现贷款利息计算

用PMT函数、fv函数实现贷款利息计算,用PMT函数、fv函数实现贷款利息计算.
recommend-type

DVB 介绍以及MPEG-2 SYSTEM和ts流的结构构成

介绍了MPEG2-SYSTEM ,以及打包成ts流的结构框架,细数ts流中的各项参数的定义和用途。
recommend-type

java中每月等额与先息后本计算

一般信用贷款会提供两种还款方式:每月等额或者先息后本。每月等额,就是每月归还等同的部分本金和利息,你手里在使用的本金其实是逐月减少的。先息后本就是先还利息,到期归还本金。本文将介绍他们的实现方法。...
recommend-type

Gerber文件各层扩展名与原PCB各层的对应关系

protel所产生的gerber,都是统一规范的,具体表现以下方面: 1.扩展名的第一位g一般指gerber的意思 2.扩展名的第二位代表层的面,b代表bottom面,t代表top面,g+数字代表中间线路层,g+p+数字代表电源层。...
recommend-type

项目计划 Project Plan

[The FocusPM Project Plan document (PMT1600) contains a series of processes (referred to as “plans” in this document) all of which need to be considered very early in the project lifecycle....
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

ActionContext.getContext().get()代码含义

ActionContext.getContext().get() 是从当前请求的上下文对象中获取指定的属性值的代码。在ActionContext.getContext()方法的返回值上,调用get()方法可以获取当前请求中指定属性的值。 具体来说,ActionContext是Struts2框架中的一个类,它封装了当前请求的上下文信息。在这个上下文对象中,可以存储一些请求相关的属性值,比如请求参数、会话信息、请求头、应用程序上下文等等。调用ActionContext.getContext()方法可以获取当前请求的上下文对象,而调用get()方法可以获取指定属性的值。 例如,可以使用 Acti
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。