我有 3 个版本的 ffmpeg 命令,但没有一个是完美的……我被困住了。以下是我拥有的示例以及我在每个版本中遇到的问题:
ffmpeg -i "%%a" -map 0:v:0 -map 0:a:m:language:eng -c copy -f matroska - | ffmpeg -i - -map 0:v -map 0:a:0 -c copy -c:a eac3 -metadata:s:a:0 title="EAC3 Transcoded" -b:a:0 640k "%%~dpna.EACConverted%%~xa"
此版本的命令会将主音轨转码为 EAC3,并对其进行标记,将 EAC3 设置为第一/主音轨。它还会仅保留英文音轨并删除所有其他音轨!删除字幕,但遗憾的是不会保留原始格式的原始音轨(即 DTS 转换为 EAC3,DTS 将丢失。)
ffmpeg -i "%%a" -map 0:v -map 0:a:0 -map 0:a -c:v copy -c:a copy -c:a:0 eac3 -metadata:a:0 title="EAC3 Transcoded" -b:a:0 640k "%%~dpna.EACConverted%%~xa"
此版本的命令确实会删除字幕;将主音轨转码为 EAC3,标记它,将 EAC3 设置为第一/主音轨,但它也会在转码之前保留原始音轨!(即 DTS 转换为 EAC3,DTS 仍会存在)但问题是它不会只保留英文音轨。如果我有中文音轨,它会保留下来。
ffmpeg -i "%%a" -map 0:v:0 -map 0:a:m:language:eng -c copy -f matroska - | ffmpeg -i - -map 0:v -map 0:a:0 -c copy "%%~dpna.EACConverted%%~xa"
此版本的命令从文件中提取第一个视频轨道、英文音轨,删除所有其他轨道和字幕。(因此它只保留英文音轨!)但如果 DTS 为 EAC3,它不会转码音频,也不会对其进行标记等。
我想要一个可以兼顾以上所有功能的东西,这意味着它将主音轨(比如说 DTS)转码为 EAC3,标记它,将 EAC3 设置为第一/主音轨。它还会只保留英文音轨并删除所有其他音轨,并在转码后保留原始英文 DTS 音轨。
完整示例为:
@echo off
cls
set rootfolder="M:\Movies\"
echo Enumerating all MKVs under %rootfolder%
echo.
for %%a in (*.mkv) do (
for /f %%b in ('mkvmerge -i "%%a" ^| find /c /i "TrueHD"') do (
if [%%b]==[0] (
echo "%%a" has no TrueHD Audio
) else (
echo.
echo "%%a" has TrueHD Audio
ffmpeg -i "%%a" -map 0:v:0 -map 0:a:m:language:eng -c copy -f matroska - | ffmpeg -i - -map 0:v -map 0:a:0 -c copy -c:a eac3 -metadata:s:a:0 title="EAC3 Transcoded" -b:a:0 640k "%%~dpna.EACConverted%%~xa"
if errorlevel 1 (
echo Warnings/errors generated during remuxing, original file not deleted
) else (
del /f "%%a"
echo Successfully remuxed to "%%~dpna.EACConverted%%~xa", original file deleted
)
echo.
)
)
)
答案1
到目前为止,我可以使用以下两个命令之一来运行它:
ffmpeg -i "%%a" -map 0:v:0 -c:v:0 copy -map 0:a:m:language:eng -c:a copy -disposition:a:2 0 -map 0:a:0 -c:a:0 eac3 -metadata:s:a:0 title="Transcoded Compatibility Track" "%%~dpna.EACConverted%%~xa"
- 将主音轨(无论其是什么)转码为 EAC3
- 标记/更改其创建的这个新 EAC3 的名称。
- 将 EAC3 设置为第一/主要音轨和默认音轨
- 删除所有非英语或非 und 的曲目。
- 如果发现字幕则删除。
- 保留原始编解码器格式的原始音轨作为备份。
在 2 个视频文件上进行了测试。
ffmpeg -i "%%a" -map 0:v:0 -map 0:a:0 -map 0:a:m:language:eng -disposition:a:1 0 -c copy -f matroska - | ffmpeg -i - -map 0:v:0 -c:v:0 copy -map 0:a:0 -c:a:0 eac3 -metadata:s:a:0 title="Transcoded Compatibility Track" -map 0:a:1 -c:a:1 copy "%%~dpna.EACConverted%%~xa"
- 将主音轨(无论其是什么)转码为 EAC3
- 标记/更改其创建的这个新 EAC3 的名称。
- 将 EAC3 设置为第一/主要音轨和默认音轨
- 删除所有非英语或非 und 的曲目。
- 如果发现字幕则删除。
- 保留原始编解码器格式的原始音轨作为备份。
在 2 个视频文件上进行了测试。
**如果要抑制输出,请确保在命令开头包含:-loglevel error -nostats