3

Я хочу разделить видео файл по размеру, используя ffmpeg.

Ты знаешь как это сделать?

Нужно ли рассчитывать продолжительность, соответствующую каждому размеру?

Спасибо.

2 ответа2

4

Опция -fs ограничивает размер файла. Число указывается в байтах. Если вы не хотите перекодировать, используйте опцию -copy .

К сожалению, я не знаю, как искать позицию байта для запуска следующего видео. Но вы можете проверить полученную длительность и начать следующую кодировку, используя опцию -ss чтобы начать кодирование с этого момента.

0

У меня просто была такая же проблема, и после того, как я не нашел здесь решения, я написал быстрый скрипт bash для этой работы.

Особенности:

  • Используйте ffmpeg -fs -flag для ограничения размера файла
  • Проверьте длину полученной части видео и рассчитайте, с чего начать следующую часть.
  • Перечислите видео части
  • выполните столько частей, сколько нужно, чтобы содержать весь исходный файл.
  • Разрешить для пользовательских аргументов ffmpeg также уменьшить разрешение и качество за один проход.

Он принимает только три аргумента: исходное имя файла, желаемый размер файла каждой части и желаемые аргументы для ffmpeg.

Пример вызова для разделения файла на 64 МБ части:

./split-video.sh huge-video.mov 64000000 "-c:v libx264 -crf 23 -c:a copy -vf scale=960:-1"

Наконец, исходный код скрипта:

#!/bin/bash
# Short script to split videos by filesize using ffmpeg by LukeLR

if [ $# -ne 3 ]; then
    echo 'Illegal number of parameters. Needs 3 parameters:'
    echo 'Usage:'
    echo './split-video.sh FILE SIZELIMIT "FFMPEG_ARGS'
    echo 
    echo 'Parameters:'
    echo '    - FILE:        Name of the video file to split'
    echo '    - SIZELIMIT:   Maximum file size of each part (in bytes)'
    echo '    - FFMPEG_ARGS: Additional arguments to pass to each ffmpeg-call'
    echo '                   (video format and quality options etc.)'
    exit 1
fi

FILE="$1"
SIZELIMIT="$2"
FFMPEG_ARGS="$3"

# Duration of the source video
DURATION=$(ffprobe -i "$FILE" -show_entries format=duration -v quiet -of default=noprint_wrappers=1:nokey=1|cut -d. -f1)

# Duration that has been encoded so far
CUR_DURATION=0

# Filename of the source video (without extension)
BASENAME="${FILE%.*}"

# Extension for the video parts
#EXTENSION="${FILE##*.}"
EXTENSION="mp4"

# Number of the current video part
i=1

# Filename of the next video part
NEXTFILENAME="$BASENAME-$i.$EXTENSION"

echo "Duration of source video: $DURATION"

# Until the duration of all partial videos has reached the duration of the source video
while [[ $CUR_DURATION -lt $DURATION ]]; do
    # Encode next part
    echo ffmpeg -i "$FILE" -ss "$CUR_DURATION" -fs "$SIZELIMIT" $FFMPEG_ARGS "$NEXTFILENAME"
    ffmpeg -ss "$CUR_DURATION" -i "$FILE" -fs "$SIZELIMIT" $FFMPEG_ARGS "$NEXTFILENAME"

    # Duration of the new part
    NEW_DURATION=$(ffprobe -i "$NEXTFILENAME" -show_entries format=duration -v quiet -of default=noprint_wrappers=1:nokey=1|cut -d. -f1)

    # Total duration encoded so far
    CUR_DURATION=$((CUR_DURATION + NEW_DURATION))

    i=$((i + 1))

    echo "Duration of $NEXTFILENAME: $NEW_DURATION"
    echo "Part No. $i starts at $CUR_DURATION"

    NEXTFILENAME="$BASENAME-$i.$EXTENSION"
done

Надеюсь, это поможет :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .