VOD高手请过来,有谁这么写过神龙卡回调函数???(80分)

  • 主题发起人 主题发起人 lovealian911
  • 开始时间 开始时间
L

lovealian911

Unregistered / Unconfirmed
GUEST, unregistred user!
一般神龙卡的回调函数中包含:
case FMPM_BUF_SEEK:
SetFilePointer( Buf->hFile, (LONG)dwValue, 0, FILE_begin
);
case FMPM_BUF_POS:
ReadFile( Buf->hFile, Buf->Buffer[Buf->wIndex], MAX_BUF_SIZE,&Buf->dwSize, NULL );

现在我的想法是先把歌曲文件从服务器中分段读取到本地计算机的虚拟内存中,然后使用copymemory的方法把这些数据拷贝到神龙卡的内存中,实现播放,也就是把ReadFile换掉。
测试中,具体播放是没有问题的,只是在一首歌强制中断播放后(停止并关闭流),发现在下一首歌中的开始部分会丢失1~2M的数据,而那个地方有的时候是非常重要的,经常不出现歌名,甚至一开始歌手就已经唱过了半句……敢问各位高手有什么好的方法可以解决呢?我的case FMPM_BUF_SEEK:中不知道该怎么去定位指针,就没写语句!
麻烦各位高手帮忙解决,小弟分不多了,等发了财,保证有福同享!
 
我想问题不在卡本身的 Seek 的问题吧,没用过你这种方法.

你先检查一下Copy 文件的时候传过来的数据正确吗.

释放流的时候一定要清掉指针

FMPStop(FMPEGStream);
FMPClose(FMPEGStream);
FMPEGStream := 0;//*
 
