Я хочу использовать Win7 Media Foundation SDK для кодирования видеокадров в H264, а затем использовать приемник, чтобы сохранить их как файл .mp4.Однако завершение работы приемника не выполняется, когда я не добавляю MF_MT_MPEG_SEQUENCE_HEADER
к выходному медиатайпу вручную, и файл не воспроизводится.
Я проверил кодировщик, который должен его добавить (см. H.264 Видеокодер ).Но это просто выдает ошибку MF_E_ATTRIBUTENOTFOUND
.
IMFMediaType * outputType;
hr = m_pEncoder->GetOutputCurrentType(0, &outputType);
UINT32 sequenceHeaderDataSize;
hr = outputType->GetBlobSize(MF_MT_MPEG_SEQUENCE_HEADER, &sequenceHeaderDataSize);
С MF_MT_MPEG_SEQUENCE_HEADER
, который я нашел в Интернете (для 1080p), я смог получить воспроизводимый файл.Однако он все еще имеет некоторые ошибки в яркости (случайные изменения ~ каждые 0,5 секунды) и ошибки блокировки.
UINT8 blob[] = {0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x2A, 0xAD, 0x84, 0x01, 0x0C, 0x20, 0x08, 0x61, 0x00, 0x43, 0x08, 0x02, 0x18, 0x40, 0x10, 0xC2, 0x00, 0x84, 0x2B, 0x50, 0x3C, 0x01, 0x13, 0xF2, 0xC2, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x79, 0x08, 0x00, 0x00, 0x00, 0x01, 0x68, 0xEE, 0x3C, 0xB0};
//create sink attributes
IMFAttributes * sinkAttributes = NULL;
HRESULT hr = MFCreateAttributes(&sinkAttributes, 1);
hr = sinkAttributes->SetUINT32(MF_READWRITE_DISABLE_CONVERTERS, true);
//create sink
IMFSinkWriter * pSinkWriter = NULL;
hr = MFCreateSinkWriterFromURL(L"output.mp4", NULL, sinkAttributes, &pSinkWriter);
// Set the output media type.
IMFMediaType * pMediaTypeOut = NULL;
CHECK_HR(MFCreateMediaType(&pMediaTypeOut));
CHECK_HR(pMediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
CHECK_HR(pMediaTypeOut->SetGUID(MF_MT_SUBTYPE, VIDEO_INPUT_FORMAT));
CHECK_HR(MFSetAttributeSize(pMediaTypeOut, MF_MT_FRAME_SIZE, VIDEO_WIDTH, VIDEO_HEIGHT));
CHECK_HR(MFSetAttributeRatio(pMediaTypeOut, MF_MT_FRAME_RATE, VIDEO_FPS, 1));
CHECK_HR(pMediaTypeOut->SetBlob(MF_MT_MPEG_SEQUENCE_HEADER, blob, sizeof(blob)));
CHECK_HR(pSinkWriter->AddStream(pMediaTypeOut, &streamIndex));
// Tell the sink writer to start accepting data.
hr = pSinkWriter->BeginWriting();
Это может быть связано с Windows 7, к сожалению, я не могу проверить на компьютере с Windows 10.
Закодированные кадры нужны где-то еще, поэтому я не могу просто пропуститькодирование и положить мои кадры прямо в раковину.