ffmpeg를 사용하여 시작 및 종료 시간을 기준으로 비디오 자르기


510

다음 명령을 사용하여 비디오의 시작 및 종료 시간을 사용하여 비디오를 잘라 보았습니다.

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4

위의 명령을 사용하여 난에서 비디오를 잘라낼 00:00:0300:00:08. 그러나 처음 11 초 동안 비디오를 자르는 대신 그 시간 사이에 비디오를 자르지 않습니다. 누구든지 이것을 어떻게 해결할 수 있습니까?

편집 1 :

mark4o 가 제안하는 다음 명령을 사용하여 잘라내려고했습니다.

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

그러나 다음과 같은 오류가 표시되었습니다.

인코더 'aac'은 실험적이지만 실험용 코덱은 사용할 수 없습니다.

그래서 -strict -2명령에을 추가했습니다 .

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4

이제는 잘 작동합니다.


3
완전히 자르지 않은 ffmpeg 콘솔 출력이 없습니다. 요청할 때 항상 이것을 포함하십시오. 감사.
slhck

3
어디에서 -strict 2를 받았습니까? 문서에 포함되어 있지 않아 궁금한 점이 있습니다
StackOverflowed

ffmpeg 설치 후 품질을 높이기 위해 ffmpeg에서이 옵션을 찾을 수 있도록 도와드립니다
Kalai


1
나는 여기서 문제가 실제로 당신이 -i movie.mp4에서 시작하고 그 앞에 놓인 사실이라고 생각합니다. 그 스트림에 대한 논쟁은 그 후에 간다? 이것이 다른 방식으로 효과가 있었던 이유입니다. = /
Brent Rittenhouse 5

답변:


573

3 초 표시에 키 프레임이 없을 것입니다. 비키 프레임은 다른 프레임과의 차이를 인코딩하므로 이전 키 프레임부터 시작하는 모든 데이터가 필요합니다.

mp4 컨테이너를 사용하면 편집 목록을 사용하여 재 인코딩하지 않고 키 프레임이 아닌 곳에서자를 수 있습니다. 다시 말해, 3 초 전 가장 가까운 키 프레임이 0 초이면 0 초부터 비디오를 복사하고 편집 목록을 사용하여 플레이어에게 3 초 후에 재생을 시작하도록 지시합니다.

git master 의 최신 ffmpeg 를 사용하는 경우 제공 한 명령을 사용하여 호출 할 때 편집 목록을 사용 하여이 작업을 수행합니다. 이것이 작동하지 않으면 이전 버전의 ffmpeg를 사용 중이거나 플레이어가 편집 목록을 지원하지 않는 것입니다. 일부 플레이어는 편집 목록을 무시하고 항상 파일의 모든 미디어를 처음부터 끝까지 재생합니다.

