コマンドラインツールを使用して、特定の間隔、たとえば1秒でビデオを切り取りたいです。 60秒のビデオがある場合、60の均一な部分に分割されると思います。私の他の唯一の要件は、再エンコードがないことです。
このトピックについて2つの質問を読みました。
最初のスレッドは、もはや維持されていないように思われる信頼できないツールを提案しました。 2番目のスレッドは、手動の名前でビデオの大きなセグメントを操作することをavconv
に提案しました。私はこれらのビデオを潜在的に数百の小さな部分に分割するので、アプローチは非常に面倒です。 1人のユーザーがBashスクリプトを提供しましたが、これは「多くのエラーと空のファイルを生成する」可能性があることを認めました。わかりやすくするため、およびより良い解決策を促すために、このスクリプトをここに再投稿します。
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
FILES=$(ls *.mp4|sort)
let START=0
for FILE in $FILES
do
echo Processing $FILE
mkdir "${FILE}-chop"
for COUNT in {1..59}
do
exec avconv -i "${FILE}" -ss $START -t 60 -c:v copy -c:a copy "./${FILE}-chop/${COUNT} - ${FILE}"
let START=$START+60
done
done
IFS=$SAVEIFS
このようなBashスクリプトは本当に正しいアプローチですか?または、この目的に使用できる、よりシンプルで効率的で信頼性の高いツールはありますか?
ffmpeg
で segment muxer を使用します。
ffmpeg -i input -map 0 -f segment -segment_time 60 -reset_timestamps 1 -c copy output_%03d.mp4
-c copy
を使用すると、ストリームコピーモードが有効になります。セグメントマルチプレクサは、ストリームのコピー時にキーフレームをカットするため、セグメントの正確な時間は60秒ではない場合があります。セグメントごとに正確に60秒が必要な場合は、-c copy
を削除し、セグメントの時間制約に合うように適切なGOPサイズを設定して、再エンコードする必要があります。たとえば、25フレームレート出力の1秒GOPは-g 25
(デフォルトは250)です。