to victor7780
你的网站怎么打不开:(
to amakusa
Copy文件传过来的数据是正确的(你指的是那1~2M的数据?这个倒没有详细检查)
在释放流的时候我和你上面写的完全一样的!不过我检测到在停止以后在
case FMPM_BUF_POS:里面,即第二次open的时候,神龙卡以一种超快的速度读取包,但是
好象并没把这段数据给播放出来……这个问题困扰我好久了,大哥你有什么好的方法解决
吗?数据我是由服务器端通过socket传送过来到我的内存的,有一种现象就是在这首歌没唱
完的时候强制让他唱下一首时,我们要发个命令个服务器,在服务器接收到唱下首歌指令的
以前服务器还在不停的给客户机传送数据,而客户机(我的机器)却早已在按下stop时就已
经停止接收了,我怀疑是这一段时间差造成的,因为在一首接一首唱完的情况下,绝对不会
有丢失数据的现象,我没辙了……
 
to amakusa
Copy文件传过来的数据是正确的
 
我的也是这样写的.没有这种问题啊.
FMPM_BUF_CLOSE ://关闭缓冲区
begin

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

GlobalFreePtr(Buf^.Buffer);
GlobalFreePtr(Buf);
end;


FMPM_BUF_SEEK://跳跃
begin

SetFilePointer(Buf^.hFile,dwValue,nil,FILE_begin
);
end;


FMPM_BUF_POS://读数据
begin

if bIsCyFile then
//该文件为加密过的
begin

//TempBuf
ReadFile(Buf^.hFile,TempBuf,MAX_BUF_SIZE,iRead,nil);
if (TempBuf[iRead-3]=67) and (TempBuf[iRead-2]=74) and (TempBuf[iRead-1]=84) then
iRead:=iRead-3;//最后三字节为"CJT',为文件结尾加密标志,丢弃.
UnCryptBuf(TempBuf,iRead);
CopyMemory(Buf^.Buffer[Buf^.wIndex],@TempBuf,iRead);
Buf^.dwSize:=iRead;
end
else

ReadFile(Buf^.hFile,Buf^.Buffer[Buf^.wIndex]^,MAX_BUF_SIZE,Buf^.dwSize,nil);
//强烈注意!!!!
end;

 
to jingtao 老大:
VCD的已经解决 ,网站也能进了!先说谢谢!
这里我还有一点问题,我现在还没有对歌曲文件进行加密,另外由于我的TempBuf
的数据是由服务器端发过来的,所以我将Buf^.hFile=nil,也就是说没有了路径可言,
所以在
FMPM_BUF_SEEK://跳跃
//这里不知该如何写
也可能是由于这个原因,出现了前面掉头的现象。老大,有什么好的方法吗?小弟想了
很久都没解决,汗……
 
to jingtao 老大:
发现VCD有一个问题,就是中间部分是每个包都是2352个字节,但是到了最后一个
包,好象每个VCD文件都远远不止2352个字节了,大约有6~7000个字节左右(我检测了
两首歌),这个也许就是我上次说的那个为什么最后不播完的原因,而神龙卡的播放到
这个位置好象也触发了complete,这最后的部分数据具体是什么用的呢?包尾?我从您
的网站上下了DatToMpg的小软件,发现您保留了这一部分数据的一部分,具体这部分数
据有什么用吗?
另外,在您的一篇关于资源文件使用的文章中说到有关于gif.pas,但我检索了好久
都没找到这个东东,您那有吗?能不能发给我一份?enzhiyiqiu@163.com
真不好意思啊,老大,一打扰就是一堆!
 
不要叫老大,呵呵.
如果数据是从网络上来的.那么你肯定保存在某个缓冲区吧.具体要根据你的缓冲是什么来决定的.(STREAM?ARRAY BUF?..)

最后一个包是什么意思啊?应该不可能有那么大的,肯定是小于2352.
因为,比如说你的VCD文件7068965字节,头是17568字节,那么(7068965-17568)/2352=2998.04
那么最后一个包是不足2352的,不可能有6~7000个字节哦.
DatToMpg的小软件是这样处理的:把全部数据包整除2352,得到包数量.最后一个包不足2352字节,丢弃就是了.因为一般流畅的话每秒钟需要75个数据包左右的.最后一个包丢弃好了.

神龙卡用流方式播放DAT的话,我的方法好简单:直接把文件头定位到数据包开始的位置,例如上面的17568的位置,后面我根本不用管就可以播放了.
关键在于找到.其实也很简单:在比较前面的地方查找
DatHead:array[0..3]of byte=($00,$00,$01,$ba)//这四个数前面就是DAT的头了.
GIF.PAS已发.请查收.

 
①那就不叫好了,呵呵,大哥吧(别怪我套近乎,哈哈啊~,经过你网站上的娃娃照片
验证,发现你我年龄差不多,但你应该比我大点,只是我的学识却和你差了很多年了,惭
愧!)
②我设置的缓冲是ARRAY BUF,在CSDN上有人告诉我说要把关键帧设小点,可是好象
神龙卡上并没有能够设置该东东的玩意儿吧?你有什么可爱的方法能够帮帮小弟吗?
③我用网络上接收的数据,就是不去掉那个17568的头,大部分也能播放,只是效果
不好,就是那种,隔那么一段就有闪烁的现象,有的时候不能播放完整首歌。现在我按你
说的把17568去掉后,也能播,只是还有闪烁的现象!但是如果把他转成MPG就没有任何问
题了,播放得很流畅!
④我说的最后一个包的意思是在最后一个($00,$00,$01,$ba)后面大概有6~7000个字节
中不再出现($00,$00,$01,$ba)了,我把这部分去掉后,对播放好象没影响的!我没有用整
除2352来做的,因为我怕一个包中由于其他的原因(例如数据损坏)多了一个字节或少了一
个字节,就变成2353或2351了,于是就用循环判断每个包,当包头($00,$00,$01,$ba),而
总字节不对的时候,就丢弃他,直到下个($00,$00,$01,$ba)。
我想请教一下这是我的VCD文件的问题(我身边有几首小刚的,都有这个现象)?另外,我对各种格式的媒体文件结构都不熟悉,想知道就是当他的数据损坏的时候,他会不会
出现像我说的那种多个字节,少个字节的现象,还是用其他的数据来代替这个字节呢?
gif.pas我已经收到了,感谢!!
 
唉!还有人在搞神龙卡呀
 
to silicon 大哥:
汗……我命苦不能怪政府啊!
那您用啥??还是自己做?!呵呵
 
呵呵.最近两个月一直都很忙,都是凌晨4点才睡(赶私活).回复迟了,不好意思.
我觉得你把问题复杂化了.你这样试试:把VCD去掉头,然后每2352字节只取前面的2324字节.
不用循环判断每个包.应该没有问题. 你从文件头开始,查找第一个$00,$00,$01,$ba.这个就是头.后面你就不用管$00,$00,$01,$ba的事情了,当它不存在好了.不会出现那种多一个字节或者少一个字节的问题的.数据损坏的话.只会导致马赛克,就是字节内容变了,长度不会变的.
闪烁是因为你播放的还是DAT,不是纯MPG.你可以用上面的方法,在内存中动态转化为MPG.
 
呵呵,那就真不好意思,权且这样咯,只是那没头的问题我还得好好研究下!
谢谢大哥了,结贴了!
 
后退
顶部