ffmpeg를 사용하여 비디오 잘라 내기


333

ffmpeg를 사용하여 다음과 같이 큰 파일의 섹션을 잘라냅니다.

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

-ss부분은 잘 작동하지만이 -t무시됩니다. 지정된 지정된 초를 올바르게 제거 -ss하지만 사본과 함께 입력의 끝으로 계속 진행합니다.

ffmpeg를 사용하여 비디오를 다시 코딩하지 않고 비디오의 끝을 잘라내는 방법이 있습니까?


1
이 구문은 맞습니다.
jiggunjer

답변:


393

-ss옵션을 사용하여 시작 타임 스탬프 -t를 지정하고 옵션을 사용하여 인코딩 지속 시간을 지정할 수 있습니다. 타임 스탬프는 HH:MM:SS.xxx형식 또는 초 단위 ( s.msec) 여야 합니다 .

다음은 처음 30 초를 클리핑 한 다음 10 초 후에 모든 것을 클리핑합니다.

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

참고 -t항상 출력 옵션이며 지정해야합니다 -i .

몇 가지 팁 :

  • 구형 ffmpeg 버전의 경우 -ssafter 를 사용 -i하면 실행 속도가 느려져보다 정확한 검색이 가능합니다. 참조 : FFmpeg로 찾기
  • -to대신 -t잘라내려는 타임 스탬프를 지정하는 대신 사용할 수 있습니다 . 따라서, -i <input> -ss 30 -t 10당신 대신에 -i <input> -ss 30 -to 40똑같은 것을 성취 할 수도 있습니다 .

  • ffmpeg가 -c또는을 지원하지 않으면 -to매우 오래된 것일 수 있습니다. 새 버전을 직접 컴파일 하거나 홈페이지에서 정적 빌드다운로드하십시오 . 정말 복잡하지 않습니다.


1
@Mondain 사실, 당신은 -ss를 더 정확하게 넣을 수 있습니다. 그리고 slhck은 여기 언급 blog.superuser.com/2012/02/24/... 가 이전 또는 이후에 퍼팅 사이의 차이를 언급 -SS 위해는 FFmpeg 문서도.
barlop

5
+1 처음 35 초 후에 모든 것을 무시하는 방법을 알아 내기 위해 여기에 왔습니다. 감사합니다 :ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip

2
이것은 나를 위해 작동하지 않습니다 (mp4). : 그것은 단지 5 초 검은 화면 생성frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
clocksmith

2
이것은 비디오 클립의 시작 부분에 3-4 s 검은 화면을 생성했습니다. 생략으로 수정 한 Chris의 -c copy초기 검은 화면이 제거되었습니다. 자세한 내용은 답변을 참조하십시오.
joelostblom

4
"다음은 처음 30 초를 자른 다음 10 초 후에 모든 것을 자릅니다."<-무슨 뜻입니까? 클립으로 포함한다는 의미입니까? 'cos 클립은 클립 아웃을 의미 할 수 있습니다. 포함한다고 가정합니다. 30 초에서 시작하고 10 초만 포함 하시겠습니까? 그렇다면 훨씬 더 명확하다고 쓰십시오.
barlop

94

다른 사람들이 언급했듯이, -ss이전 (훨씬 더 빠름) 또는 이후 (더 정확한)를 두는 -i것이 큰 차이를 만듭니다. ffmpeg 찾기 페이지의 "빠르고 정확한 검색"섹션에서 두 가지를 얻는 방법을 설명하고이를 사용했으며 큰 차이를 만듭니다. 기본적으로 , -ss이전과 이후에 -i다른 키 프레임을 만들기 위해 절단을 시작하기 전에 충분한 시간을 두십시오. 예 : Video.mp4에서 9 분 0 초에서 10 분 0 초까지 1 분 클립을 만들려면 다음을 사용하여 빠르고 정확하게 수행 할 수 있습니다.

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

