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

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

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

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중인 경우 위 명령 에서을 사용 하여 지정된 시간에 종료 할 수도 있습니다 .


답변

이것을 사용해보십시오. 내가 알아 낸 가장 빠르고 최고의 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 기사를 참조하십시오 .


답변

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

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


답변

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

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


답변

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

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

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

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

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


답변

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

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()


답변

-t 대신 -to를 사용하십시오. -to는 종료 시간을 지정하고 -t는 지속 시간을 지정합니다