⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfsdecord.c

📁 cmmb标准中mfs流的视频解析源代码 自己写的 格式不是很规范 可以实现功能
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>


FILE *ipread;
FILE *ipwrite0;



int count=0;

int   filesize(FILE *filename)   
  {

	//Give the size of the file.
	int length=0; 
		if(ipread==NULL)   
                    {   
						return   -1;   
                    }   
	fseek(ipread,   0L,   SEEK_END);   
	length = ftell(ipread);   
    fclose(ipread);   
  return   length;   
    
  }

int Framesize(FILE *filename)
{
	//Give the number of Frame in this file.
	char a[4];
	unsigned char b[4];//must be unsigned or wrong
	int i=0;
	fread(a,1,4,ipread);
	if(a[0]==0x0&&a[1]==0x0&&a[2]==0x0&&a[3]==0x1)
		i++;
	else
		return -1;
	while(!feof(ipread))
	{
		fread(b,1,4,ipread);
		fread(a,1,4,ipread);
		if(a[0]==0x0&&a[1]==0x0&&a[2]==0x0&&a[3]==0x1&&b[0]==0xFF&&b[1]==0xFF&&b[2]==0xFF&&b[3]==0xFF)
			i++;
	
	}

	return i;
	
	fclose(ipread);
}

void filecopy(FILE *ifp, FILE *ofp,int length )
{
	char a[1];
	int i=0;
	while(i<length)
	{
		fread(a,1,1,ifp);
		fwrite(a,1,1,ofp);
		i++;
	}
	return;
}

