Мне нужно выполнить процесс 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). Какие-либо предложения?
Можете ли вы попробовать с -hwaccel d3d11va, чтобы увидеть, может ли ffmpeg инициализировать устройство DX 11?
@RitaHan-MSFT Вы раскомментировали часть «-hwaccel dxva2»? У меня Win10 Pro 17763.
@VuVirt Большое спасибо, ваше решение работает для меня!
@IgorGorelik Нет, я не раскомментировал часть «-hwaccel dxva2». Я использую точный код в вашем вопросе.
Если вы щелкните правой кнопкой мыши службу в диалоговом окне «Службы» -> «Свойства» -> «Войти», вы должны увидеть что-то вроде этого:
Установите флажок «Разрешить сервису взаимодействовать с рабочим столом», это должно позволить вам получить доступ к этим «ограниченным» API.
К сожалению, это не помогает. Все та же ошибка: [AVHWDeviceContext @ 00000217ef3bfb40] Не удалось создать устройство Direct3D.
Вы можете указать процессу FFMPEG использовать Аппаратное ускорение видео DirectX 11. В этом случае FFMPEG должен будет создать Устройство DirectX 11, вызвав функцию D3D11CreateDevice, которая не требует предоставления дескрипторов окна.
Чтобы заставить FFMPEG использовать аппаратное ускорение видео DirectX 11, вместо этого необходимо указать следующий параметр hwaccel:
-hwaccel d3d11va
Ваш код работает для меня, выполняя службу с локальной системной учетной записью. Тестирую на Windows 10 1903. Какая у вас версия Windows?