![用法:sh ./scenesplit.sh inputfile.mp4](https://linux22.com/image/1301659/%E7%94%A8%E6%B3%95%EF%BC%9Ash%20.%2Fscenesplit.sh%20inputfile.mp4.png)
我正在寻找一个能够根据场景变化将电影分成几部分的程序。因此,如果电影由森林景观和水族馆中的鱼类组成,那么我希望获得两部电影:第一部是关于森林的,第二部是关于鱼类的。最好该程序在 Linux 下可用并具有命令行界面
答案1
我目前所能找到的:
该程序
lav2yuv
可以检测场景变化:-S list.el Output a scene list with scene detection
为了实现此功能,您需要先将视频文件转换为 MJPEG:
ffmpeg -i source.avi -an -vcodec mjpeg destination.avi
- 有一款被遗弃的软件叫射击探测。这是我发现的唯一的命令行和开源程序,但我预计它不适用于大多数视频。
答案2
我用过Scenalyzer 直播取得了巨大的成功。它可以进行场景检测,但它是一个 Windows GUI 工具,而不是 Linux 命令行:
ScLive 在捕捉时具有自动场景分割功能 - 每个场景都实时写入其自己的 .avi 文件中。它根据嵌入在 DV 流中的录制时间或光学内容分割场景。
答案3
根据其网页(http://www.kdenlive.org/users/jbm/preparing-new-kdenlive-release),Kdenlive 有这个功能(称为剪辑分析功能)。
答案4
几天前,我在寻找自动分割剪辑的解决方案时发现了这篇文章。我最终制作了一个 bash 脚本。希望这对某些人有帮助,因为我的谷歌搜索首先把我带到了这里,而且我已经是 stack exchange 的成员,所以我决定在这里发布它,希望它能对其他人有所帮助。
我不知道我是否有权提出免责声明,但请注意,本文按原样提供,不提供任何保证,如果您(或它)弄乱了某些东西,我概不负责。这是我的第一个脚本之一,我对 bash 的经验很少,所以如果 bash 专家想要进一步调整它,请相信我。请随意修改、共享和使用该脚本。
用法:sh ./scenesplit.sh inputfile.mp4
- 脚本会在当前路径下创建一个以输入文件命名的文件夹,并将剪切的场景输出到其中
- 它将创建一个包含来自 ffmpeg 的 showinfo 的文件
- 从此文件它将输出另一个文件,其中包含每次检测的时间戳
- 然后脚本将循环 ffmpeg 根据时间戳文件创建一系列剪辑。第一个剪辑从 0 开始,到第一个时间戳结束。最后一个剪辑从最后一个时间戳开始,到原始剪辑的末尾结束。
- 每个场景之间都会睡一秒钟。
您可以通过更改 的值来调整检测的“灵敏度” gt(scene,0.1)
。 需要是 0 到 1 之间的值。 他们建议(正如他们所说,这是明智的)介于 0.4 和 0.6 之间,但 0.1 对我来说就足够了。
输出编解码器设置为 mp4,带有 30fps 720p 的 aac 音频。
对我来说,mp4 文件可以正常工作。没有用任何其他编解码器进行测试。
#/bin/bash
start=0;
count=0;
in="$1"
bn="$(basename "$in")"
echo "=============================================================================="
echo "FILE START: $bn"
mkdir "./$bn"
echo "Finding Scene... this might take a while..."
ffmpeg -nostdin -i "$in" -filter:v "select='gt(scene,0.1)',showinfo" -f null - 2>"./$bn/ffout.tmp.txt"
echo "Filtering timestamp... this might take a while..."
grep showinfo "./$bn/ffout.tmp.txt" | grep pts_time:[0-9.]* -o | grep '[0-9]*\.[0-9]*' -o > "./$bn/timestamps.tmp.txt"
scenes=$(wc -l < "./$bn/timestamps.tmp.txt")
echo "Found $scenes scenes"
sleep 1
while IFS= read -r line; do
echo "---------------------------------------------------------------------------"
echo "SCENE START: $count/$scenes ($start,$line)"
ffmpeg -i "$in" -ss "$start" -to "$line" -nostdin -y -vcodec libx264 -acodec aac -g 120 -s 1280x720 -r 30 "./$bn/$bn.($count of $scenes).mp4"
echo "SCENE DONE:$count/$scenes ($start,$line)"
echo "---------------------------------------------------------------------------"
start=$line
count=$(($count+1))
sleep 1
done <"./$bn/timestamps.tmp.txt"
echo "---------------------------------------------------------------------------"
echo "LAST SCENE START:$count/$scenes ($start,end)"
ffmpeg -i "$in" -ss "$start" -nostdin -y -vcodec libx264 -acodec aac -g 120 -s 1280x720 -r 30 "./$bn/$bn.($count of $scenes).mp4"
echo "LAST SCENE DONE:$count/$scenes ($start,end)"
echo "---------------------------------------------------------------------------"
echo "FILE DONE: $bn"
echo "=============================================================================="
希望这有帮助,llt