비디오 파일에서 세그먼트 (00:26:00-00:32:30)를 제거하려고합니다 input.mp4
.
ffmpeg를 사용하여 직접 수행 할 수있는 방법이 없기 때문에 (내가 아는 한) 출력에서 원하는 세그먼트를 잘라서 연결합니다.
조금 검색 한 후이 작업을 수행하는 두 가지 방법이 있음을 발견했습니다.
불행히도,이 두 가지 방법 모두 저에게 실패합니다.
두 방법 모두에서 수행 한 단계를 설명하겠습니다.
1. 사용 trim
:
편집 :이 방법은 지금 작동합니다; 대신 두 번째 방법으로 건너 뜁니다.
사용 된 명령 :
ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=duration=00:26:00[a]; \
[0:v]trim=start=00:32:30,setpts=PTS-STARTPTS[b]; \
[a][b]concat[c]" -map [c] out.mp4
명령 출력 : 링크
출력 파일의 길이는 1 분 미만이며 6.8MB에 불과하지만 입력 파일은 900MB입니다.
2. 사용 seek
사용 된 명령 :
# Cut first wanted segment
ffmpeg -ss 00:00:00 -i input.mp4 -t 00:26:00 -c copy -avoid_negative_ts 1 first.mp4
# Cut second wanted segment
ffmpeg -ss 00:32:30 -i input.mp4 -c copy -avoid_negative_ts 1 second.mp4
# Combine all the wanted segments
ffmpeg -f concat -i input.txt -c copy output.mp4
어디에 input.txt
포함 :
file first.mp4
file second.mp4
명령 출력 : 링크 (오류는 라인 (90)에 언급된다 input.txt: Invalid argument
)
이 경우 내가 얻는 출력 파일은 약 500MB (입력 파일은 900MB)이며 첫 번째 비디오 + 두 번째 비디오의 처음 몇 분을 포함합니다.
내 시스템 정보 :
우분투 14.04
ffmpeg 버전 : 링크
편집하다:
trim
HH : MM : SS 표기법이 깨지기 때문에 초를 시간 단위로 쓰는 것에 관한 @Mulvya의 의견 덕분에 사용하는 방법 1 이 작동 합니다.
새로운 명령 :
ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=duration=1500[av]; \
[0:a]atrim=duration=1500[aa];\
[0:v]trim=start=1980,setpts=PTS-STARTPTS[bv]; \
[0:a]atrim=start=1980,asetpts=PTS-STARTPTS[ba];\
[av][bv]concat[outv]; [aa][ba]concat=v=0:a=1[outa]" \
-map [outv] -map [outa] out.mp4
그러나 여전히 두 번째 방법의 문제점을 알고 싶습니다.
-t 00:53:50
. 두 번째 명령 대신에 이어야합니다 -t 00:21:20
.
seek
방법, 왜 시간 표시기-t
2 명령?