Я использую кодировщик H.264 MFT для кодирования видео в моей программе. Все работает правильно, пока я не нашел файл, для которого кодировщик H.264 не смог успешно установить тип вывода.
Код, который я использовал для настройки кодера, находится здесь
ciEncoder.CreateObject(pCLSIDs[0], IID_IMFTransform);
// H.264 Encoder MFT needs to set output first
LComObject<IMFMediaType> ciOutputType; // Output media type of the encoder
hr = fpMFCreateMediaType((IMFMediaType**)(ciOutputType.GetAssignablePtrRef()));
hr = ciOutputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
hr = ciOutputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);
hr = ciOutputType->SetUINT32(MF_MT_AVG_BITRATE, 768 * 1000);
hr = ciOutputType->SetUINT32(MF_MT_INTERLACE_MODE, 2);
hr = ciOutputType->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_Base);
hr = MFSetAttributeRatio(ciOutputType.get(), MF_MT_FRAME_RATE, 10, 1);
hr = MFSetAttributeSize(ciOutputType.get(), MF_MT_FRAME_SIZE, vf.iWidth, vf.iHeight);
hr = MFSetAttributeRatio(ciOutputType.get(), MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
hr = ciEncoder->SetOutputType(0, ciOutputType.get(), 0);
Разрешение входного видео (видео SWF) составляет 76×12, и с указанным выше кодом SetOutputType возвращает MF_E_INVALIDMEDIATYPE.
Если я сохраню ширину 76, но изменим высоту, например, на 70, то SetOutputType может быть успешным. Я также пробовал другие значения, такие как 24, 38, но оба не удалось.
Может ли кто-нибудь помочь проверить это?
Спасибо
Я действительно не знаю ответа. Но, возможно, ответ можно найти в том, как кодер обрабатывает макроблоки. Они могут быть 4 * 4 или 8 * 8 и так далее. Поэтому, возможно, для кодировки необходима минимальная высота.