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"
- プライマリオーディオトラックを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を必ず含めてください。