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_ITEMS如果您只提供一种类型,那没关系,但如果 iPosition 太高,请不要忘记发送。

sps/pps 更改随媒体样本一起发送。您只需将新的媒体类型添加到FillBuffer. 一些解码器甚至不需要它,他们只是从数据流中读取 sps/pps。

于 2012-08-28T05:16:48.893 回答