ffmpeg -map 명령을 이해하는 데 문제가 있습니다.

ffmpeg -map 명령을 이해하는 데 문제가 있습니다.

mkv 컨테이너의 비디오/오디오를 mp4로 복사하려고 합니다. 실행하면 ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4폴란드어 오디오가 포함된 비디오가 제공되지 않습니다. 비디오 스트림은 스트림 #0:0 하나만 있습니다. 스트림 #0:1은 폴란드어 오디오, #0:2 영어, #0:3 - #0:5는 자막입니다.

나는 읽었다FFmpeg 위키: 지도하지만 정말 이해가 안 돼요. -map 0:1예제 1에서 왜 두 번 쓰여졌나요? 무엇을 -c:s합니까? #0:0을 비디오에 복사하고 #0:2를 오디오에 복사하는 명령은 어떤 모습일까요?

답변1

-map <inputNo>:<streamNo>ffmpeg에게 스트림을 가져오라고 지시합니다.스트림아니요입력에서입력아니요0으로 시작하는 출력에 추가합니다 <inputNo>.

-map 0:1 -map 0:1때로는 서로 다른 코덱/매개변수로 각각 인코딩할 수 있기 때문에 동일한 입력 스트림을 두 번(예: 예제에서) 사용하고 싶을 수도 있습니다 . 이 예에서 출력에는 동일한 오디오 스트림이 두 번 포함됩니다. 하나는 MP3이고 다른 하나는 AAC입니다.

기본적으로(즉, 명령이 전혀 없는 경우 -map) 입력에서 하나의 비디오, 하나의 오디오 및 하나의 자막 스트림이 사용됩니다. 하나의 입력에서 모든 스트림을 매핑하려면 를 사용하세요 -map <inputNo>.

명령으로 비디오를 얻을 수 없다는 것은 단지 한 가지 의미일 뿐입니다. 즉, 비디오 트랙이 MKV에서는 다중화될 수 있지만 MP4에서는 다중화될 수 없는 코덱으로 인코딩된다는 것입니다. 그래서 자동으로 폐기됩니다. ffmpeg -i input.mkv트랙이 어떤 코덱으로 인코딩되었는지 확인할 수 있도록 로그를 게시해 주실 수 있나요 ?

마지막으로 -c:s자막 코덱에 사용됩니다( -c:a오디오용과 -c:v비디오용).

답변2

이해할 수 있게 해 준 사례였습니다. 다음 명령을 상상해 보세요.

ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv 

ffmpeg가 매핑을 수행하는 방법은 다음과 같습니다.

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)

무슨 일이에요?

명령에는 입력이 하나만 있습니다: Tears_of_steel.mkv. 이것이 우리의 모든 지도가 #0으로 시작하는 이유입니다:...

그런 다음 첫 번째 맵 옵션인 -map 0:0을 작성합니다. 이는 비디오 스트림일 수 있는 입력(tears_of_steel.mkv)의 첫 번째 스트림을 참조하지만 이는 중요하지 않습니다.

첫 번째 맵 옵션이므로 출력 파일(tears_of_steel-v2.mkv)의 첫 번째 스트림에 매핑됩니다.

그런 다음 두 번째 맵 옵션인 -map 0:2를 작성합니다. 이는 입력의 세 번째 스트림을 나타냅니다. 이는 두 번째 맵 옵션이므로 출력의 두 번째 스트림에 매핑됩니다.

등등...

나는 내 github에 다음과 같이 썼습니다.https://github.com/lingtalfi/ffmpeg-notes/blob/master/ffmpeg-map.md

답변3

-c(코덱 선택) 및 -map(스트림 선택) 옵션의 작동 방식은 다음과 같습니다 .

-c:a -> select first or best supported audio (transcoded)
-c:a copy -> best supported audio (copied)
-map 0:a -> all audio from 1st input file (transcoded)
-map 1:a:0 -> 1st audio stream from 2nd input file (transcoded)
-map 1:a:1 -c:a copy -> 2nd audio stream from 2nd input file (copied)

트랜스코딩 없이 첫 번째 입력 파일에서 모든 자막 스트림을 복사하려면:

-map 0:s -c:s copy 

출력 파일은 mp4이고 입력 파일은 mkv이며 mp4 호환 형식으로 트랜스코딩( )하지 않고 비디오 출력을 선택했기 -c:v copy때문에 (재생 가능한) 비디오가 없는 mp4 파일이 생성됩니다.

예를 들어 mp4와 호환되는 비디오 인코더를 지정하십시오. -c:v libx264대신 -c:v copy또는 공백으로 남겨두세요(즉, 인코더 및 ffmpeg를 언급하지 마세요)선택한 인코더는 각 출력 형식에 등록된 기본 인코더가 됩니다.)

비디오를 트랜스코딩하지 않으려면(상당한 시간이 걸릴 수 있기 때문에) 비디오 스트림을 동일한 컨테이너에 복사하고 원하는 오디오를 선택하십시오. mkv. 트랜스코딩된 비디오 및 선택한 오디오가 포함된 mp4 파일을 얻으려면:

ffmpeg -i input.mkv -map 0:0 -c:v libx264 -map 0:2 -c:a copy output.mp4

답변4

이것은 간단한 작업 설명을 좋아하는 저와 같은 사람들을 위한 간단한 답변입니다. 이것은 mkv를 mp4로 복사하고 싶을 때의 해결책입니다.오디오 스트림 선택:

당신은 작성해야합니다-map 0:numberofstreamminusone-c:a 복사본 앞에

비디오에 3개의 스트림이 있다고 가정해 보겠습니다(mediainfo에서 볼 수 있음). 첫 번째 스트림은 비디오이고, 두 번째 스트림은 기본 오디오이며, 세 번째 스트림은 원하는 언어로 된 기본이 아닌 오디오입니다. 따라서 -map 0:3이 아닌 -map 0:2를 작성해야 합니다.

또한, 글을 작성해야 합니다.-c:v 복사본 앞에 0:0을 매핑합니다.그렇지 않으면 ffmpeg는 비디오 스트림을 복사하지 않고 오디오 스트림만 얻게 됩니다. (비디오에 두 개의 비디오 스트림이 있고 두 번째 스트림을 복사하려면 -map 0:1을 작성해야 합니다.)

그래서최종 명령줄다음과 같습니다:

ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"

이 경우 첫 번째 비디오 스트림과 세 번째 오디오 스트림을 얻게 됩니다.

다른 예시:

ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"

이 경우 두 번째 비디오 스트림과 일곱 번째 오디오 스트림을 얻어야 합니다.

이게 도움이 되길 바란다

관련 정보