편집 목록을 기반으로 비디오 자르기 스크립트

편집 목록을 기반으로 비디오 자르기 스크립트

저는 축구팀 시즌의 경기 영상을 많이 가지고 있으며 각 팀 동료에게 한 경기를 시청하도록 할당하고 하이라이트가 발생하는 시간 간격을 기록했습니다.

이제 이 모든 작업을 수동으로 잘라내는 대신 이 작업을 수행하는 스크립트를 작성하고 싶습니다. 저는 쉘 스크립팅, Python, Ruby에 익숙합니다.

이 작업을 자동화하는 데 도움이 되는 좋은 비디오 편집 도구를 알고 계시나요? 저는 팀원들이 사용할 수 있는 간단한 입력 파일에 간격을 넣을 수 있기를 바랐습니다.

답변1

이를 위해서는 FFmpeg가 필요합니다(다운로드정적 빌드) 및 배쉬.

CSV 형식의 입력 및 출력 지점 목록을 만듭니다. 예:

00:01:00,00:02:00
00:03:00,00:03:02

그런 다음 다음 Bash 스크립트를 실행하여 비디오를 개별 부분으로 잘라낼 수 있습니다.

#!/usr/bin/env bash

if [[ $# -ne 2 ]]; then
  echo "Usage: $0 <input> <editList>"
  exit 1
fi

inputFile=$1
editFile=$2

inputFileBase="${inputFile%.*}"
extension="${inputFile##*.}"

cnt=0
while IFS=, read -r start end; do
  suffix="$(printf "%05d" $cnt)"
  outfile="${inputFileBase}-${suffix}.${extension}"
  ffmpeg -nostdin -ss "$start" -i "$inputFile" -to "$end" -c copy -map 0 "$outfile"
  cnt=$((cnt+1))
done < "$editFile"

이 파일을 cut.sh(또는 유사한) 파일로 저장한 후 다음을 실행하십시오.

chmod +x cut.sh
./cut.sh /path/to/input.mp4 /path/to/editList.csv

비디오 및 오디오 비트스트림을 출력 파일에 복사하고 접미사 등 으로 순차적으로 번호를 매깁니다 00001.00002


아래의 오래된 답변 ...

나는 한때 정확히 그런 일을 하는 Ruby 스크립트를 작성한 적이 있습니다. Ruby ≥1.9.2가 필요합니다(예:RVM) 및 최신 버전의FFmpeg설치됨(참조여기소스에서 설치하는 방법에 대해 설명합니다.)

  1. 내 스크립트는 여기에서 사용할 수 있습니다.video-extract.rb

  2. 가장 중요한 것은 다음 열을 포함하는 CSV 입력 편집 목록을 제공해야 합니다.

  • 접두사(비어 있을 수 있음)
  • 동영상 ID(일부 일련번호)
  • 입력 파일 이름
  • 인 포인트( HH:MM:SS.ms또는 초)
  • 편집 길이 HH:MM:SS.ms(초)

예를 들면 다음과 같습니다(해당 Out열은 사용되지 않습니다).

  1. 그런 다음 스크립트 헤더에서 변수를 조정합니다. 가장 중요한 것은 비트스트림 복사를 원하고 재인코딩을 원하지 않는 경우 COPY로 변경하는 것입니다. true또한 CSV 열의 색인과 CSV 구분 기호를 변경합니다.

자유롭게 스크립트를 개선하거나 변경 사항을 제안하세요(특히 Ruby를 이미 알고 있는 경우). 나는 이 스크립트를 매우 자주 사용했지만 아직 문제가 발생하지 않았습니다. 누락된 유일한 것은 적절한 오디오 지원입니다. 이는 단지 오디오 스트림을 복사할 뿐이며 귀하의 경우에는 작동할 수도 있고 작동하지 않을 수도 있습니다. 문제가 발생하면 다시 신고하세요.

인 포인트와 아웃 포인트 사이의 차이를 계산해야 하는 경우 다음을 기반으로 하는 이 작은 Ruby 스크립트를 사용하여 계산할 수 있습니다.이 스택 오버플로 Q&A:

require "Time"
def time_diff(time1_str, time2_str)
  t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
  (t - t.gmt_offset).strftime("%H:%M:%S.%L")
end
ins, outs, diffs = File.open("ins.txt"), File.open("outs.txt"), File.new("diffs.txt", "w")
inlines, outlines = [], []
ins.each  { |l| inlines << l }
outs.each { |l| outlines << l }
inlines.zip(outlines).each { |ins, outs| diffs.puts time_diff(ins, outs) }
diffs.close

ins.txt각 줄이 시작 및 outs.txt종료 지점에 해당하는 파일을 생성하면 됩니다 (위 스크린샷 참조). 차이점은 에 기록됩니다 diffs.txt. 그렇게 간단합니다.

답변2

MEncoder는 여기 당신의 친구입니다. 이는 비디오 작업의 스크립팅을 위한 훌륭한 도구입니다. 저는 개별 프레임에서 비디오 파일을 만들 때 많이 사용합니다.

당신이 원하는 것을 정확하게 수행할 수 있는 Perl 스크립트를 찾았습니다.Video Cutter V2: Mencoder를 사용한 비디오 자르기

답변3

노력하다ffmpeg.

예를 들어:

ffmpeg -i original.mpg -ss 20 -t 30 newmovie.mpg

원본 비디오 파일을 열고( -i original.mpg) 처음 20초를 건너뛴 다음( ) -ss 2030초를( -t 30)이라는 새 영화에 저장합니다.newmovie.mpg

관련 정보