MediaFoundation HEVC кодирование H265 - PullRequest
0 голосов
/ 14 ноября 2018

Я могу успешно кодировать видео H264 с помощью MediaFoundation.

Теперь я хочу экспортировать HEVC, который, согласно официальной документации , поддерживается.

Я делаю все, как описано здесь, но всякий раз, когда я хочу установить тип носителя ввода для устройства записи, это заканчивается ошибкой:

Не найдено подходящего преобразования для кодирования или декодирования содержимого.

Вот краткий код того, что я делаю:

/ * Установка типа носителя для вывода * /

IMFMediaType* pMediaTypeOut = nullptr;
MFCreateMediaType(&pMediaTypeOut);
pMediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pMediaTypeOut->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_HEVC);
MFSetAttributeSize(pMediaTypeOut, MF_MT_FRAME_SIZE, 640, 480);
MFSetAttributeRatio(pMediaTypeOut, MF_MT_FRAME_RATE, 30, 1);
pMediaTypeOut->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH265VProfile_Main_420_8);
pMediaTypeOut->SetUINT32(MF_MT_MPEG2_LEVEL, eAVEncH265VLevel1);

// Add it to the sink writer
m_pWriter->AddStream(pMediaTypeOut, &m_streamIndex);

/ * Установка типа носителя для ввода * /

IMFMediaType* pMediaTypeIn = nullptr;
MFCreateMediaType(&pMediaTypeIn);
pMediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pMediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);
MFSetAttributeSize(pMediaTypeIn, MF_MT_FRAME_SIZE, 640, 480);
MFSetAttributeRatio(pMediaTypeIn, MF_MT_FRAME_RATE, 30, 1),
MFSetAttributeRatio(pMediaTypeIn, MF_MT_PIXEL_ASPECT_RATIO, 1, 1),

// Here it ends up with an error
m_pWriter->SetInputMediaType(m_streamIndex, pMediaTypeIn, nullptr);

Кто-нибудь знает, действительно ли поддерживается кодировка HEVC или это просто документация?И если он действительно поддерживается Microsoft, то что я делаю не так?

Кстати: я использую последнюю версию Windows 10. Для простоты кода проверка ошибок опущена

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Ваш тип выходного носителя неполный:

MF_MT_AVG_BITRATE Средняя скорость кодирования в битах в секунду. Должно быть больше нуля.

Аналогичная проблема с MF_MT_INTERLACE_MODE.

Фрагмент кода, который работает:

Check(MFStartup(MF_VERSION));

ComPtr<IMFSinkWriter> SinkWriter;
Check(MFCreateSinkWriterFromURL(L"D:\\temp.mp4", nullptr, nullptr, SinkWriter.GetAddressOf()));

ComPtr<IMFMediaType> OutputMediaType;
Check(MFCreateMediaType(OutputMediaType.GetAddressOf()));
Check(OutputMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
Check(OutputMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_HEVC));
Check(MFSetAttributeSize(OutputMediaType.Get(), MF_MT_FRAME_SIZE, 640, 480));
Check(OutputMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));
Check(MFSetAttributeRatio(OutputMediaType.Get(), MF_MT_FRAME_RATE, 30, 1));
//Check(OutputMediaType->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH265VProfile_Main_420_8));
//Check(OutputMediaType->SetUINT32(MF_MT_MPEG2_LEVEL, eAVEncH265VLevel1));
Check(OutputMediaType->SetUINT32(MF_MT_AVG_BITRATE, 1000000));

DWORD StreamIndex;
Check(SinkWriter->AddStream(OutputMediaType.Get(), &StreamIndex));

ComPtr<IMFMediaType> InputMediaType;
Check(MFCreateMediaType(InputMediaType.GetAddressOf()));
Check(InputMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
Check(InputMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12));
Check(MFSetAttributeSize(InputMediaType.Get(), MF_MT_FRAME_SIZE, 640, 480));
Check(InputMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));
Check(MFSetAttributeRatio(InputMediaType.Get(), MF_MT_FRAME_RATE, 30, 1)),
//Check(MFSetAttributeRatio(InputMediaType.Get(), MF_MT_PIXEL_ASPECT_RATIO, 1, 1)),

Check(SinkWriter->SetInputMediaType(StreamIndex, InputMediaType.Get(), nullptr));
0 голосов
/ 14 ноября 2018

Может быть, вы можете сначала проверить наличие кодера h265 с помощью инструмента DXVA Checker или программно использовать MFEnumEx (MFT_CATEGORY_VIDEO_ENCODER, ...) для поиска.

Если не найдено, вы можете попробовать установить расширение HEVC Video в MS App Store .Похоже, MS разделила кодек MF HEVC в пакет приложений после обновления 2018 Fall Creator.Кроме того, HW HEVC Encoder необходимо было установить через драйвер VGA производителя.

...