谁有用神龙卡的SDK包编的播放的程序,我有用MCI控制神龙卡的程序,(100分)

  • 主题发起人 主题发起人 wind520
  • 开始时间 开始时间
W

wind520

Unregistered / Unconfirmed
GUEST, unregistred user!
谁有用神龙卡的SDK包编的播放的程序,我有用MCI控制神龙卡的程序,
我们可以交换的
 
我用Delphi封装了神龙卡的SDK的控件,一些基本的功能实现了,比如音量大小,声道控制,转换电视与显示器等等,还有些没有实现,谁能帮助我?
谢谢
 
怎么没有人帮助我呀
我现在用这个回调函数可是编译不通过,谁能帮我,万分感谢!!
Procedure TFMPFPlay.Open;
begin

Fillchar(FMPOpenStruct,sizeof(TFMP_OPEN_STRUCT),0);
FMPOpenStruct.lpFileName:=Pchar(PlayName);
FMPOpenStruct.dwCALLback :=DWORD(@FMPCallbackProc);//错误
FMPEGStream := FMPOpen( FMPF_BUFFERS , DWORD(@FMPOpenStruct));
end;

Function TFMPFPlay.FMPCallbackProc(bMsg: Byte;
hMPEGStream: Byte;
dwValue: DWORD): WORD stdcall;
var
Buf:PBuf;
i:integer;
begin

// showmessage(inttostr(bmsg));
Result:= 0;
try
Buf:= Pointer(FMPGet(hMPEGStream, FMPI_STM_USER));
case bMsg of
//创建缓冲区
FMPM_BUF_CREATE:
begin

// showmessage('create');
GetMem(Buf,sizeof(TBuf));
//Buf := GlobalAllocPtr(GMEM_FIXED,sizeof(TBuf));
if Buf=nil then

begin

MessageBox(0,'分配内存出错,可能是内存不足!','错误',
MB_ICONEXCLAMATION);
Result:=FMPE_DOS;
Exit;
end;


Fillchar(Buf^,sizeof(TBUF),0);
Buf.hFile:= CreateFile(pChar(FPlayName),//TFMP_OPEN_STRUCT(dwValue).lpFileName,
GENERIC_READ,
FILE_SHARE_READ,
Nil,
OPEN_EXISTING,
0,
0);

if (Buf.hFile=INVALID_HANDLE_VALUE) then

begin

MessageBox(0,'打开文件出错!','错误',MB_ICONEXCLAMATION);
FreeMemory(buf);
//GlobalFreePtr( Buf );
Result:=FMPE_DOS;
Exit;
end;


for i := 0 to MAX_BUF_NUMBER-1do

GetMem(Buf.Buffer,MAX_BUF_SIZE + 2);
//GlobalAllocPtr(GMEM_FIXED, );

Buf.wIndex := 0;
Buf.dwSize := 0;

//存储缓冲区结构到用户段
FMPSet(hMPEGStream,FMPI_STM_USER, DWORD(Buf) );

//在到缓冲区3/4时,触发填充下一个缓冲区
FMPSet(hMPEGStream, FMPI_BUF_POS, DWORD(Trunc(MAX_BUF_SIZE* 0.75)));

//FMPSet(hMPEGStream,FMPI_BUF_MODE,FMPF_BUF_LOOP);
end;


//关闭缓冲区
FMPM_BUF_CLOSE :
begin

// showmessage('close');

CloseHandle(Buf.hFile);
for i:=0 to MAX_BUF_NUMBER-1do

FreeMemory(Buf.Buffer);
//GlobalFreePtr(Buf.Buffer);
FreeMemory(Buf);
//GlobalFreePtr(Buf);
end;


//跳跃
FMPM_BUF_SEEK:
begin

// showmessage('seek');
SetFilePointer(Buf.hFile,dwValue,nil,FILE_begin
);
end;


//读书据
FMPM_BUF_POS:
begin

//showmessage('readfile');
//showmessage('pos'+inttostr(Buf.wIndex));

if ReadFile(Buf.hFile,Buf.Buffer[Buf.wIndex],MAX_BUF_SIZE,Buf.dwSize,nil) then

// SHOWMESSAGE('READ OK');
// showmessage('pos'+inttostr(Buf.dwSize));
end;


// 缓冲区空
FMPM_BUF_EMPTY : //showmessage('Empty');//BufEmpty;
begin

//showmessage('empty'+inttostr(Buf.dwSize));
FMPSet(hMPEGStream, FMPI_BUF_SIZE,Buf.dwSize );
FMPSet(hMPEGStream, FMPI_BUF_ADDRESS, DWORD(Buf.Buffer[Buf.wIndex]));
// FMPSet( ghMPEGStream, FMPI_BUF_HANDLE, (DWORD)Buf->BufferIndex[Buf->wIndex] );
Inc(Buf.wIndex);
// showmessage(inttostr(Buf.wIndex));
if (Buf.wIndex = MAX_BUF_NUMBER) then
Buf.wIndex:=0;
//Buf.wIndex := MAX_BUF_NUMBER MOD Buf.wIndex;
end;


//错误
FMPM_ERROR:
begin

// showmessage('error');
end;

//操作完成
FMPM_COMPLETED :
begin

// showmessage('COMPLETED');
if dwValue = 3 then
// 播完
begin

//if AutoPlayNext then

// PostMessage(MainForm.Handle, FMP_NEXT, 0, 0)
//else

// Showmessage('已播完,按停唱播下一首');
end;

end
end;

except
//异常
CloseHandle(Buf.hFile);
for i:=0 to MAX_BUF_NUMBER-1do

FreeMemory(Buf.Buffer);
FreeMemory(Buf);
end;

end;
 
MCI不是挺好,为什么要用BUFFER呢?
 
FMPOpenStruct.dwCALLback :=DWORD(@FMPCallbackProc);//错误
这句是有错误的
而你的 TFMPFPlay.FMPCallbackProc 是类的成员函数, 不能作为callback

应该直接定义为外部函数
Function FMPCallbackProc(bMsg: Byte;
hMPEGStream: Byte;
dwValue: DWORD): WORD stdcall;




 
你的 Buffer:array[0..MAX_BUF_NUMBER-1]of char;是如何定义的?
好像GetMem不能这样调用的吧?
type
Buf=record
hFile:THandle;
dwSize:DWORD;
wIndex:Word;
Buffer:array[0..MAX_BUF_NUMBER-1]of char;
BufferIndex:array[0..MAX_BUF_NUMBER-1]of DWORD;
end;

TBuf=Buf;
PBuf=^Buf;
 
你的代码有问题的
修改一下即可.我已经通过了.
例如
Buf.hFile:= CreateFile...
Buf是指针来的
应该修改为
Buf^.hFile:= CreateFile
下面所有设计到BUF的都需要这样修改.
今天上午我对着写了一下.已经全部通过了.测试了几个小时还算稳定.
 
to jingtao 能留下你的QQ或者MSN吗?
 
QQ:11382404
实际上,神龙卡都带SDK的.开发起来非常简单的.
以前一直搞软解压的.以为硬解很复杂,最近因为工作需要,搞硬解压,我只用了一天时间,就把MCI方式,API发控制命令方式和流播放方式全部用DELPHI搞定了.经过测试还算比较稳定.
建议搞硬解压的朋友:看它带的SDK吧,里面全部都有了.
 
to jingtao
能把你的代码贴出来好吗?
 
上面你不是贴出来了吗?
就是修改BUF即可啊
 
对不起
我也想贴
可惜是为公司写的
SORRY
其实上面的就是了啊
 
多人接受答案了。
 
后退
顶部