Filtergraph在第一次数据传递后停止

时间:2014-03-19 09:22:03

标签: c++ directshow

编辑:最初的问题是,在调用我的自定义过滤器时,filtergraph停止了。我们通过在deliver方法中设置样本的time属性来解决这个问题。

我简化了我的图表 basic file recorder

这适用于将视频从网络摄像头录制到文件。

但是,如果我把我的过滤器放在其间:

enter image description here

我得到了奇怪的结果:

enter image description here

所以看起来它没有编码。但是如果没有这个过滤器,avi mux也不会​​对网络摄像头的视频进行编码。 这是outputpin的更新传递方法:

 HRESULT MCMyOutputPin::Deliver(IMediaSample* sample)
{
    CAutoLock mylock(this->m_pLock);
    HRESULT hr = NO_ERROR;
    myLogger->LogDebug("In Outputpin Deliver", L"D:\\TEMP\\yc.log");
    if (sample->GetActualDataLength() > 0)
    {
        IMediaSample *outsample;


        if (!m_pAllocator)
            return E_FAIL;
        hr = m_pAllocator->GetBuffer(&outsample, NULL, NULL, NULL);
        if (FAILED(hr))
        {
            myLogger->LogDebug("Could not get buffer", L"D:\\TEMP\\yc.log");
            return hr;
        }
        BYTE* sampleBuffer = NULL;
        BYTE*  newBuffer = NULL;
        long lSizeSample = sample->GetSize();
        long lSizeOutSample = outsample->GetSize();
        outsample->GetPointer(&newBuffer);
        sample->GetPointer(&sampleBuffer);
        LONGLONG timeStart = NULL;
        LONGLONG timeEnd = NULL;
        REFERENCE_TIME refTime = NULL;
        REFERENCE_TIME reftimeend = NULL;
        sample->GetMediaTime(&timeStart, &timeEnd);
        sample->GetTime(&refTime, &reftimeend);
        ASSERT(lSizeOutSample >= lSizeSample);
        memcpy((void *)newBuffer, (void *)sampleBuffer, lSizeSample);
        outsample->SetMediaTime(&timeStart, &timeEnd);
        outsample->SetTime(&refTime, &reftimeend);
        m_pInputPin->Receive(outsample);







        outsample->Release();
        sample->Release();




    }

    return hr;
    //Forward to filter
}

所以我的问题是:如果我现在所有的过滤器都是,那么无论如何都要转发样本而不是改变它们,为什么我会得到这个结果。

1 个答案:

答案 0 :(得分:1)

AVI Mux 非常对样本媒体时间敏感。在您的代码中,我没有看到为传递给AVI Mux的样本设置适当的媒体时间。没有这些时间,它无法确定正确的帧速率和帧顺序,因此可能会停止。