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

Мне нужно выполнить процесс 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). Какие-либо предложения?

Ваш код работает для меня, выполняя службу с локальной системной учетной записью. Тестирую на Windows 10 1903. Какая у вас версия Windows?

Rita Han 24.05.2019 11:24

Можете ли вы попробовать с -hwaccel d3d11va, чтобы увидеть, может ли ffmpeg инициализировать устройство DX 11?

VuVirt 24.05.2019 21:49

@RitaHan-MSFT Вы раскомментировали часть «-hwaccel dxva2»? У меня Win10 Pro 17763.

Igor Gorelik 26.05.2019 05:40

@VuVirt Большое спасибо, ваше решение работает для меня!

Igor Gorelik 26.05.2019 05:54

@IgorGorelik Нет, я не раскомментировал часть «-hwaccel dxva2». Я использую точный код в вашем вопросе.

Rita Han 27.05.2019 03:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
5
384
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Service Properties example

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

К сожалению, это не помогает. Все та же ошибка: [AVHWDeviceContext @ 00000217ef3bfb40] Не удалось создать устройство Direct3D.

Igor Gorelik 23.05.2019 08:26
Ответ принят как подходящий

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

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

-hwaccel d3d11va

Другие вопросы по теме