
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"
이 경우 두 번째 비디오 스트림과 일곱 번째 오디오 스트림을 얻어야 합니다.
이게 도움이 되길 바란다