发信人: 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]
|
|