我目前正在使用 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)