我已经阅读了很多关于启动具有特定亲和力的应用程序的文章,这按预期工作,并且我看到亲和力按预期显示:start /affinity 3 notepad
但是,当我尝试使用 ffmpeg 执行相同操作时,它会将所有核心设置为活动状态。然后我可以手动更改核心,但这违背了目的。我遗漏了什么?
start /affinity 3 ffmpeg -i "title.mp4" -c:v libx265 -vtag hvc1 "Title-HEVC.mp4"
答案1
问题更多出在 libx265 而非 ffmpeg 本身。例如,如果您使用 libsvtav1,则可以使用 /start /affinity xxx,并且运行正常。
您可以做的是首先通过添加选项 -x265-params pools= 来限制 libx265 使用的核心数量,然后在 ffmpeg 运行时设置正确的亲和力
我的完整 2 个脚本集可以实现这一点,我使用 3 个核心,并保持核心 0 未使用,以保持系统响应:pack.bat
@set fname=%*
@set fname=%fname:"=%
@rem define various constants
@set scale1440=-vf "scale=-1:1440:flags=lanczos"
@set scale1080=-vf "scale=-1:1080:flags=lanczos"
@set scale720=-vf "scale=-1:720:flags=lanczos"
@set scale540=-vf "scale=-1:540:flags=lanczos"
@set scale360=-vf "scale=-1:360:flags=lanczos"
@set b10=yuv420p10le
@set b8=yuv420p
@set a_copy=-acodec copy
@set a_aac128=-acodec aac -b:a 128k
@set a_aac160=-acodec aac -b:a 160k
@set svt_params=-svtav1-params tune=0:enable-overlays=1:scd=1:lp=3:film-grain=
@set hevc_params=-x265-params strong-intra-smoothing=0:rect=0:aq-mode=1:pools=3
@rem define output here
@set pix_fmt=%b8%
@set audio=%a_copy%
@set scale=%scale1080%
@set grain=0
@set preset=slow
@set crf=20
@rem some calculations
@set av1=-vcodec libsvtav1 -preset %preset% -crf %crf% %svt_params%%grain%
@set hevc=-vcodec libx265 -preset %preset% -crf %crf% %hevc_params%
@rem pick encoder here
@set video=%hevc%
%ComSpec% /c start /b "ffmpeg fix" powershell.exe .\fix_affinity.ps1
%ComSpec% /c start "title" /b /Low /wait /Affinity E /d "." ffmpeg.exe -n -i "%fname%" %scale% %audio% %video% -pix_fmt %pix_fmt% "%fname%_p%preset%c%crf%g%grain%_%pix_fmt%.mkv"
和 fix_affinity.ps1
start-sleep -seconds 5
$ffmpeg_process = get-process ffmpeg
$ffmpeg_process.processoraffinity=14