web-dev-qa-db-ja.com

コマンドラインツールを使用してビデオを均一な部分に切り取る方法

コマンドラインツールを使用して、特定の間隔、たとえば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スクリプトは本当に正しいアプローチですか?または、この目的に使用できる、よりシンプルで効率的で信頼性の高いツールはありますか?

2
Lichtung

ffmpegsegment 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)です。

2
llogan