ffmpegスクリプト - ビデオを複数の部分に分割

ffmpegスクリプト - ビデオを複数の部分に分割

私は現在ffmpegを使ってビデオファイルをスライスしています。というスクリプトでプロセスを自動化しましたffmpeg_split.sh。スクリプトを見るにはここ。スクリプトを実行するとparse_duration_info()。発生したエラーは次のとおりです。Bad input to parse_duration_info()

スクリプトを使用してビデオを分割する構文は次のとおりです。ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

Flags: 
-s  Path to video source (string)

-o  Path to output file with format (string)
    Format must be printf-like, for example ./path/video-part-%03d.avi

-c  Chunk length in seconds (integer)

質問は次のとおりです。これは完全なスクリプトです

function parse_duration_info() {
    if [[ $1 ]] && [[ $2 -gt 0 ]] && [[ $2 -lt 5 ]] ; then
        __OFFSET=$2
        __DURATION_PATTERN='\([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)\.\([0-9][0-9]\)'
        echo "$1" | sed "s/$__DURATION_PATTERN/\\$__OFFSET/"
    else
        echo "Bad input to parse_duration_info()"
        echo "Givven duration $1"
        echo "Givven offset $2"
        echo "Exiting..."
        exit 1
    fi
}

答え1

失敗した理由を確認するには、このスクリプトを少し分析する必要があります。すでにソースコードがあるので、これは難しい作業ではありません。まず、関数実装のコマンドがget_video_duration_in_seconds_from_file()正しいことを確認したいと思います。特に、私が持っているいくつかのファイルに対してこのコマンドを実行すると、.mp4何も返されません。

__DURATION_HMS=$(ffmpeg -i "$__FILE" 2>&1 | grep Duration | \
    grep '\d\d:\d\d:\d\d.\d\d' -o)

メモ:54行目です。

したがって、そのような値がない場合、その値の後に関数を呼び出すとエラーメッセージが返されるparse_duration_info()理由になります。

元のスクリプトの説明によると、2つのパラメータが必要ですparse_duration_info()

# arg1: duration in format 01:23:45.67
# arg2: offset for group 1 gives hours, 2 gives minutes, 
#       3 gives seconds, 4 gives milliseconds

追加のデバッグ出力

さらに、#!/bin/bashshebang()の後にこの行を追加すると、このスクリプトでより詳細な出力を有効にできます。

set +x

スクリプト全体の詳細詳細表示を有効にすることが多すぎる場合は、次のように特定のコードブロックの周りでオプションで有効にできます。

parse_duration_info() {
    set +x

    ... body of function ...

    set -x
}

答え2

この試み:

__DURATION_HMS=$(ffmpeg -i "${FILE}" 2>&1 | grep Duration | \ grep -e '[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}' -o)

関連情報