请教一个dspack中Memfile的问题

qzmp_sc 2010-06-24 03:27:37
每次播放流的时候,第一次读取的数据为256K,请问有什么办法可以把第一次读取的数据修改为别的数据
...全文
83 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kye_jufei 2010-07-07
  • 打赏
  • 举报
回复
跟蹤dspack或參照《DirectShow开发指南》裡找找允许按需赋值的函數.
qzmp_sc 2010-06-26
  • 打赏
  • 举报
回复
function TBCAsyncOutputPin.NonDelegatingQueryInterface(const IID: TGUID;
out Obj): HResult;
begin
//Result := Inherited NonDelegatingQueryInterface(IID, Obj);
//IID_IStreamBuilder
if IsEqualGUID(IID, IID_IAsyncReader) then
begin
FQueriedForAsyncReader := True;
if GetInterface(IID_IAsyncReader, Obj) then
Result := S_OK
else
Result := E_FAIL;
end
else
Result := Inherited NonDelegatingQueryInterface(IID, Obj);
end;
今天试出来,在delphi里,这个函数里的IID=IID_IAsyncReader
而在VC的demo里,IID=IID_IStreamBuilder
难道就是这里的问题?
qzmp_sc 2010-06-24
  • 打赏
  • 举报
回复
这个我倒是都试过了,包括所有常量
只有一个叫OLE_S_FIRST为16进制的40000符合要求,但是并没有调用到它
亮剑_ 2010-06-24
  • 打赏
  • 举报
回复
SyncRead在哪里调用的不知道?
这个ALength既然设计成函数参数,就是允许按需赋值的
试试搜一下256K这个数字,KB/Byte/bit单位都试一下
qzmp_sc 2010-06-24
  • 打赏
  • 举报
回复
根据我代码的跟踪,只能跟踪到
function TBCAsyncOutputPin.SyncRead(APosition: Int64; ALength: Longint;
ABuffer: Pbyte): HResult;
这个函数,就上不去了,不知道是哪里调用了这个函数,并且赋值ALength=256K
C的代码里也只跟踪到
CAsyncOutputPin::SyncRead(
LONGLONG llPosition, // absolute Io position
LONG lLength, // nr bytes required
BYTE* pBuffer) // write data here
{
return m_pIo->SyncRead(llPosition, lLength, pBuffer);
}
它给lLength的赋值是1M

我产生的问题就是因为这个值的不同,所以C的demo能播放的MV在delphi的demo里不能播放
qzmp_sc 2010-06-24
  • 打赏
  • 举报
回复
可能是我没说清楚
它的256K是在GetOutpin的时候读的,随后还会读一批64K的数据,后面64K的不需要更改,只需要把第一次的这个256K改掉就行了。因为如果只读256K,那么有些MV要么没视频,要么没音频。而《DirectShow开发指南》里的MPEG NetWork的例子是读了1M,它就能正常播放MV
亮剑_ 2010-06-24
  • 打赏
  • 举报
回复
就是修改一次读取的数据大小了
安装 1 增加搜索路径 (DSPackDir)\src\DirectX9 和 (DSPackDir)\src\DSPack 在delphi7选择菜单【Tools】-【Enviroment Options】,在打开的窗口选择Library页签,在Library Path一项添加这两个目录C:\Borland\VCL\DSPACK234\src\Directx9 ;C:\Borland\VCL\DSPACK234\src\DSPack (将其直接粘贴在原有内容的后面,或者点击Library Path后面的...按钮添加) 2 编译 (DSPackDir)\packages\DirectX9_D7.dpk 双击(DSPackDir)\packages\DirectX9_D7.dpk,在delphi7会显示一个关于重新创建资源文件的对话框,点击OK就可以了。 在delphi7的打开窗口点击compile按钮,完成编译。 在delphi7选择菜单【File】-【Close All】,在提问是否保存时,选择保存。 3 编译 (DSPackDir)\packages\DSPack_D7.dpk 双击(DSPackDir)\packages\DSPack_D7.dpk,在delphi7会显示一个关于重新创建资源文件的对话框,点击OK就可以了。 在delphi7的打开窗口,点击compile按钮,完成编译。 在delphi7选择菜单【File】-【Close All】,在提问是否保存时,选择保存。 4 编译并安装 (DSPackDir)\packages\DSPackDesign_D7.dpk 双击(DSPackDir)\packages\DSPackDesign_D7.dpk,在delphi7会显示一个关于重新创建资源文件的对话框,点击OK就可以了。 在delphi7的打开窗口,点击compile按钮,完成编译。 点击Install按钮,完成安装。 在delphi7选择菜单【File】-【Close All】,在提问是否保存时,选择保存。 至此,安装已完成,在delphi的控件面板上可以找到DSPack的页签了。 如果在Delphi5或6安装,则选择对应的D5或D6的文件。 (安装过程遇到了一个编译错误,说找不到Jedi.inc。这个文件在src\Directx9目录下,为什么不能搜索。原来文档里写的路径是 (DSPackDir)\src\Directx9,而实际解压缩出来的目录名是DirectX9,所以添加搜索路径的时候一定要注意这个问题。把x改成X后,编译就通过了)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