첫 번째 -ss는 8 분 0 초까지 빨리 탐색 한 다음 두 번째 -ss는 9 분 0 초까지 정확하게 탐색 -t 00:01:00하고 1 분 0 초 클립을 가져옵니다.

또한 " -ss와 함께 사용하면 -c:v copyffmpeg가 i- 프레임에서만 사용 / 분할되도록하기 때문에 결과 비트 스트림이 고르지 않거나 재생되지 않거나 오디오 스트림과 동기화되지 않을 수 있습니다. "

즉, 비디오를 복사하거나 끊기거나 동기화되지 않은 경우에도 비디오를 다시 인코딩해야합니다. -c copy먼저 시도해 볼 수 있지만 비디오가 빨라지면 다시 실행해야합니다.


-c:a copy이 방법으로 같은 경고가 적용됩니다 .
jiggunjer

1
가장 좋은 대답은이 방법이 저에게 가장 효과적이었습니다.
Ondra Žižka

3
ffmpeg 2.1 이상에서는 "-ss"가 두 번 지정되지 않고 빠르고 정확 해 보입니다. trac.ffmpeg.org/wiki/Seeking
콘래드 마이어

25

나는 시작 -ss과 함께 -c copy0.5 초 절단을 발견했습니다 .

이를 피하려면 -c copy(트랜스 코드를 수행 할 것임) 을 제거 해야합니다.


4
정확성을 다루는 또 다른 대답이 있습니다. 기본 옵션으로 다시 인코딩하는 것은 종종 원하는 것이 아닙니다!
Tomasz Gandor

좋은 지적 @TomaszGandor
Chris

1
@TomaszGandor의 답변을 전혀 이해하지 못했지만 제거 -c copy했습니다.
Iulian Onofrei

14

수동으로

프레임 단위로 프레임별로 미디어 플레이어에서 파일을 열고 다음 과 같은 데이터 로 AVISynth 파일 을 재생 하십시오 .

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

그런 다음 정확한 시간 형식으로 잘라내십시오.

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

이제 다음과 같은 내용의 비디오 파일로 txt 파일을 만드십시오.

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

ffmpeg를 실행하십시오.

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

9

나에게 -t옵션은 효과가 없었지만 -vframes효과가있었습니다. I #frames-Frames를 자르고을 사용하여 비디오에 대한 GOP를 발견했기 때문에을 사용하는 것이 ffprobe좋습니다.

나를 위해 일한 명령 줄은 다음과 같습니다.

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

그건 그렇고, -ss앞에 두는 -i것은 실행 시간에 큰 차이 를 만듭니다.


1
실제로 -vframes(또는 -frames:v)는 -i출력 옵션이므로 이후에 와야 합니다.
slhck

5

user225366과 마찬가지로 -t 옵션은 짧은 비디오에는 작동하지 않지만 더 긴 비디오에는 작동합니다. 짧은 비디오의 경우 -frames : v가 더 좋습니다. 이것이 나를 위해 일한 것입니다.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

다른 답변과 같이 비디오에 오디오가있는 경우 -acodec 사본을 추가해야합니다.


0

나는 이것을 많이 언급하지는 않지만 (나는 전문가가 아니므로 어쩌면 캐치가있을 수 있습니다) 파일에 자막과 같은 다른 스트림과 챕터와 같은 다른 메타 데이터가있는 경우 자르기 / 트리밍 및 모든 스트림을 다음 명령

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

함께 -map 0사용하면 파일에있는 모든 스트림을, 그리고 함께 -c copy모든 복사 그들은 그대로.
사용 -to을 통해 개시 생략 -ss제 60 처음부터 입력 영상을 절단한다.

map특정 스트림 만 컷으로 유지하려는 경우에도 파일을 사용하는 것이 유용합니다 (파일에 모든 오디오 소스가 필요하지 않거나 일부 자막 만 필요할 수 있음).

FAT32 저장소에 저장할 수없는 큰 MKV 파일을 분할해야 할 때 이것을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.