Как кодировать IMFSample из Windows API дублирования в H264? - PullRequest
0 голосов
/ 11 января 2020

Я ищу рабочую альтернативу, чтобы сделать эту работу

Моя цель - компьютер Generi c (так что он будет ориентировочно работать на каждом клиентском компьютере), я месяцами пробовал с Библиотека IMFTransform, но на моем компьютере (даже с различными фильтрами в MFTEnumEx) я не смог получить IMFTransform, который был d3d11_aware [Я спросил на этой странице и попробовал все эти ответы: Как получить IMFTransform, который такое d3d_aware (для кодирования ввода из Windows API дублирования в H264)? ]

Поскольку эта библиотека не работает для меня, я ищу альтернативу. Я слышал, что есть FFMPEG для кодирования, но пока я не смог найти доказательств того, что он может принять DXGI_FORMAT_B8G8R8A8_UNORM в качестве входных данных. Если есть способ, я буду go полный газ при его исследовании, мне нужно только направление

edit1 (на edit2 я оставлю исправление, если это кому-то поможет):

Проблема, очевидно, заключалась в том, что при получении imfAttributes он становился пустым. Я только что обнаружил, что с фильтром Hardware_flag на самом деле есть один в ppActivate [0], но я получаю исключение, когда я проверяю его атрибуты, когда я прыгаю шаг проверки на ppActivates [], если MF_SA_D3D_AWARE, по-видимому, IMFTransform работает нормально

IMFAttributes* imfAttributes;
CatchError(pTransform->GetAttributes(&imfAttributes), (LPSTR)"Error getAttributes from pTransform");
CatchError(imfAttributes->GetUINT32(MF_SA_D3D_AWARE,0), (LPSTR)"Error pTransform not D3D_AWARE"); 

при запуске, в последней строке я получил исключение 0x00007FFC7EEED4CB (mfplat.dll) в VRscreenStreamer.exe: 0xC0000: 0xC00 Место записи нарушения прав доступа 0x0000000000000000

edit2: чтобы исправить это, я использовал MFGetAttributeUINT32 вместо GetUINT32:

BOOL bD3DAware = FALSE;
bD3DAware = MFGetAttributeUINT32(imfAttributes, MF_SA_D3D11_AWARE, FALSE);
...