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. Удаляет все остальные треки, которые не являются английскими или иными.
  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. Удаляет все остальные треки, которые не являются английскими или иными.
  5. Удаляет субтитры, если они найдены.
  6. Сохраните исходную звуковую дорожку в исходном формате кодека в качестве резервной копии.

Проверено на 2 видеофайлах.

**Обязательно укажите: -loglevel error -nostats в начале команды, если вы хотите подавить вывод.

Связанный контент