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

지금까지 아래 두 명령 중 하나를 사용하여 작동했습니다.

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를 포함해야 합니다.

관련 정보