gpt4 book ai didi

bash - 每次音量为零时,如何使用 ffmpeg 分割 mp4 视频?

转载 作者:行者123 更新时间:2023-12-04 22:45:09 26 4
gpt4 key购买 nike

我需要将视频拆分为许多较小的视频。
我已经尝试过 PySceneDetect,它的 2 种场景检测方法不适合我的需要。

这个想法是在每次音量非常低时触发场景切换/中断,每次音频电平低于给定参数时。我认为整体 RMS dB 音量水平就是我的意思。

目的是将一个 mp4 视频分割成许多短视频,每个小视频都有简短的对话短语。

到目前为止,我有一个命令可以获取整体 RMS 音频音量级别。

ffprobe -f lavfi -i amovie=01x01TheStrongestMan.mp4,astats=metadata=1:reset=1 -show_entries frame=pkt_pts_time:frame_tags=lavfi.astats.Overall.RMS_level,lavfi.astats.1.RMS_level,lavfi.astats.2.RMS_level -of csv=p=0

如何仅获取 RMS 电平及其相应帧或时间的最小值?

然后我如何使用 ffmpeg 将视频分割成多个视频中对应于最小 RMS 的每一帧?

谢谢。

最佳答案

使用silencedetect音频过滤器并将其调试输出提供给 segment输出格式参数。

这是一个现成的脚本:

#!/bin/bash

IN=$1
OUT=$2

true ${SD_PARAMS:="-55dB:d=0.3"};
true ${MIN_FRAGMENT_DURATION:="20"};
export MIN_FRAGMENT_DURATION

if [ -z "$OUT" ]; then
echo "Usage: split_by_silence.sh input_media.mp4 output_template_%03d.mkv"
echo "Depends on FFmpeg, Bash, Awk, Perl 5. Not tested on Mac or Windows."
echo ""
echo "Environment variables (with their current values):"
echo " SD_PARAMS=$SD_PARAMS Parameters for FFmpeg's silencedetect filter: noise tolerance and minimal silence duration"
echo " MIN_FRAGMENT_DURATION=$MIN_FRAGMENT_DURATION Minimal fragment duration"
exit 1
fi

echo "Determining split points..." >& 2

SPLITS=$(
ffmpeg -nostats -v repeat+info -i "${IN}" -af silencedetect="${SD_PARAMS}" -vn -sn -f s16le -y /dev/null \
|& grep '\[silencedetect.*silence_start:' \
| awk '{print $5}' \
| perl -ne '
our $prev;
INIT { $prev = 0.0; }
chomp;
if (($_ - $prev) >= $ENV{MIN_FRAGMENT_DURATION}) {
print "$_,";
$prev = $_;
}
' \
| sed 's!,$!!'
)


echo "Splitting points are $SPLITS"

ffmpeg -v warning -i "$IN" -c copy -map 0 -f segment -segment_times "$SPLITS" "$OUT"

您指定输入文件、输出文件模板、静音检测参数和最小片段大小,它会写入多个文件。

静音检测参数可能需要调整:
  • SD_PARAMS环境变量包含两个参数:噪声容忍级别和最小静音持续时间。默认值为 -55dB:d=0.3 .
  • 减少-55dB例如-70dB如果一些微弱的非无声声音在不应该引起吐痰的情况下触发。将其增加到例如-40dB如果由于其中有一些噪音而没有在静音时 split ,则使其不是完全静音。
  • d=0.3是被视为 split 点的最小静音持续时间。如果只有严重的(例如整个 3 秒)沉默应该被认为是真正的、值得 split 的沉默,则增加它。
  • 另一个环境变量MIN_FRAGMENT_DURATION定义每次拆分后忽略静音事件的时间量。这设置了最小片段持续时间。

  • 如果根本没有检测到静音,脚本将失败。

    有一个 refactored version on Github Gist ,但对于一位用户来说存在问题。

    关于bash - 每次音量为零时,如何使用 ffmpeg 分割 mp4 视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55057778/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com