ffmpeg: オーディオトラックの元のコーデックが保持されない

ffmpeg: オーディオトラックの元のコーデックが保持されない

ffmpeg コマンドのバージョンが 3 つありますが、どれも完璧ではありません。困っています。以下に、私が持っている例と、各バージョンで直面している問題を示します。

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

これまでのところ、以下の 2 つのコマンドのいずれかで動作しました。

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を必ず含めてください。

関連情報