ffmpeg를 사용하여 미디어 파일 트리밍 및 조인


0

비디오 파일에서 세그먼트 (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 버전 : 링크

편집하다:

trimHH : 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

그러나 여전히 두 번째 방법의 문제점을 알고 싶습니다.


에서 seek방법, 왜 시간 표시기 -t2 명령?
Gyan

@Mulvya 클리핑 시간을 지정합니다. 당신이 그것을 언급 했으므로, 나는 작은 실수를 저지른 것을 보았습니다 -t 00:53:50. 두 번째 명령 대신에 이어야합니다 -t 00:21:20.
Anmol Singh Jaggi

@Mulvya 수정 후에도 같은 오류가 발생합니다. Alos, 나는 이것이 문제라는 것을 고쳤다.
Anmol Singh Jaggi

trim현재 HH : MM : SS에서는 작동하지 않습니다 . 초를 지정하십시오. 그리고 내가 의미하는 것은 중간 부분을 제외하고 파일을 끝까지 원했기 t때문에 두 번째 명령에서 지정할 필요가 없다는 것 입니다. 여전히 오류가 발생하면 전체 파일을 새 컨테이너에 복사하고 다시 시도하십시오.ffmpeg -i input -c copy new.mp4
Gyan

좋아, 네가하려는 말이있어 그에 따라 질문을 편집했습니다.
Anmol Singh Jaggi

답변:


1

트림 필터는 현재 HH : MM : SS 에서 작동하지 않습니다 . 초를 지정하십시오. 이 방법은 비디오를 다시 인코딩하므로 품질이 떨어집니다. -crf 20품질을 제어하기 위해 CRF 값을 지정할 수 있습니다 . 값이 낮을수록 품질은 좋아 지지만 파일은 커집니다. 18-28은 시도하기에 적당한 범위입니다.

두 번째 방법은 텍스트 파일에 컷 포인트를 지정하여 시도하십시오.

file 'input.mp4'
duration 1560
file 'input.mp4'
inpoint 1980

그런 다음 실행

ffmpeg -f concat -i input.txt -c copy -fflags +genpts -avoid_negative_ts make_zero output.mp4

품질에 관한 팁을 주셔서 감사합니다. 두 번째 방법은 여전히 ​​작동하지 않습니다. 출력 파일에는 두 번째 비디오가 전혀 포함되어 있지 않습니다. 크기는 첫 번째 비디오와 거의 비슷합니다. 여기 로그가 있습니다.
Anmol Singh Jaggi 8

연결 목록은 전체 입력 파일을 참조해야합니다.
Gyan

좋아, 나도 그것을 시도했지만 input.txt: Invalid argument출력 파일에서 두 번째 비디오 파일이 누락되어 같은 오류가 발생합니다.
Anmol Singh Jaggi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.