ffmpeg:不保留音轨的原始编解码器

ffmpeg:不保留音轨的原始编解码器

我有 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"
  1. 将主音轨(​​无论其是什么)转码为 EAC3
  2. 标记/更改其创建的这个新 EAC3 的名称。
  3. 将 EAC3 设置为第一/主要音轨和默认音轨
  4. 删除所有非英语或非 und 的曲目。
  5. 如果发现字幕则删除。
  6. 保留原始编解码器格式的原始音轨作为备份。

在 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"
  1. 将主音轨(​​无论其是什么)转码为 EAC3
  2. 标记/更改其创建的这个新 EAC3 的名称。
  3. 将 EAC3 设置为第一/主要音轨和默认音轨
  4. 删除所有非英语或非 und 的曲目。
  5. 如果发现字幕则删除。
  6. 保留原始编解码器格式的原始音轨作为备份。

在 2 个视频文件上进行了测试。

**如果要抑制输出,请确保在命令开头包含:-loglevel error -nostats

相关内容