2015-06-14 2 views
0

Я учусь использовать кодировщик H.264 в Windows Media Foundation.Как создать IMFSample для WindowsMediaFoundation H.264 encoder MFT

В настоящее время у меня есть медиа-образцы в формате YUV420p, поэтому это буферы, содержащие данные YYYYYYYYUVVV.

Поскольку MFT H.264 MFT требует ввода в виде IMFSample, я не уверен, как преобразовать данные в буфер в IMFSample.

Могу ли я просто сделать так:

IMFMediaBuffer *pBuffer = NULL; 
MFCreateMemoryBuffer(cbSize, &pBuffer); 
BYTE *pData = NULL; 
pBuffer->Lock(&pData, NULL, NULL); 
memcpy(pData, bufferIhaveinYYYYUV format, buffer size); // is it correct? 
pBuffer->Unlock(); 
IMFSample *pSample = NULL; 
MFCreateSample(&pSample); 
pSample->AddBuffer(pBuffer); 

Благодарности

ответ

1

Это как я это делаю (полный пример на https://github.com/sipsorcery/mediafoundationsamples/blob/master/MFMP4ToYUVWithMFT/MFMP4ToYUVWithMFT.cpp):

IMFMediaBuffer *srcBuf = NULL; 
DWORD srcBufLength; 
byte *srcByteBuffer; 
DWORD srcBuffCurrLen = 0; 
DWORD srcBuffMaxLen = 0; 
CHECK_HR(videoSample->ConvertToContiguousBuffer(&srcBuf), "ConvertToContiguousBuffer failed.\n"); 
CHECK_HR(srcBuf->GetCurrentLength(&srcBufLength), "Get buffer length failed.\n"); 
CHECK_HR(srcBuf->Lock(&srcByteBuffer, &srcBuffMaxLen, &srcBuffCurrLen), "Error locking source buffer.\n"); 

//// Now re-constuct. 
MFCreateSample(&reConstructedVideoSample); 
CHECK_HR(MFCreateMemoryBuffer(srcBufLength, &reConstructedBuffer), "Failed to create memory buffer.\n"); 
CHECK_HR(reConstructedVideoSample->AddBuffer(reConstructedBuffer), "Failed to add buffer to re-constructed sample.\n"); 
CHECK_HR(reConstructedVideoSample->SetSampleTime(llVideoTimeStamp), "Error setting the recon video sample time.\n"); 
CHECK_HR(reConstructedVideoSample->SetSampleDuration(llSampleDuration), "Error setting recon video sample duration.\n"); 

byte *reconByteBuffer; 
DWORD reconBuffCurrLen = 0; 
DWORD reconBuffMaxLen = 0; 
CHECK_HR(reConstructedBuffer->Lock(&reconByteBuffer, &reconBuffMaxLen, &reconBuffCurrLen), "Error locking recon buffer.\n"); 
memcpy(reconByteBuffer, srcByteBuffer, srcBuffCurrLen); 
CHECK_HR(reConstructedBuffer->Unlock(), "Error unlocking recon buffer.\n"); 
reConstructedBuffer->SetCurrentLength(srcBuffCurrLen); 
Смежные вопросы