void videofind(FILE *filename)
{
	unsigned char a[4];
	unsigned char b[4];
	unsigned char length_of_head[1];
	unsigned int length_Of_head;
	unsigned long int length_of_subsonframe[1];
	unsigned char d[3];
	unsigned int d0,d1,d2,d3;
	unsigned long int length_Of_subsonframe;
	unsigned char length_of_subsonhead[1];
	unsigned int length_Of_subsonhead;
	unsigned int length_of_videohead[1];
	unsigned int length_Of_videohead;
	unsigned int length_of_video[1];
	unsigned int length_Of_video;
	unsigned int videounit_num;
	unsigned int i;
	unsigned short int length_of_videounit[50];
	unsigned char videostream_num[50];
	long int temp;
	unsigned int purevideo_length;
	unsigned char temp_copy[1];
	int temp_i=0;
	
	unsigned char test_do1[1];
	unsigned char test_do2[1];
	

	fread(a,1,4,ipread);
	if(a[0]==0x0&&a[1]==0x0&&a[2]==0x0&&a[3]==0x1)
	{	
		fread(length_of_head,1,1,ipread);
		length_Of_head=length_of_head[0];
		printf("length_Of_head=%d\n",length_Of_head);
		fseek(ipread,11L,SEEK_SET);
		fread(test_do1,1,1,ipread);//确定复用子帧数目
		test_do1[0]=test_do1[0]&0x0f;//确定复用子帧数目
		fseek(ipread,12L,SEEK_SET);//复用子帧数目为1,读取复用子帧1的长度 3个字节
		fread(d,3,1,ipread);//小印第安序
		d1=d[0];
		d2=d[1];
		d3=d[2];
		d1=(d1<<16)&0x00FF0000;
		d2=(d2<<8)&0x0000FF00;
		d3=d3&0x000000FF;
		d0=(0x00|d3|d2|d1);
		length_Of_subsonframe=d0;
		printf("length_Of_subsonframe=%d\n",length_Of_subsonframe);
		fseek(ipread,length_Of_head+4L,SEEK_SET);//指向复用子帧头
		fread(length_of_subsonhead,1,1,ipread);
		length_Of_subsonhead=length_of_subsonhead[0];
		printf("length_Of_subsonhead=%d\n",length_Of_subsonhead);
		fseek(ipread,5L,SEEK_CUR);
		fread(d,3,1,ipread);
		d1=d[0];
		d2=d[1];
		d3=d[2];
		d1=(d1<<16)&0x00FF0000;
		d2=(d2<<8)&0x0000FF00;
		d3=d3&0x000000FF;
		d0=(0x00|d3|d2|d1);
		d0=d0>>3;
		d0=d0&0x001fffff;
		test_do2[0]=d[2];
		test_do2[0]=test_do2[0]&0x07;//确定视频流总数
		length_Of_video=d0;
		printf("length_of_video=%d\n",length_Of_video);

		fseek(ipread,length_Of_head+4L+length_Of_subsonhead+4L,SEEK_SET);//指向视频段头
		fread(d,2,1,ipread);
		d1=d[0];
		printf("d[0]=%d\n",d[0]);
		d2=d[1];
		printf("d[1]=%d\n",d[1]);
		d1=(d1<<8)&0x0000FF00;
		d2=d2&0x000000FF;
		d0=(0x00|0x00|d2|d1);
		d0=d0>>4;
		d0=d0&0x00000FFF;
		length_Of_videohead=d0;

		printf("length_Of_videohead=%d\n",length_Of_videohead);

		purevideo_length=length_Of_video-length_Of_videohead-4;
		printf("purevideo_length=%d\n",purevideo_length);
		fseek(ipread,length_Of_head+4L+length_Of_subsonhead+4L+length_Of_videohead+4L,SEEK_SET);//指向视频单元开头
		if(test_do1[0]==1&&test_do2[0]==1)
			{
				filecopy(ipread,ipwrite0,purevideo_length);
			}
			else
				{
					;
				}

		
		fseek(ipread,4L,SEEK_SET);
	}
	else
		return;

		while(!feof(ipread))
		{
		fread(b,1,4,ipread);
		fread(a,1,4,ipread);
		if(a[0]==0x0&&a[1]==0x0&&a[2]==0x0&&a[3]==0x1&&b[0]==0xFF&&b[1]==0xFF&&b[2]==0xFF&&b[3]==0xFF)
		{
			temp=ftell(ipread);
		
			fread(length_of_head,1,1,ipread);
			length_Of_head=length_of_head[0];
			printf("length_Of_head=%d\n",length_Of_head);
			fseek(ipread,11L+temp-4L,SEEK_SET);
			fread(test_do1,1,1,ipread);//确定复用子帧数目
			test_do1[0]=test_do1[0]&0x0f;//确定复用子帧数目
			fseek(ipread,12L+temp-4L,SEEK_SET);//复用子帧数目为1,读取复用子帧1的长度 3个字节
			fread(d,3,1,ipread);
			d1=d[0];
			d2=d[1];
			d3=d[2];
			d1=(d1<<16)&0x00FF0000;
			d2=(d2<<8)&0x0000FF00;
			d3=d3&0x000000FF;
			d0=(0x00|d3|d2|d1);

			length_Of_subsonframe=d0;
			printf("length_Of_subsonframe=%d\n",length_Of_subsonframe);
			fseek(ipread,length_Of_head+4L+temp-4L,SEEK_SET);//指向复用子帧头
			fread(length_of_subsonhead,1,1,ipread);
			length_Of_subsonhead=length_of_subsonhead[0];
			printf("length_Of_subsonhead=%d\n",length_Of_subsonhead);
			fseek(ipread,5L,SEEK_CUR);
			fread(d,3,1,ipread);
			d1=d[0];
			d2=d[1];
			d3=d[2];
			d1=(d1<<16)&0x00FF0000;
			d2=(d2<<8)&0x0000FF00;
			d3=d3&0x000000FF;
			d0=(0x00|d3|d2|d1);
			d0=d0>>3;
			d0=d0&0x001fffff;
			test_do2[0]=d[2];
			test_do2[0]=test_do2[0]&0x07;//确定视频流总数
			length_Of_video=d0;
			printf("length_of_video=%d\n",length_Of_video);

			fseek(ipread,length_Of_head+4L+length_Of_subsonhead+4L+temp-4L,SEEK_SET);//指向视频段头
			fread(d,2,1,ipread);
			d1=d[0];
			printf("d[0]=%d\n",d[0]);
			d2=d[1];
			printf("d[1]=%d\n",d[1]);
			d1=(d1<<8)&0x0000FF00;
			d2=d2&0x000000FF;
			d0=(0x00|0x00|d2|d1);
			d0=d0>>4;
			d0=d0&0x00000FFF;
			length_Of_videohead=d0;
			printf("length_Of_videohead=%d\n",length_Of_videohead);


			purevideo_length=length_Of_video-length_Of_videohead-4;
			printf("purevideo_length=%d\n",purevideo_length);
			fseek(ipread,length_Of_head+4L+length_Of_subsonhead+4L+length_Of_videohead+4L+temp-4L,SEEK_SET);
			if(test_do1[0]==1&&test_do2[0]==1)
			{
				filecopy(ipread,ipwrite0,purevideo_length);
			}
			else
			{
				;
			}
			fseek(ipread,temp,SEEK_SET);
		}
		}



	return;
}



int main()
{
	int File_Size=0;
	int Frame_Size=0;
	ipread = fopen("D:/mydesign/MFS_Decorder/CCTV-3 12-09_1410.mfs","rb");
	ipwrite0 = fopen("D:/mydesign/MFS_Decorder/myfile_out0.txt","wb");
	
	File_Size=filesize(ipread);//give the filesize.
	printf("filesize=%d\n",File_Size);//print filesize.
	ipread = fopen("D:/mydesign/MFS_Decorder/CCTV-3 12-09_1410.mfs","rb");//open file for the file had been closed in fuc filesize.
	Frame_Size=Framesize(ipread);
	printf("Framsize=%d\n",Frame_Size);
	ipread = fopen("D:/mydesign/MFS_Decorder/CCTV-3 12-09_1410.mfs","rb");
	videofind(ipread);
	fclose(ipread);
	fclose(ipwrite0);	
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -