批量删除 mkv 文件中选定的字幕轨道和音轨

批量删除 mkv 文件中选定的字幕轨道和音轨

我的问题是,我有 2 个字幕轨道,一个叫做“英文标志和歌曲”,另一个叫做“英文全集”。我还有英文和日文音轨(双音频)。

我需要将视频缩小到 PSP 分辨率,为此我使用了 Handbrake。对于我的字幕选择行为,我将其设置为首先匹配所选语言;英语;烧录行为=第一轨。

但是即使使用它,它也会选择标志和歌曲作为刻录字幕。但是标志和歌曲是空白字幕。由于它是自动选择的,因此很难更改我正在转换的 200 多个视频中的每一个的字幕。

那么有没有办法自动选择英文全字幕或者完全删除标志和歌曲字幕?

我知道我可以在手刹上单独完成此操作,但这会耗费太多时间。

编辑:我想扩展我的问题 - 我真正想要的是完全删除“英语标志和歌曲”字幕而不重新编码整个视频。我只想删除字幕轨道。

答案1

您可以将 ffmpeg 与批处理或 powershell 脚本结合使用来自动实现您的目标。

请看一下可以与 ffmpeg 一起使用的命令: https://newbedev.com/how-to-remove-one-track-from-video-file-using-ffmpeg

以下是一个例子:

https://www.youtube.com/watch?v=jZWxWkl7yq0

批量删除第 1 轨字幕(无需重新编码):

@echo off

IF /i exist "%~1" (set "Folder=%~1") else (exit)

pushd "%Folder%"

For /f "Delims=" %%a in ('dir /b /a-d *.mkv *.mp4 *.avi *.mpg') do ffmpeg -i "%%a" -map 0 -map -0:s:0 -c:v copy -c:a copy -c:s copy "%%~na_NEW%%~xa"

批量删除字幕轨 1 并将分辨率更改为 PSP (480x272)(需要重新编码):

@echo off

IF /i exist "%~1" (set "Folder=%~1") else (exit)

pushd "%Folder%"

For /f "Delims=" %%a in ('dir /b /a-d *.mkv *.mp4 *.avi *.mpg') do ffmpeg -i "%%a" -vf "scale=480:-1" -map 0 -map -0:s:0 -c:v libx265 -c:a copy -c:s copy "%%~na_NEW%%~xa"

考虑以下视频:

视频

声音的:

有声日语 [索引 0]

音频英语 [索引 1]

字幕:

英语 [索引 0]

意大利语 [索引 1]

西班牙语(西班牙)[索引 2]

西班牙语(拉丁语)[索引 3]

巴西葡萄牙语 [索引 4]

俄罗斯 [索引 5]

阿拉伯语 [索引 6]

英文全文 [索引 7]

英文歌曲 [索引 8]

- 删除除日语之外的所有音频以及除英语之外的所有字幕(完整版):

删除英语音频(索引 1):-map -0:a:1

删除所有字幕:-map -0:s

添加英文全字幕(索引 7):-map 0:s:7

@echo off

IF /i exist "%~1" (set "Folder=%~1") else (exit)

pushd "%Folder%"

For /f "Delims=" %%a in ('dir /b /a-d *.mkv *.mp4 *.avi *.mpg') do ffmpeg -i "%%a" -map 0 -map -0:a:1 -map -0:s -map 0:s:7 -c:v copy -c:a copy -c:s copy "%%~na_NEW%%~xa"

- 删除日语音频和英文完整字幕:

删除日语音频(索引 0):-map -0:a:0

删除英文完整字幕(索引 7):-map -o:s:7

@echo off

IF /i exist "%~1" (set "Folder=%~1") else (exit)

pushd "%Folder%"

For /f "Delims=" %%a in ('dir /b /a-d *.mkv *.mp4 *.avi *.mpg') do ffmpeg -i "%%a" -map 0 -map -0:a:0 -map -0:s:7 -c:v copy -c:a copy -c:s copy "%%~na_NEW%%~xa"

相关内容