0

私の質問を見てくれた皆さんに感謝します。

http://msdn.microsoft.com/en-us/library/windows/desktop/dd368709(v=vs.85).aspx

iPositionのパラメータに関するドキュメントからはあまり明確ではありません

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType *pMediaType
);

「ゼロベースのインデックス値」と言われていますが、どのようなインデックスですか?サンプルのインデックス?

H.264 NALUフロー(MEDIASUBTYPE_AVC1)を送信するソースフィルターがありますが、ビデオの再生後にSPS / PPSが変更される可能性があることを除けば、非常にうまく機能します。

SPSとPPSは構造体に追加され、メソッドが呼び出されたときにメソッドにMPEG2VIDEOINFO渡されます。CMediaType::SetFormatGetMediaType

GetMediaTypeそして、パラメータを受け入れる別のバージョンがありiPositionます。この方法でSPS/PPSを更新できるようです。

私の質問は次のとおりです。iPositionパラメータは何を意味し、デコーダフィルタは各NALUサンプルに割り当てられているSPS/PPSをどのように認識しますか。

HRESULT GetMediaType(int iPosition, CMediaType *pMediaType)
{
    ATLTRACE( "\nGetMediaType( iPosition = %d ) ", iPosition);
    CheckPointer(pMediaType,E_POINTER);  
    CAutoLock lock(m_pFilter->pStateLock());

    if (iPosition < 0)
    {
        return E_INVALIDARG;
    }
    if (iPosition == 0)
    {
        pMediaType->InitMediaType();
        pMediaType->SetType(&MEDIATYPE_Video); 
        pMediaType->SetFormatType(&FORMAT_MPEG2Video);  
        pMediaType->SetSubtype(&MEDIASUBTYPE_AVC1);
        pMediaType->SetVariableSize();

    }

    int nCurrentSampleID;
    DWORD dwSize = m_pFlvFile->GetVideoFormatBufferSize(nCurrentSampleID);
    LPBYTE pBuffer = pMediaType->ReallocFormatBuffer(dwSize);
    memcpy( pBuffer, m_pFlvFile->GetVideoFormatBuffer(nCurrentSampleID), dwSize);

    pMediaType->SetFormat(pBuffer, dwSize);


    return S_OK;
}
4

1 に答える 1

3

iPositionは、他の解像度や異なるエンコーディングなど、さまざまなメディアタイプを提供するために使用されます。また、例では、生のh246を提供するために使用されます。VFW_S_NO_MORE_ITEMS1つのタイプのみを提供する場合は問題ありませんが、iPositionが高すぎる場合は送信することを忘れないでください。

sps/ppsの変更はmediasamplesとともに送信されます。の現在のサンプルに新しいメディアタイプを追加するだけですFillBuffer。一部のデコーダーはそれを必要とせず、データストリームからsps/ppsを読み取るだけです。

于 2012-08-28T05:16:48.893 に答える