ffmpeg를 사용하여 동일한 비디오의 클립을 연결하는 방법


15

장면이 다른 긴 비디오가 있습니다. ffmpeg 2.1.4를 사용하여 비디오에서 I 장면에서 시작하지 않는 2 장면을 추출하고 연결하고 싶습니다.

논쟁을 위해, 01:00과 02:00에서 5 초를 원한다고 가정하십시오.

나는 이것을 할 수있다 :

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

그것은 나에게 내가 원하는 영화를 제공하지만 select는 실제로 영화의 전체 나머지 부분을 ffmpeg로 강제로 해독합니다. 그렇다면 첫 번째 영화를 디코딩하는 대신 자르라고 어떻게 말합니까?

가능한 경우 ffmpeg 복합 필터 로이 작업을 선호합니다. -t별도의 동영상을 먼저 레코딩하는 데만 사용할 수 있지만 여분의 인코딩 단계는 매우 느리며이 비디오의 품질도 상당히 떨어집니다.

증기 길이를 자르는 필터를 찾지 못하는 것 같습니다. -t또는 -ss매개 변수에 해당하는 필터 노드가 있습니까?

답변:


16

연결 필터

추가 필터링을 수행해야하는 경우이 방법이 가장 좋습니다.

사용 trim, atrim, setpts, asetpts, 및 concat필터 :

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptsasetpts의한 프리젠 테이션 타임 스탬프 문제에 육포 출력을 방지 할 수 있습니다.

  • 최신 버전을 사용해야합니다. Windows, OS X 및 Linux 용 빌드에 대한 링크 는 FFmpeg 다운로드 페이지를 참조하십시오 .


concat demuxer

또 다른 방법은 세그먼트를 개별적으로 작성하고 시간과 품질을 절약하기 위해 다시 인코딩하는 대신 스트림을 복사 하여 concat demuxer 와 결합하는 것입니다 .

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
아 고마워 트림은 내가 잃어버린 것입니다. 그러나 모든 것을 디코딩하는 것처럼 지정한 시간 오프셋에 도달하는 데 시간이 오래 걸립니다. 또한 출력의 일부에 오디오가 없습니다. 수정하려면 동일한 입력을 -ss로 여러 번 지정한 다음 trim을 사용하여 비디오를 자릅니다. 이 경우 ss가 pts를 0으로 설정하기 때문에 setpt가 필요하지 않습니다. 작동하는 것처럼 보였고 인코딩 중에 이상한 임의의 일시 중지가 없었습니다. 스트림 복사에 대해서는 이전에 시도했습니다. 이전 I- 프레임에서 시작하므로 원하는 부분과 다른 부분을 얻을 수 있습니다.
초에 스 큐어

이 질문과 비슷한 내 질문에 대답 해 주시겠습니까? video.stackexchange.com/questions/18247/…
Eftekhari

흥미롭게도 -filter_complex작품은 있지만 concat파일은 그렇지 않습니다. 즉, 첫 번째 비디오는 잘 보이지만 두 번째 품질은 끔찍합니다. 입력 파일을 제외하고 두 명령 모두에 대해이 명령을 정확하게 복사했습니다.
bobmarksie

7

이것은 더 빨리 작동해야합니다 ...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

출력에 -t를 지정할 필요가 없습니다. 연결하기 전에 오디오와 비디오를 분리 할 필요가 없습니다.


1
이것은 재 인코딩이 필요한 concat 필터를 사용합니다. 이것은 사용자에 의해 바람직하거나 바람직하지 않을 수있다.
llogan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.