Windows CMD 批处理脚本 FFmpeg
Posted
技术标签:
【中文标题】Windows CMD 批处理脚本 FFmpeg【英文标题】:Windows CMD Batch Script FFmpeg 【发布时间】:2021-05-30 19:44:03 【问题描述】:我创建了一个批处理文件 (.bat),它使用 FFmpeg 将各种视频(带有 *.mov 或 *.mp4 文件扩展名)从输入文件夹转码到输出文件夹(带有扩展名 *.mkv)作为批处理进程(Windows 10 环境)。 输入文件夹中的文件名(无扩展名)应复制到新创建的输出文件名(具有新文件扩展名 *.mkv)。
@echo off
set CMD=ffmpeg -c:v ffv1 -level 3 -g 1 -coder 1 -context 1 -pix_fmt + -slices 24 -slicecrc 1 -report -c:a pcm_s24le
FOR /R input_folder %%G IN (*.mov,*.mp4) DO (
echo %%G
call set outputfile=%%~nG%.mkv
call set inputfile=%%~nG%%~xG
echo %CMD% -y output_folder/%outputfile% -i %inputfile%
)
但是这个脚本没有按预期工作,即没有任何反应。 你可能知道如何解决这个问题吗? 提前致谢!
【问题讨论】:
确实发生了一些事情。本质上,您的脚本将确定当前工作目录的树中是否有任何文件要处理,然后在关闭之前处理它们。在这种特殊情况下,如果没有文件,则几乎不会发生任何事情,因为脚本的DO
部分将不会运行。如果有与*.mov
或*.mp4
全局匹配的文件,那么每个文件都会被echo
ed 快速显示到屏幕上,您在脚本关闭前编写的ffmpeg
命令也将如此。
您需要做的第一件事是确保您没有关闭echo
ing,并直接从命令提示符窗口运行您的脚本,(使用您的目标父路径/tree root 作为当前工作目录)。然后,您应该看到所有输出以确定实际发生的情况。如果您真的希望ffmpeg
处理匹配文件,我建议您将echo %CMD%
更改为%CMD%
。顺便说一句,您的两条call set
行都是多余的,您应该删除它们并将echo %CMD% -y output_folder/%outputfile% -i %inputfile%
更改为%CMD% -y "output_folder\%%~nG.mkv" -i "%%G"
。
非常感谢!有用!最后一个问题:脚本如何在作业后自动删除输入文件夹中的文件?
【参考方案1】:
这是一个示例,显示了我对 cmets 的建议,并添加了 cmets 中要求的文件删除。 这假设 ffmpeg 在成功时返回错误级别0
(如果处理失败,您不想删除它们),并且在当前工作目录中有一个名为output_folder
的现有目录。
@Echo Off
SetLocal EnableExtensions
Set "CMD=ffmpeg.exe -c:v ffv1 -level 3 -g 1 -coder 1 -context 1 -pix_fmt +"
Set "CMD=%CMD% -slices 24 -slicecrc 1 -report -c:a pcm_s24le"
For /R "input_folder" %%G In (*.mov *.mp4) Do (
Echo %%G
%CMD% -y "output_folder\%%~nG.mkv" -i "%%G"
If Not ErrorLevel 1 Del /A /F "%%G"
)
【讨论】:
我知道您刚刚从问题中复制了提供的 ffmpeg 命令,但为防止出现意外行为,一般语法应为ffmpeg [input options] -i input [output options] output
。照原样,它似乎试图将一些输出选项应用于输入,并且可能会失败。此外,+
是 -pix_fmt
的有效选项,但它似乎在答案中放错了位置。
@llogan,你说得对,我照原样复制了它,没有检查它,那只是因为 OP 已经声明了It works!。我不确定你所说的放错位置是什么意思,除非你只是指我将线分成两部分的那一点,如果我在上面的行中包含+
会更具可读性。我假设这就是您的意思,因此我对其进行了相应调整,以提高可读性/理解性。以上是关于Windows CMD 批处理脚本 FFmpeg的主要内容,如果未能解决你的问题,请参考以下文章
求助ffmpeg.exe在windows自带的cmd下运行不了。显示无法定位程序输入点strncpy_s于动态链接库msvcrt.dll