Remux MKV 在批处理文件中使用 mkvmerge 删除字幕和不需要的音轨

     2023-03-07     97

关键词:

【中文标题】Remux MKV 在批处理文件中使用 mkvmerge 删除字幕和不需要的音轨【英文标题】:Remux MKV removing subtitles and unwanted audio tracks using mkvmerge in batch file 【发布时间】:2021-02-16 22:55:26 【问题描述】:

我正在创建一个 Windows 批处理文件来查找文件夹中的所有 mkv 文件,检查它是否有多个音轨和字幕。如果是这样,请删除除 ENG 和 UND 之外的所有字幕和所有音轨。但是,当我运行批处理文件时它崩溃了?我不知道为什么它开始这样做。加上变量之前没有设置。干净总是假的。请帮忙。

@echo on
setlocal ENABLEDELAYEDEXPANSION

set rootfolder="C:\Users\User\Desktop\mov"
set "clean=false"

echo Enumerating all MKVs under %rootfolder%

for /r %rootfolder% %%a in (*.mkv) do (   
 for /f %%s in ('mkvmerge -i "%%a" ^| find /c /i "subtitles"') do (
  if NOT [%%s]==[0] (
   set "clean=true"
  )
)

for /f %%b in ('mkvmerge -i "%%a" ^| find /c /i "audio"') do (
 if [%%b]gtr[1] (
  set "clean=true"
 )
)
        
if %clean%=="true" (
 mkvmerge -o "%%~dpna (clean)%%~xa" -a und,eng -s und,eng --no-subtitles "%%a"
)
)
echo Done
pause

【问题讨论】:

请不要在帖子中使用标签,因为这会使遵循格式变得更加困难。我相信我已经修好了。无关结论:最后的)是多余的。 抱歉格式化。我已经删除了最后一个)。批处理文件仍然崩溃。我添加了一个暂停,发现它在第一个 for 循环时崩溃了。 【参考方案1】:

很遗憾,您没有提及任何错误消息,所以我所能做的就是提供一些(我希望是建设性的)批评。

set rootfolder="C:\Users\User\Desktop\mov"
set "clean=false"

在这个标签上通常首选第二种格式,所以

set "rootfolder=C:\Users\User\Desktop\mov"

这允许在必要时轻松插入引号。它还可以防止您在代码中使用的终端空格和制表符。正如您编写的那样,任何尾随空格或制表符都将包含在分配给rootfolder 的值中,并可能导致混乱 - 由不可见字符引起的工作时间。一次被咬,两次害羞。

clean 显然被用作布尔值。就个人而言,我建议您 look here 使用布尔变量。这种用法的优点是它可以在code blocks(带括号的语句)中工作,而无需调用delayedexpansion

echo Enumerating all MKVs under %rootfolder%

