Як розділити відеофайл за розміром за допомогою ffmpeg?


3

Я хочу розділити відеофайл за розміром за допомогою ffmpeg.

Ви знаєте, як це зробити?

Чи потрібно обчислювати тривалість, що відповідає кожному розміру?

Дякую.


ви намагаєтеся це зробити програмно (тобто ви пишете код за допомогою FFMPEG і хочете це зробити) чи просто хочете розділити файл?
txtechhelp

Відповіді:


4

-fsОпція обмежує розмір файлу. Кількість подається в байтах. Якщо ви не хочете повторно кодувати, скористайтеся -copyопцією.

На жаль, мені не відомо, як шукати байт-позицію для початку наступного відео. Але ви можете перевірити отриману тривалість і розпочати наступне кодування, скориставшись -ssопцією для початку кодування звідти.


1

У мене просто була та сама проблема, і після того, як я не знайшов тут рішення, я написав швидкий скрипт для цієї роботи.

Особливості:

  • Використовуйте ffmpeg's -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

Сподіваюся, що допомагає :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.