感谢所有查看我问题的人。
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::SetFormat
GetMediaType
并且还有另一个版本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;
}