키 프레임이 아닌 지점에서 정확하게 시작하여 편집 목록을 지원하지 않는 플레이어에서 원하는 지점에서 시작하여 재생하려는 경우 또는 컷 부분이 실제로 출력 파일에 없는지 확인하려는 경우 (예 : 기밀 정보가 포함되어있는 경우 원하는 시작 시간에 정확하게 키 프레임이 있도록 다시 인코딩하여이를 수행 할 수 있습니다. 을 지정하지 않으면 재 인코딩이 기본값 copy입니다. 예를 들면 다음과 같습니다.

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

다시 인코딩 할 때 추가 품질 관련 옵션 또는 특정 AAC 인코더를 포함시킬 수도 있습니다. 자세한 내용은 ffmpeg의 비디오 용 x264 인코딩 안내서 및 오디오 용 AAC 인코딩 안내서참조하십시오 .

또한이 -t옵션은 종료 시간이 아닌 지속 시간을 지정합니다. 위 명령은 3 초부터 8 초의 비디오를 인코딩합니다. 3 초에 시작하고 8 초에 종료하려면을 사용하십시오 -t 5. 현재 버전의 ffmpeg를 -t사용 -to중인 경우 위 명령 에서을 사용 하여 지정된 시간에 종료 할 수도 있습니다 .


4
비디오가 끝날 때까지 지정할 수있는 바로 가기가 있습니까?
Jikku Jose

20
@JikkuJose : -t/ -to와 그 인수를 생략하여 계속합니다.
mark4o

41
참고 : ffmpeg가 해당 위치로 직접 건너 뛰기 때문에 -ss입력 파일 () 이전 에 제공하는 것이 더 빠릅니다 -i. 그러나 시간을 "제로"로 설정 -to하면 잘못된 시간을 가리 킵니다. 출처 : trac.ffmpeg.org/wiki/Seeking
Denilson Sá Maia

4
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4원본 파일에는 문제가 없지만 this을 사용한 후에 오디오 및 비디오 동기화 문제 가 발생합니다.
user2002522

6
@ user2002522 :없이 시도하십시오 -async 1.
mark4o

431

이것을 사용해보십시오. 내가 알아 낸 가장 빠르고 최고의 ffmpeg-way입니다.

 ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4

이 명령은 몇 초 안에 비디오를 자릅니다!

나는 내 블로그 에서 여기 에 설명했다 :

-i : 입력 파일을 지정합니다. 이 경우 (input.mp4)입니다.
-ss : -i와 함께 사용하면 입력 파일 (input.mp4)에서 위치를 찾습니다.
00:01:00 : 트림 된 비디오가 시작되는 시간입니다.
-to : 시작 (00:01:40)에서 종료 (00:02:12)까지의 기간을 지정합니다.
00:02:00 : 트림 된 비디오가 끝나는 시간입니다.
-c copy : 스트림 복사를 통해 트리밍하는 옵션입니다. (NB : 매우 빠름)

타이밍 형식은 다음과 같습니다. hh : mm : ss

현재 고도로 찬성 된 답변은 구식이며 트림이 매우 느립니다. 자세한 내용은이 공식 ffmpeg 기사를 참조하십시오 .


9
이것은 45 분 720p 파일을 3 초 안에 처리했습니다. 이것이 정답이어야합니다.
Dheeraj Bhaskar 2016 년

7
그래도 키 프레임 부족으로 어려움을 겪을 수 있습니다. 잘라내기에 대한 귀하의 접근 방식을 취한 다음 허용 된 답변에 따라 다시 인코딩하여 다시 인코딩하는 데 필요한 시간을 최소화했습니다.
펠슨

7
@pelson이 말했듯이 키 프레임을 잘라 내고 처음 몇 초를 비워 둡니다 (절단 시간이 키 프레임 사이에 있으면). 흥미롭게도 매개 변수 순서를 변경하면 문제가 해결 ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4됩니다. 그러나 이제 건너 뛰기가 중단되고 종료 시간이 정확하지 않습니다 (필자의 경우).
Raphael

6
정확한 밀리 초로 트리밍 할 필요가없는 경우이 답변을 사용해야하므로 사용 가능한 가장 가까운 키 프레임이 선택됩니다. 그래서 너무 빠르기 때문에 가장 가까운 키 프레임을 선택하고 재 인코딩 할 필요없이 스 니펫을 제거합니다. 그러나 정확한 시간이 필요한 경우 가장 가까운 키 프레임을 사용하는 것만으로는 충분하지 않습니다. 정확하게 일치하지 않기 때문입니다. 사용 가능한 유일한 솔루션은 비디오를 다시 인코딩하는 것이므로 속도가 너무 느립니다. 그러나 이것이 필요한 경우 유일한 솔루션입니다. 이것이 OP의 문제가 되었기 때문에 다른 답변이 받아 들여지는 이유입니다.
Yamaneko

4
이유가 확실하지 않지만 키 프레임 누락 문제가 발생하기 때문에 허용되는 답변보다 더 정확하지 않은 것 같습니다. 짧은 비디오 클립의 경우 효과가 허용되지 않습니다. 이러한 경우 느린 재 녹음이 유일한 해결책 인 것 같습니다.
icarus74

91
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

사용 -c 사본을 즉시에 메이크업을 위해. 이 경우 ffmpeg는 비디오를 다시 인코딩하지 않고 크기에 따라 잘립니다.


2
의 -c 복사는 훌륭하게 작동하지만 -async 1을 제거하는 경우에만
dorien

2
다른 입력 및 출력 컨테이너 (예 : .mkv 입력 및 .mp4 출력)의 경우 유효하지 않은 헤더로 인해 쓰기가 실패합니다.
Assil Ksiksi

1
좋아, 다른 명령을 사용하는 .MP4에 당신이 한 .mkv 변환 : ffmpeg -i movie.mkv -vcodec copy -acodec copy converted_movie.mp4및 바이스 반대
블라드 Hudnitsky

재 인코딩의 장점은 무엇입니까? 동일한 형식의 작은 비디오를 원한다면 아무 소용이 있습니까?
하샤

29
    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

3 초에서 8 초를 제외한 모든 것을 삭제하십시오.


4
나는 이것으로 처음 8 초를 얻습니다. 첫 번째 3 초는 첫 번째 프레임에서 고정되었습니다. setpts=PTS-STARTPTS트림 필터 다음 에 체인 필터로 고정됩니다 .
jiggunjer

"인코더 'aac'는 실험적이지만 실험적인 코덱은 사용할 수 없습니다. 사용하려면 '-strict -2'를 추가하십시오." -strict -2를 추가해도 도움이되지 않습니다. 결과는 길이가 0 인 파일입니다.
Ivan

4
@Ivan, -strict -2전에 추가하려고 했습니까 cut.mp4(명령 줄 끝이 아닌)?
Jan Gondol

이봐, 내가 3-8 초가 아닌 비디오 만 원한다면 말해 줄래?
Parth Solanki 2016 년

1
이것은 매우 느리다
Tessaracter

21

소스 비디오의 시작 및 종료 시간을 기준으로 자르고 수학을 수행하지 않으 려면 종료 시간을 입력 옵션으로 지정하고 시작 시간을 출력 옵션으로 지정하십시오.

ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg

이렇게하면 0:45에서 1:00까지 15 초가 줄어 듭니다.

이 때 때문이다 -ss출력 옵션으로 지정되어, 폐기 된 시간이 여전히 전체 시간에 포함되는 입력으로부터 판독 -t을 중지 할 때를 알고 사용한다. 입력 옵션 -ss으로 제공 되는 경우 시작 시간을 찾고 계산하지 않습니다 . 혼동이 시작됩니다.

생략 된 세그먼트는 여전히 버려지기 전에 처리되기 때문에 탐색보다 속도가 느리지 만 이것이 내가 아는 한 이것을 수행하는 유일한 방법입니다. 큰 파일 내에서 깊게 클리핑하는 경우 수학을 수행 -ss하고 입력에 사용하는 것이 더 현명합니다 .


4
느리지 만 유일한 것은 나를 위해 일했습니다 (다른 답변의 프레임을 잃지 않고)
techkuz

8

내가 사용하는 것은 다음과 같습니다.

ffmpeg -i input.mkv -ss 00:01:00 -to 00:02:00 -c:v copy -c:a copy output.mp4

생성 된 mp4파일은에서 사용할 수도 있습니다 iMovie.

참조 : https://www.arj.no/2018/05/18/trimvideo


여러 컷 장면을 연결하려면 다음 스크립트를 사용할 수 있습니다.

#!/usr/bin/env python3

import subprocess

name = "batman.mp4"

times = []
times.append(["01:06:00", "01:07:00"])
times.append(["01:08:00", "01:09:00"])

open('concatenate.txt', 'w').close()
for idx, time in enumerate(times):
    output_filename = f"output{idx}.mp4"
    cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
    subprocess.check_output(cmd)
    with open("concatenate.txt", "a") as myfile:
        myfile.write(f"file {output_filename}\n")

cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "final.mp4"]
output = subprocess.check_output(cmd).decode("utf-8").strip()

