精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>图形图像及多媒体专题>>dat->mpg

主题:dat->mpg
发信人: tengel()
整理人: wenbobo(2002-12-27 15:58:15), 站内信件
还不完善,请网友雅正

// Dat2Mpg.cpp : Defines the entry point for the console application.

//

#include <stdio.h>
#include <stdlib.h>

typedef struct _VCD_DAT
{
 char riff[4];
 long length; 
 char cdxa[4];
 char fmt [4];
 char unknown[20];
 char data[4];
 long datalength; //实际数据总字节数,其值除以2352后为数据扇区数
}VCD_DAT;


int dat2mpg(FILE *fsrc,FILE *fdes);

int main(int argc, char* argv[])
{
if(3!=argc){
printf("Usage: %s datfie mpgfile\n",argv[0]);
exit(1);
}

FILE *fsrc=fopen(argv[1],"rb");
if(!fsrc){
printf("Could not open file %s\n",argv[1]);
exit(2);
}

FILE *fdes=fopen(argv[2],"wb");
if(!fdes){
printf("Could not open file %d\n",argv[2]);
exit(3);
}

int suc=dat2mpg(fsrc,fdes);
if(0!=suc){
printf("Failed of dat2mpg.\n");
exit(4);
}

fclose(fdes);
fclose(fsrc);

return 0;
}

int dat2mpg(FILE *fsrc,FILE *fdes)
{
char bbuf[2352];
char *buf=bbuf;
int len;
VCD_DAT vd;

len=fread(&vd,sizeof(vd),1,fsrc);
//fwrite(buf,44,1,fdes);
printf("Process file header.\n");
int sector=vd.datalength/2352;

//fseek(fsrc,12,SEEK_CUR);
for(int i=0;i<sector;i++)
{
char *buf=bbuf;
fread(buf,2352,1,fsrc);
//fwrite(buf+24,2324,1,fdes);
//fflush(fdes);

if ((buf[19] == 0x0f) ||// && (buf[18] & SUBMODE_VIDEO) == SUBMOD
E_VIDEO) || //视频扇区
(buf[19] == 0x7f))// && (buf[18] & SUBMODE_AUDIO) == SUBMODE_AUDIO)
) //音频扇区
{
buf+=12;
if ((*(long *)(buf + 24)) == 0xbb010000)
{
//输出系统头,系统头后面的填充小包被舍弃
//int len=(buf[29]<<8)+buf[28]+28+2;
len=27;
fwrite(buf+12, len,1,fdes);
}
else
{
//计算音/视频包的长度
//int len = (buf[28] << 8) + buf[28 + 1] + 28 + 2;
len=2324;
//输出一个音/视频包
fwrite(buf+12, len,1,fdes);
}
}
}
int end_code=0x000001b9;
fwrite(&end_code,4,1,fdes);

return 0;
}

--
_
O @___ G : \
/|__ /|/ /\|\ : \
/|/_ / /\ \ X_ : \
/ | __/ \ | \ 0 : \
/ 0 0| / : \

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.139.145]

[关闭][返回]