for /r %rootfolder% %%a in (*.mkv) do (   

这两行中的%rootfolder% 需要为"quoted"

  if NOT [%%s]==[0] (

嗯。记住语法if [not] string==string

 if [%%b]gtr[1] (

然后在这里申请 - 我相信你的问题是常驻的。

这是if string (的格式,所以cmd应该反对,因为运算符无效((

正确的格式是

 if [%%b] gtr [1] (

或者最好

 if "%%b" gtr "1" (

或者最好是

 if %%b gtr 1 (

这里的问题是gtr(或字母比较运算符系列的任何其他成员)对任何随机字母字符串都没有意义。以if sequins equ acceptable ( 为例。 sequins 显然是 neq acceptable,但是使用您使用的语法,它将是 if sequinsequacceptable ( 应该解释为 if s equ insequacceptable (if sequins equ acceptable ( 吗?

第二种形式更好。它允许比较包含空格的字符串。但是有一个问题。 if "123" gtr "2" 将被评估为 FALSE,因为比较是按字母顺序进行的; "1" 小于 "2" 所以结果是 FALSE

因此是第三种形式,它对数字比较有效(但如果 either 操作数中的一个为非数字,则将被解释为字符串形式。

【讨论】:

【参考方案2】:

这里有两个问题。

正如您所发现的,其中一个问题是第一个 for() 循环缺少一个 )。你有 for( for( if( ) ):

for /r %rootfolder% %%a in (*.mkv) do (   
 for /f %%s in ('mkvmerge -i "%%a" ^| find /c /i "subtitles"') do (
  if NOT [%%s]==[0] (
   set "clean=true"
  )
)

应该是:

for /r %rootfolder% %%a in (*.mkv) do (   
 for /f %%s in ('mkvmerge -i "%%a" ^| find /c /i "subtitles"') do (
  if NOT [%%s]==[0] (
   set "clean=true"
  )
 )
)

由于第一个 for 循环没有被关闭,它导致脚本的其余部分被包含在其中,这就是为什么 %clean% 永远不会为真,因为它没有展开,所以总是等于在读取初始 for 循环之前给出的值,在这种情况下为 false。

不过,这只是让它意外地工作。 (编辑:在看了这个之后才意识到你确实打算让所有东西都落在最初的 for 循环之下,并且缩进刚刚关闭。所以最后的“额外”)并不是不需要的,并且只删除它情况更糟。这就是为什么正确的缩进很重要。尽管如此,如前所述,%clean% 将始终为 false,因为它位于 for 循环中,因此它需要是 !clean!。同样,这只会导致它无法按预期工作,并且与崩溃无关。)实际上导致它崩溃的问题是行

if [%%b]gtr[1] (

这是不正确的语法,不被视为完整的 if 语句,因此使用 ( 来打开语句的“then”部分被视为错误。它应该是

if [%%b] gtr [1] (

甚至可能

if %%b gtr 1 (

因为这里不需要方括号,我不确定它们是否会引起问题。

您的代码给出了“(此时意外”的错误,这将为您提供有关问题的很大线索。正如@Magoo 所提到的,您没有提供任何错误消息,但是在调试时您需要注意并使用它们。

另外,您不需要打开回声。

【讨论】:

使用 find [重复] 在 bash 中操作字符串(文件扩展名)

】使用find[重复]在bash中操作字符串(文件扩展名)【英文标题】:Manipulatingstrings(fileextensions)inbashusingfind[duplicate]【发布时间】:2016-09-2408:27:14【问题描述】:我在bash中处理字符串时遇到问题。我想重写扩展。我在下载目录中有... 查看详情

如何在浏览器中播放 MKV 文件?

】如何在浏览器中播放MKV文件?【英文标题】:HowtoplayMKVfileinbrowser?【发布时间】:2013-06-0518:26:55【问题描述】:我有一个MKV格式的视频文件,我想在浏览器中播放该文件而不进行转换,如何在浏览器中播放此文件格式?<videoc... 查看详情

从远程播放 MKV 视频

...放。我尝试使用AVKit/AVFoundation和MobilePlayer,它正在处理MP4文件。这是我的代码示例:AVKit/AVFoundationletvideoURL=NSURL(string:url)!//http://lo 查看详情

MKV 文件的开源 WinRT 库

】MKV文件的开源WinRT库【英文标题】:OpenSourceWinRTLibraryForMKVFiles【发布时间】:2012-09-2609:41:48【问题描述】:我正在尝试在WinRT中播放MKV文件。有谁知道已经转换为使用WinRT的库?如果没有,任何人都可以指出我开始使用一个好的... 查看详情

html5 MKV 带字幕播放

...述】:我正在尝试在我的chrome浏览器中播放带有字幕的MKV文件,以便查看本地视频文件。这已经成功,在MicrosoftEdge中使用上述方法/代码,但是,当我使用chrome时,我看不到字幕(不能使用Firefox,因为不支持MKV)<videoid="video"co... 查看详情

使用ffmpeg删除导出视频字幕文件(代码片段)

...C盘(选择任何位置)。设置环境变量–复制解压文件中bin文件夹的位置,并在系统路径变量中设置该位置。删除软字幕假设你有一个名为demo.mkv的视频文件,内置的字幕是你不需要的,那我们可以使用ffmpeg框... 查看详情

用 Java 处理视频(DVD、.avi .mkv)

...频的库之后,我陷入了困境。周围的每个人都在尖叫不要使用JMF,因为它已经过时、陈旧并且需要用户安装它,其他替代品(例如VLCJ)如果它们工作起来似乎不错,但仍然相对不稳定并且依赖大量的本机代码,以及处理DV 查看详情

.mkv 视频在纹理视图中滞后

...ntextureview【发布时间】:2017-04-0405:05:03【问题描述】:我使用Textureview和mediaplayer播放视频。它适用于.3gp和.mp4视频类型。但它对于.mkv视频的滞后很大。我尝试使用mediaplayer的videoview和surfaceview。问题仍然存在。如果有人有我的问... 查看详情

mkv与rmvb,avi,mp4等有啥区别似乎同样的电影mkv格式的是rmvb格式的3到4倍大小

MKV格式的放在蓝魔P4里放不出来你好,mkv和rmvb指的是文件格式,也就是封装格式,而不是真正的数据压缩格式,至于他们的特点,下面分别来说。1、mkv:mkv不等同于音频或视频编码格式,它只是为这些进行过音视频编码的数据... 查看详情

使用特定方案重命名文件(代码片段)

我有一个FTP文件夹从远程摄像头接收文件。相机将视频文件名始终存储为./rec_YYYY-MM-DD_HH-MM.mkv。视频文件全部存储在同一文件夹中,即FTP服务器的根文件夹。我需要使用这个新方案将这些文件移动到另一个文件夹:从文件名中删... 查看详情

将字幕 (srt) 文件添加到现有 mkv 文件

】将字幕(srt)文件添加到现有mkv文件【英文标题】:Addsubtile(srt)filetoexistingmkvfile【发布时间】:2016-12-0319:58:40【问题描述】:是否可以将字幕文件(srt)添加到现有mkv文件?我可以轻松地将srt文件嵌入到newmkv文件中,但这非常耗时... 查看详情

使用参数在批处理文件中运行脚本

】使用参数在批处理文件中运行脚本【英文标题】:RunScriptwithinBatchFilewithParameters【发布时间】:2021-11-1600:33:39【问题描述】:我正在编写一个批处理文件,并在这个批处理文件中执行一个脚本。批处理文件:PowerShell-NoProfile-Exec... 查看详情

使用批处理文件在 XAMPP 中部署 WAR 文件

】使用批处理文件在XAMPP中部署WAR文件【英文标题】:DeployWARfileinXAMPPusingBatchfile【发布时间】:2016-03-2322:37:33【问题描述】:我正在使用War文件在Xampp中部署我的应用程序。问题是,由于我多次更新代码,我需要替换war文件并重... 查看详情

在文本文件中搜索文本并使用批处理文件在 CMD 提示符下打印

】在文本文件中搜索文本并使用批处理文件在CMD提示符下打印【英文标题】:SearchatextinatextfileandprintinCMDpromptusingbatchfile【发布时间】:2016-04-2911:40:48【问题描述】:我想编写一个批处理文件(.bat)。使用批处理文件,我想在文本... 查看详情

如何在批处理文件中使用启动命令?

】如何在批处理文件中使用启动命令?【英文标题】:Howtousethestartcommandinabatchfile?【发布时间】:2013-06-1614:14:54【问题描述】:我有一个批处理文件,它使用大量命令行参数启动应用程序:"C:\\ProgramFiles(x86)\\CommonFiles\\MicrosoftShare... 查看详情

如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称

】如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称【英文标题】:Howtolistthenamesofallthefilesanddirectoriesinafolderusingforloopinabatchfile【发布时间】:2022-01-1713:40:51【问题描述】:我想在批处理脚本中使用for循环列出... 查看详情

在批处理文件中使用 CLIP 命令

】在批处理文件中使用CLIP命令【英文标题】:UsingCLIPcommandwithinaBatchFile【发布时间】:2015-04-3014:34:26【问题描述】:我正在尝试编写一个批处理文件来执行以下操作:将给定文件(拖放或通过“发送到”选项)复制到预定义的网... 查看详情

使用在批处理文件中运行的 azcopy 复制文件

】使用在批处理文件中运行的azcopy复制文件【英文标题】:Copyingfilesusingazcopyrunninginabatchfile【发布时间】:2021-10-1020:37:23【问题描述】:我想执行一个运行azcopy的批处理文件(通过任务计划程序),并且只将新文件复制到服务器... 查看详情