2014-03-19 24 views
0

編輯:最初的問題是當調用我的自定義過濾器時,filtergraph停止。我們通過在交付方法中設置樣本的時間屬性來解決此問題。Filtergraph在第一次數據傳遞後停止

我簡化我的圖 basic file recorder

也能正常工作從攝像頭到一個文件中記錄的視頻。

但是如果我把我的過濾器之間:

enter image description here

我得到了奇怪的結果:

enter image description here

所以它看起來是不是編碼。但是如果沒有這個過濾器,avi多路複用器也不會爲網絡攝像頭編碼視頻。 這裏是更新交付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

你想通過AVI Mux寫兩個視頻流嗎?我不確定它可以處理。它可能會導致圖形停止。 –

+1

現在你完全改變了這個問題。請不要這樣做,只是發佈一個新的。對於新的問題:我認爲問題出現在媒體類型中,因此產生了AVI頭文件。保存兩個AVI文件,一個沒有過濾器,一個沒有過濾器。然後仔細看看他們的標題,看看有什麼不同。 AVIMasterGUI是一個非常好的工具。 –

回答

1

AVI Mux是非常對敏感的樣本媒體時代。在您的代碼中,我看不到爲傳遞給AVI Mux的樣本設置適當的媒體時間。沒有這些時間,它不能確定適當的幀速率和幀順序,所以它可能會停止。

相關問題