编辑:最初的问题是,在调用我的自定义过滤器时,filtergraph停止了。我们通过在deliver方法中设置样本的time属性来解决这个问题。
我简化了我的图表
这适用于将视频从网络摄像头录制到文件。
但是,如果我把我的过滤器放在其间:
我得到了奇怪的结果:
所以看起来它没有编码。但是如果没有这个过滤器,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
}
所以我的问题是:如果我现在所有的过滤器都是,那么无论如何都要转发样本而不是改变它们,为什么我会得到这个结果。
答案 0 :(得分:1)
AVI Mux 非常对样本媒体时间敏感。在您的代码中,我没有看到为传递给AVI Mux的样本设置适当的媒体时间。没有这些时间,它无法确定正确的帧速率和帧顺序,因此可能会停止。