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

更多调试输出

此外,您可以通过在 shebang ( #!/bin/bash) 之后添加此行来启用此脚本的更详细输出。

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)

相关内容