我有一堆足球隊賽季的比賽錄像,我給每個隊友分配了一場比賽,讓他們觀看並記下精彩場面發生的時間間隔。
現在,我不想手動刪除所有這些內容,而是想編寫一個腳本來為我完成此操作。我熟悉 shell 腳本、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 (例如透過右室VM)和最新版本FFmpeg已安裝(參見這裡關於如何從來源安裝)。
我的腳本可以在這裡找到:
video-extract.rb
您需要向其提供 CSV 輸入編輯列表,最重要的是包含以下列:
- 前綴(可為空)
- 視訊 ID(某個序號)
- 輸入檔名
HH:MM:SS.ms
以秒為單位的入點- 編輯的長度(以秒為
HH:MM:SS.ms
單位)
例如(請注意該Out
列未使用):
- 然後,調整腳本標題中的變數。最重要的是,如果您想要位元流副本並且不需要重新編碼,請更改
COPY
為。true
也要更改 CSV 列的索引和 CSV 分隔符號。
請隨意改進腳本或提出更改建議(特別是如果您已經了解 Ruby)。我經常使用這個腳本,但還沒有遇到問題。唯一缺少的是適當的音訊支援 - 它只會複製音訊串流,這可能會或可能不會在您的情況下工作。如果遇到麻煩,請回來報告。
如果您需要計算入點和出點之間的差異,您可以使用這個基於 Ruby 的小腳本來完成此操作這個堆疊溢位問答:
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
and的文件,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 20
),然後將 30 秒 ( -t 30
) 儲存到一個名為newmovie.mpg