任意の時間範囲内のビデオからサムネイルを作成する

任意の時間範囲内のビデオからサムネイルを作成する

私はこのbashスクリプトを使ってビデオからサムネイルを生成しています。

#!/bin/bash
source_dir="."
output_dir="/output"
input_file_types=(avi wmv flv mkv mpg mp4)
output_file_type="jpg"
r1=$(( ( RANDOM % 10 )  + 5 ))

convert() {
        echo "" | ffmpeg -ss 00:"r1":05 -y -i "$1" -an -f image2 -vframes 1 "$output_dir/$2"
}

for input_file_type in "${input_file_types[@]}"
do
        find "$source_dir" -name "*.$input_file_type" -print0 | while IFS= read -r -d $'\0' in_file
        do
                echo "Processing…"
                echo ">Input  $in_file"

                # Replace the file type
                out_file=$(echo "$in_file" | sed "s/\(.*\.\)$input_file_type/\1$output_file_type/g")
                # The above can be shortened to
                # out_file="${in_file%.$input_file_type}.$output_file_type"
                echo ">Output $out_file"

                # Convert the file
                convert "$in_file" "$out_file"

                if [ $? != 0 ]
                then
                    echo "$in_file had problems" >> handbrake-errors.log
                fi

                echo ">Finished $out_file\n\n"
        done
done
echo "DONE CONVERTING FILES"

私が望むのは、総ビデオ時間を計算し、任意のビデオ時間からサムネイルを生成することです。

mediainfo myvideo.mp4 | grep Duration
Duration                                 : 5mn 7s
Duration                                 : 5mn 7s
Duration                                 : 5mn 7s

grep Duration合計ビデオ時間に基づいて任意の時間にサムネイルを取得できるように、上記のbashスクリプトにどのように統合できますか?

ベストアンサー1

時間を秒単位で取得してください。これにより、すべてが簡単になります。

変換関数は次のようになります。

convert() {
    # Get duration in milliseconds, then convert to seconds
    duration=$(($(mediainfo --Inform="General;%Duration%" "${in_file}" ) / 1000 ))

    # Calculate random time
    random_time=$(date -u -d @$(shuf -i 0-${duration} -n 1) +"%T")

    # Take screenshot
    ffmpeg -ss ${random_time} -i "$in_file" -vframes 1 -q:v 2 "$output_dir/$output_file"
}

おすすめ記事