我写了一个skript,可以根据在时间戳上记录的视频快速创建简短的预览剪辑,我发现以后值得检查一下以进行剪切。我的带有时间戳的文件是这样写的
FILE_NAME1#MM:SS MM:SS
FILE_NAME2#MM:SS MM:SS MM:SS MM:SS
Run Code Online (Sandbox Code Playgroud)
例:
MAH01728#02:47 03:34 03:44 05:00 06:08 06:55
Run Code Online (Sandbox Code Playgroud)
该脚本如下所示:
#!/bin/bash
while read f
do
file=$(echo $f | cut -d"#" -f1)
filename=${file}".MP4"
timestamps=$(echo $f | cut -d"#" -f2)
for time in $timestamps
do
ffmpeg -ss 00:${time}.0 -i "orig/${filename}" -c copy -t 10 "preview/${file}_${time}.MP4"
done
done < $1
Run Code Online (Sandbox Code Playgroud)
该脚本获得了我想要的预览的一半,另一方面,文件名被弄乱了,ffmpeg抱怨找不到该文件:
orig/714.MP4: No such file or directory
orig/00:58 01:25.MP4: No such file or directory
Run Code Online (Sandbox Code Playgroud)
因此,我修改了脚本以进行故障排除,并在ffmpeg命令前添加了回显-现在所有文件名都是正确的。我想念什么?
ffmpeg -ss 00:01:47.0 -i orig/MAH01714.MP4 -c copy -t 10 preview/MAH01714_01:47.MP4
ffmpeg -ss 00:02:00.0 -i orig/MAH01713.MP4 -c copy -t 10 preview/MAH01713_02:00.MP4
ffmpeg -ss 00:00:58.0 -i orig/MAH01712.MP4 -c copy -t 10 preview/MAH01712_00:58.MP4
ffmpeg -ss 00:01:25.0 -i orig/MAH01712.MP4 -c copy -t 10 preview/MAH01712_01:25.MP4
Run Code Online (Sandbox Code Playgroud)
ffmpeg
从标准输入中读取数据$1
,并从read
循环顶部的命令中使用该数据。从/dev/null
以下位置重定向其标准输入:
while IFS="#" read file timestamps; do
filename="$file.MP4"
for time in $timestamps; do
ffmpeg -ss 00:${time}.0 -i "orig/${filename}" \
-c copy -t 10 "preview/${file}_${time}.MP4" < /dev/null
done
done < "$1"
Run Code Online (Sandbox Code Playgroud)
echo
并没有从标准输入,这就是为什么你的修改使它看起来一切正常读取。