Использование DirectX из подпроцесса, выполняемого службой Windows - PullRequest
1 голос
/ 23 мая 2019

Мне нужно выполнить процесс ffmpeg из службы Windows и записать его стандартный вывод. Работает нормально, пока не использую аппаратное ускорение. Поскольку доступ к DirectX из службы Windows ограничен, подпроцесс также не может получить к нему доступ.

Когда я выполняю тот же код из консольного приложения, все работает нормально, но тот же код, выполняемый из службы Windows, не использует аппаратное ускорение.

        string ffmpegArgs = /*-hwaccel dxva2 */"-threads 0 -probesize 100512 -i c:/Temp/test.mp4 -vf yadif -vcodec libx264 -preset ultrafast -tune zerolatency -profile baseline -x264-params keyint=20:min-keyint=20:scenecut=-1 -acodec aac -b:a 48k -flags +cgop -f mp4 -movflags empty_moov+default_base_moof+frag_keyframe c:/temp/output.avi";

        var psi = new ProcessStartInfo
        {
            FileName = "c:/Temp/ffmpeg4/ffmpeg.exe",
            Arguments = ffmpegArgs,
            WorkingDirectory = "c:/Temp/ffmpeg4",
            CreateNoWindow = false,
            WindowStyle = ProcessWindowStyle.Hidden,
            RedirectStandardInput = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false
        };

        var processVideo = new Process { StartInfo = psi }.Start();

Мне нужно как-то сломать унаследованные ограничения, чтобы иметь возможность выполнять ffmpeg с аппаратным ускорением (доступ к DirectX API). Есть предложения?

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Вы можете указать процессу FFMPEG использовать DirectX 11 Аппаратное ускорение видео . В этом случае FFMPEG необходимо будет создать устройство DirectX 11 , вызвав функцию D3D11CreateDevice , которая не требует указания дескрипторов окна.

Чтобы FFMPEG использовал аппаратное ускорение видео DirectX 11, вам необходимо указать вместо этого следующий параметр hwaccel:

-hwaccel d3d11va
0 голосов
/ 23 мая 2019

Если вы щелкните правой кнопкой мыши службу в диалоговом окне «Службы» -> Свойства -> Вход в систему, вы должны увидеть что-то вроде этого:

Service Properties example

Проверкаполе «Разрешить службе взаимодействовать с рабочим столом», это должно позволить вам получить доступ к этим «ограниченным» API

...