是否可以使用MFCreateFMPEG4MediaSink创建DASH兼容的Mp4文件。
API说MFCreateFMPEG4MediaSink支持分段的mp4。这是默认行为还是我们需要设置一些标志。
当我尝试在javascript的MediaSource中播放MFCreateFMPEG4MediaSink生成的文件时,无法播放。 我用MP4Box.js检查生成的文件,它说它没有碎片。
谢谢 更新:
IMFMediaBuffer * pBuffer;
// Create a new memory buffer.
HRESULT hr = MFCreateMemoryBuffer(data_length, &pBuffer);
BYTE *pData = NULL;
// Lock the buffer and copy the video frame to the buffer.
if (SUCCEEDED(hr))
{
DWORD buffLen = data_length;
hr = pBuffer->Lock(&pData,NULL, NULL);
}
if (SUCCEEDED(hr))
{
memcpy(pData, data, data_length);
}
if (pBuffer)
{
pBuffer->Unlock();
}
// Set the data length of the buffer.
if (SUCCEEDED(hr))
{
hr = pBuffer->SetCurrentLength(data_length);
}
// Create a media sample and add the buffer to the sample.
IMFSample * pSample;
if (SUCCEEDED(hr))
{
hr = MFCreateSample(&pSample);
}
if (SUCCEEDED(hr))
{
hr = pSample->AddBuffer(pBuffer);
}
// Set the time stamp and the duration.
if (SUCCEEDED(hr))
{
hr = pSample->SetSampleTime(rtStart);
}
if (SUCCEEDED(hr))
{
hr = pSample->SetSampleDuration(video_frame_duration);
}
rtStart += video_frame_duration;
/*if (SUCCEEDED(hr))
{
hr = pSample->SetUINT32(MFSampleExtension_CleanPoint, isIDR);
}*/
//pSample->
// Send the sample to the Sink Writer.
if (SUCCEEDED(hr))
{
hr = pSinkWriter->WriteSample(0, pSample);
}
SafeRelease(&pSample);
SafeRelease(&pBuffer);
return 1;
这就是我要振颤的地方
if (SUCCEEDED(hr))
{
hr = MFCreateMediaType(&pMediaType);
}
//unsigned char * pSeqHdr = reinterpret_cast<UINT8 *>(mSamplesQueue.SequenceHeader());
/*
if (SUCCEEDED(hr))
{
hr = pMediaType->SetBlob(MF_MT_MPEG_SEQUENCE_HEADER, blob, 25);
}
UINT32 pcbBlobSize = { 0 };
hr = pMediaType->GetBlobSize(MF_MT_MPEG_SEQUENCE_HEADER, &pcbBlobSize);
*/
/*if (SUCCEEDED(hr)) {
hr = pMediaType->SetUINT32(MF_MPEG4SINK_MOOV_BEFORE_MDAT, 1);
}*/
if (SUCCEEDED(hr))
{
hr = pMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
}
if (SUCCEEDED(hr))
{
hr = pMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);
}
if (SUCCEEDED(hr))
{
hr = MFSetAttributeRatio(pMediaType, MF_MT_FRAME_RATE, frame_rate, 1);
}
if (SUCCEEDED(hr))
{
hr = pMediaType->SetUINT32(MF_MT_AVG_BITRATE, bit_rate);
}
if (SUCCEEDED(hr))
{
hr = pMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
}
if (SUCCEEDED(hr))
{
hr = MFSetAttributeSize(pMediaType, MF_MT_FRAME_SIZE, width, height);
}
if (SUCCEEDED(hr))
{
// Pixel aspect ratio
hr = MFSetAttributeRatio(pMediaType, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
}
if (SUCCEEDED(hr))
{
hr = MFCreateFile(
MF_ACCESSMODE_READWRITE,
MF_OPENMODE_DELETE_IF_EXIST,
MF_FILEFLAGS_NONE,
L"output2temp.mp4",
&pByteStream);
}
if (SUCCEEDED(hr))
{
hr = MFCreateMPEG4MediaSink(
pByteStream,
pMediaType,
NULL,
&pMediaSink);
}