用法:sh ./scenesplit.sh inputfile.mp4

用法:sh ./scenesplit.sh inputfile.mp4

我正在寻找一个能够根据场景变化将电影分成几部分的程序。因此,如果电影由森林景观和水族馆中的鱼类组成,那么我希望获得两部电影:第一部是关于森林的,第二部是关于鱼类的。最好该程序在 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

相关内容