diff --git a/flamenco_worker/commands.py b/flamenco_worker/commands.py
index 6bf962424bff2a1fc5d067c837c9f8bd3954d44e..f777ff5e33f76ea05a0311dc90b087e904aa2052 100644
--- a/flamenco_worker/commands.py
+++ b/flamenco_worker/commands.py
@@ -666,8 +666,7 @@ class ExecCommand(AbstractSubprocessCommand):
         await self.subprocess(shlex.split(settings['cmd']))
 
 
-@command_executor('blender_render')
-class BlenderRenderCommand(AbstractSubprocessCommand):
+class AbstractBlenderCommand(AbstractSubprocessCommand):
     re_global_progress = attr.ib(init=False)
     re_time = attr.ib(init=False)
     re_remaining = attr.ib(init=False)
@@ -709,23 +708,6 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
             return 'blender_cmd %r does not exist' % cmd[0]
         settings['blender_cmd'] = cmd
 
-        render_output, err = self._setting(settings, 'render_output', False)
-        if err:
-            return err
-        if render_output:
-            outpath = Path(render_output).parent
-            try:
-                outpath.mkdir(parents=True, exist_ok=True)
-            except Exception as ex:
-                return '"render_output": dir %s cannot be created: %s' % (outpath, ex)
-
-        _, err = self._setting(settings, 'frames', False)
-        if err:
-            return err
-        _, err = self._setting(settings, 'render_format', False)
-        if err:
-            return err
-
         filepath, err = self._setting(settings, 'filepath', True)
         if err:
             return err
@@ -779,14 +761,6 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
                     '--python', override_filepath.as_posix(),
                 ])
 
-        if settings.get('python_expr'):
-            cmd.extend(['--python-expr', settings['python_expr']])
-        if settings.get('render_output'):
-            cmd.extend(['--render-output', settings['render_output']])
-        if settings.get('format'):
-            cmd.extend(['--render-format', settings['format']])
-        if settings.get('frames'):
-            cmd.extend(['--render-frame', settings['frames']])
         return cmd
 
     def parse_render_line(self, line: str) -> typing.Optional[dict]:
@@ -865,6 +839,43 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
         return 'pid=%d > %s' % (self.proc.pid, line)
 
 
+@command_executor('blender_render')
+class BlenderRenderCommand(AbstractBlenderCommand):
+
+    def validate(self, settings: Settings):
+        render_output, err = self._setting(settings, 'render_output', False)
+        if err:
+            return err
+        if render_output:
+            outpath = Path(render_output).parent
+            try:
+                outpath.mkdir(parents=True, exist_ok=True)
+            except Exception as ex:
+                return '"render_output": dir %s cannot be created: %s' % (outpath, ex)
+
+        _, err = self._setting(settings, 'frames', False)
+        if err:
+            return err
+        _, err = self._setting(settings, 'render_format', False)
+        if err:
+            return err
+
+        return super().validate(settings)
+
+    async def _build_blender_cmd(self, settings) -> typing.List[str]:
+        cmd = await super()._build_blender_cmd(settings)
+
+        if settings.get('python_expr'):
+            cmd.extend(['--python-expr', settings['python_expr']])
+        if settings.get('render_output'):
+            cmd.extend(['--render-output', settings['render_output']])
+        if settings.get('format'):
+            cmd.extend(['--render-format', settings['format']])
+        if settings.get('frames'):
+            cmd.extend(['--render-frame', settings['frames']])
+        return cmd
+
+
 @command_executor('blender_render_progressive')
 class BlenderRenderProgressiveCommand(BlenderRenderCommand):
     def validate(self, settings: Settings):
@@ -995,6 +1006,7 @@ class MergeProgressiveRendersCommand(AbstractSubprocessCommand):
         shutil.move(str(src), str(dst))
 
 
+# TODO(Sybren): maybe subclass AbstractBlenderCommand instead?
 @command_executor('blender_render_audio')
 class BlenderRenderAudioCommand(BlenderRenderCommand):
     def validate(self, settings: Settings):