每次播放流的时候,第一次读取的数据为256K,请问有什么办法可以把第一次读取的数据修改为别的数据

解决方案 »

  1.   

    可能是我没说清楚
    它的256K是在GetOutpin的时候读的,随后还会读一批64K的数据,后面64K的不需要更改,只需要把第一次的这个256K改掉就行了。因为如果只读256K,那么有些MV要么没视频,要么没音频。而《DirectShow开发指南》里的MPEG NetWork的例子是读了1M,它就能正常播放MV
      

  2.   

    根据我代码的跟踪,只能跟踪到
    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里不能播放
      

  3.   

    SyncRead在哪里调用的不知道?
    这个ALength既然设计成函数参数,就是允许按需赋值的
    试试搜一下256K这个数字,KB/Byte/bit单位都试一下
      

  4.   

    这个我倒是都试过了,包括所有常量
    只有一个叫OLE_S_FIRST为16进制的40000符合要求,但是并没有调用到它
      

  5.   

    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
    难道就是这里的问题?
      

  6.   

    跟蹤dspack或參照《DirectShow开发指南》裡找找允许按需赋值的函數.