이것은 이미 답변되었습니다
Tessaracter

1
내 접근 방식은 허용되는 답변과 다릅니다. mp4 파일을 구성하는 데 시간이 오래 걸리는 것을 시도했습니다. @Tessaracter
alper

1
이것은 큰 비디오에서 작은 클립을 자르는 데 도움이되는 유일한 대답입니다. 이것은 작동하고 빠릅니다 !!! 감사합니다
lacostenycoder

1
천만에요, 도와 드리겠습니다. 많은 접근법을 시도한 후에이 답변을 찾을 수있었습니다. 그들 대부분은 꽤 느 렸습니다. @lacostenycoder
고문

-c : v와 -c : a를 분리하는 대신 "copy"와 함께 "-c"를 사용할 수 없습니까?
nstenz


-3

비록 6 년 늦었지만 위의 모든 답변이 @kalai 가 묻는 질문을 제대로 해결하지 못했다고 생각합니다 . 아래 bash 스크립트는 다음 형식으로 텍스트 파일을 처리합니다.

URL | start_time | end_time | filename

예를 들어

https://www.youtube.com/watch?v=iUDURCrvrMI|00:02:02|00:03:41|1

그리고 파일을 통해 루프는 그 파일 다운로드 youtube-dl사이의 기간을 계산, 지원을 start_time하고 end_time과에 전달 ffmpeg하기 때문에, -t실제로이다 기간 이 아닌 실제end_time

질문이 있으시면 연락주세요.

    for i in $(<video.txt);
    do
        URL=`echo $i | cut -d "|" -f 1`;
        START=`echo $i | cut -d "|" -f 2`;
        END=`echo $i | cut -d "|" -f 3`;
        FILE=`echo $i | cut -d "|" -f 4`;

        SEC1=`echo $START | sed 's/^/((/; s/:/)*60+/g' | bc`
        SEC2=`echo $END | sed 's/^/((/; s/:/)*60+/g' | bc`

        DIFFSEC=`expr ${SEC2} - ${SEC1}`

        ffmpeg $(youtube-dl -g $URL | sed "s/.*/-ss $START -i &/") -t $DIFFSEC -c copy $FILE".mkv";
        ffmpeg -i $FILE".mkv" -f mp3 -ab 192000 -vn $FILE".mp3";
        rm $FILE".mkv";
    done;

이것은 비디오가 아닌 mp3 오디오 파일 만 출력합니다.
lacostenycoder

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