IMFMediaSink, как установить свойство кодировщика?

У меня реализован интерфейс IMFMediaSink, который кодирует через родной кодек h264 конкретный источник (речь идет об интерфейсе Windows 8 Modern (Metro)). Я хочу изменить параметры кодека h264 по умолчанию, как это сделать?

Я искал в Интернете и вроде понимаю, что интерфейс ICodecAPI как-то связан с тем, что я хочу сделать, но как его использовать? У кого-нибудь есть пример кода, на который можно посмотреть, чтобы попытаться понять, что делать?

Я знаю, что могу использовать MF_SINK_WRITER_ENCODER_CONFIG для синкрайтера, но, к сожалению, я не использую этот класс.


person feal87    schedule 24.01.2015    source источник


Ответы (2)


Может быть так:

Попробуйте получить IMFStreamSink в потоке h264 из файла IMFMediaSink. GetStremSinkCount и GetStreamSinkByIndex должны помочь вам в этом.

Затем вызовите GetMediaTypeHandler на объекте IMFMediaSink. Позвоните GetCurrentMediaType по телефону IMFMediaTypeHandler. Теперь у вас должен быть указатель на IMFMediaType, производный от IMFAttributes. Вы должны быть в состоянии настроить свой трансформатор здесь.

person guest    schedule 24.01.2015
comment
Я попробую позже на этой неделе. Я не думал, что смогу передать параметры напрямую через тип носителя... если это работает, это здорово... - person feal87; 26.01.2015
comment
Можете ли вы предоставить дополнительную информацию о том, что вы пробовали и что не удалось с каким кодом ошибки? - person guest; 30.01.2015
comment
Никакого кода ошибки, система просто игнорирует новый параметр. Это рабочая команда: spMediaType->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_Base); пока это ничего не делает: spMediaType->SetUINT32(CODECAPI_AVEncCommonQualityVsSpeed, 0); Я пробовал оба в одном и том же месте, и все, что начинается с CODECAPI, игнорируется, пока работают обычные значения Media Type. - person feal87; 30.01.2015
comment
Мой ответ подразумевает использование Media Type. Кстати, все, что вам нужно установить на трансформаторе, можно сделать через Media Type. Я так и не понял, что именно вы не можете установить? - person guest; 30.01.2015
comment
Все параметры кодировщика недоступны в типе носителя. Вам нужен доступ к внутреннему кодировщику, иначе вы не сможете выбрать такие вещи, как CABAC (высокий профиль), speedvsquality, VBR или CBR и т. д. - person feal87; 30.01.2015
comment
Ты неправ. Например, вы можете установить основной профиль (или любой другой, при условии, что он поддерживается вашей ОС) с помощью этого вызова: SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_Main); - person guest; 30.01.2015
comment
Это потому, что это не параметры CODECAPI. Я хочу иметь возможность устанавливать параметры из перечисления CodecAPI, такие как CODECAPI_AVEncCommonQualityVsSpeed. - person feal87; 31.01.2015
comment
Любая конкретная причина для кодека API? Вы когда-нибудь пытались вызвать ICodecAPI::IsSupported() для CODECAPI_AVEncCommonQualityVsSpeed ​​для H264? Не удивлюсь, если он не поддерживается. Повторюсь в последний раз, все необходимые параметры можно задать через тип носителя. До Win 8 некоторые настройки доступны только для чтения, например, расстояние между двумя ключевыми кадрами, но, тем не менее, они полностью функциональны. - person guest; 31.01.2015
comment
msdn.microsoft.com/ en-us/library/windows/desktop/ Он совместим, насколько сказано в этом документе. Я пробовал их тонны, все они не работают. Причина, по которой они мне нужны, заключается в том, чтобы иметь возможность изменить режим кодирования с VBR на качество. Как я должен запускать этот ICodecAPI::IsSupported, если у меня нет никакого класса, производного от ICodecAPI, чтобы запустить его в первую очередь? Это то, что я пытаюсь получить в первую очередь... *facepalm* Я знаю, как это сделать ВНЕ Metro/Modern, проблема в том, как это сделать в современном интерфейсе Windows 8+. - person feal87; 31.01.2015
comment
CODECAPI_AVEncCommonQualityVsSpeed ​​— это то же самое, что и CODECAPI_AVEncVideoEncodeQP. Что происходит, когда вы пытаетесь установить качественную кодировку через SetGUID(CODECAPI_AVEncVideoEncodeQP...)? Кроме того, я не понимаю, как стиль метро связан с кодировщиком H264. Это не должно иметь к этому никакого отношения. - person guest; 31.01.2015
comment
Давайте продолжим это обсуждение в чате. - person feal87; 31.01.2015

Эй, я получил ответ от нашего архитектора. Он подтвердил, что нынешнее значение является «преднамеренным». Команда знает об ограничении, но я не уверен, смогут ли они рассмотреть изменение дизайна. Надеюсь, это поможет, Джеймс.

https://social.msdn.microsoft.com/Forums/windowsapps/en-US/74f02476-05aa-4520-8ee6-1b794321173e/how-to-access-icodec-property?forum=winappswithhtml5

Я сам нашел решение. Не существует способа получить доступ к ICodecAPI из WinRT Metro. Это задумано, и Microsoft не думает, что изменит его в ближайшее время. Это позор...:(

person feal87    schedule 02.02.2015