Bash 如何在每次音量为零时使用ffmpeg分割mp4视频?

Bash 如何在每次音量为零时使用ffmpeg分割mp4视频?,bash,ffmpeg,sh,Bash,Ffmpeg,Sh,我需要将一个视频分割成许多较小的视频。 我试过PySceneDetect,它的两种场景检测方法不适合我的需要 这个想法是在每次音量很低、音频级别低于给定参数时触发场景剪切/中断。我认为总体RMS dB音量水平就是我的意思 其目的是将mp4视频分割为多个短视频,每个小视频带有简短的对话短语 到目前为止,我有一个命令,以获得总体RMS音频音量水平 ffprobe -f lavfi -i amovie=01x01TheStrongestMan.mp4,astats=metadata=1:reset=1

我需要将一个视频分割成许多较小的视频。 我试过PySceneDetect,它的两种场景检测方法不适合我的需要

这个想法是在每次音量很低、音频级别低于给定参数时触发场景剪切/中断。我认为总体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


谢谢。

使用
静音检测
音频过滤器,并将其调试输出馈送至
输出格式参数

下面是一个现成的脚本:

#!/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
    ,使其不完全静音
  • d=0.3
    是被视为分割点的最小静默时间。如果只有严重的(如3秒钟)静默才被视为真实的、值得分割的静默,则增加该值
  • 另一个环境变量
    MIN\u FRAGMENT\u DURATION
    定义了每次拆分后忽略静默事件的时间量。这将设置最小片段持续时间
如果根本没有检测到静默,脚本将失败


有一个问题,但有一个用户遇到了问题。

我对这个特定主题不太熟悉,但可能会有帮助。回答可能会有帮助。Let us.license=MIT