LINUX.ORG.RU

Вырезать тишину из видеолекций. ffmpeg encoders etc.

 , , ,


1

2

День добрый! Прошу совета.

У меня есть гора видеолекций, треть из которых составляют паузы, треть «бе…ме…эээээ…ну…», и только треть - собственно полезная часть. Хотя бы первую треть хочется вырезать, для этого я нашёл массу готового софта. Навскидку у меня толком заработал auto-editor, но он оч. долго генерирует результат, иногда система зависает вовсе.

Пытался заставить его использовать аппаратное ускорение - не сработало. Понял, что в списке ffmpeg -encoders у меня нет h264_amf (если я правильно понял, это тот энкодер, что нужен).

cat /proc/cpuinfo |grep name model name : AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx

Вопросы:

  1. можно ли вообще аппаратно ускорить ffmpeg на этой тухлой встройке, а если да, то как?
  2. кто имеет сходный опыт, чем лучше вырезать тишину и бе-ме из лекций?

Во-первых, по технической части: ffmpeg хорошо работает безо всяких ускорений, на проце. Смысл в ускорениях через видеокарту есть тогда, и только тогда, когда ты обрабатываешь большой поток данных постоянно (например, владеешь популярным видеохостингом, куда постоянно заливают новые видео). То, что у тебя что-то там зависает - явно не проблема ffmpeg-а, а проблема той проги которая виснет.

Во-вторых, я бы на твоём месте забил. Видеолекции - само по себе крайне сомнительный формат в плане полезности, а у тебя они ещё и низкого качества судя по всему.

firkax ★★★★★
()

Может лучше просто текст распознать и прочитать его? Один фиг читать быстрее на порядок, чем слушать, если ты конечно не болен чем-то, вроде дислексии или крайне плохого зрения.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

Наше с нейросетью сочинение на тему:

#!/bin/bash

# === CONFIG ===
INPUT="$1"
OUTPUT="$2"
SILENCE_THRESHOLD="-35dB"     # Silence detection threshold
MIN_SILENCE_DURATION="0.2"    # Silence must be at least this long to be considered
MIN_SEGMENT_DURATION="0.1"    # Skip non-silent segments shorter than this

# === Get total duration of input video ===
DURATION_TOTAL=$(ffprobe -v error -show_entries format=duration \
    -of default=noprint_wrappers=1:nokey=1 "$INPUT")

# === Function to parse silencedetect log and print non-silent segments ===
get_non_silent_segments() {
    ffmpeg -hide_banner -i "$INPUT" \
        -af "silencedetect=noise=$SILENCE_THRESHOLD:d=$MIN_SILENCE_DURATION" \
        -f null - 2>&1 |
    awk -v total="$DURATION_TOTAL" '
    BEGIN {
        silence_start = 0;
        silence_end = 0;
    }
    /silence_start/ {
        silence_start = $NF;
        printf("%f %f %f\n", silence_end, silence_start, (silence_start - silence_end));
    }
    /silence_end/ {
        silence_end = $(NF-3);
    }
    END {
        printf("%f %f %f\n", silence_end, total, (total - silence_end));
    }'
}

# === Search for non-silent segments ===
echo "Searhing silent parts..." >&2
mapfile -t segments < <(get_non_silent_segments)

# === Main Processing Pipeline ===
{
    for line in "${segments[@]}"; do
        read start end duration <<< "$line"
        if (( $(echo "$duration >= $MIN_SEGMENT_DURATION" | bc -l) )); then
            echo "Extracting segment: $start to $end (duration $duration)" >&2
            ffmpeg -hide_banner -loglevel error \
                -i "$INPUT" -ss "$start" -t "$duration" \
                -c:a copy -c:v h264 -crf 22 -preset fast -f mpegts - 2>/dev/null
        else
            echo "Skipping short segment: $start to $end (duration $duration)" >&2
        fi
    done
} | ffmpeg -hide_banner -loglevel error -f mpegts -i - -c copy "$OUTPUT" -y

Как пользоваться:

./sr.sh input.mp4 output.mp4

Кодек и ускорение можно выбирать, естественно, для чего необходимо поправить соответствующую строчку (48).

anonymous
()