Пакетное кодирование FFmpeg - переменная CRF на основе битрейта

Я использую ffmpeg в экземпляре виртуальной машины под управлением Ubuntu для кодирования некоторых видео, загруженных с различных потоковых сайтов, в HEVC. В настоящее время я использую скрипт bash для преобразования всех этих файлов в каталог. Общий битрейт этих видео варьируется от 300 кбит / с до 1500 кбит / с. В моем тесте, использующем один и тот же CRF для всех этих видео, получался либо больший выходной файл в случае видео с высоким битрейтом, либо видео низкого качества в случае низкого битрейта. В настоящее время я вручную проверяю битрейт и перемещаю похожие файлы битрейта в каталог и соответственно изменяю CRF каждый раз. Это команда, которую я использую для получения битрейта:

find . -name "*.mp4" -print0 | xargs -0 -i{} sh -c " echo -n '{} ' && ffmpeg -i '{}' 2>&1 | sed -n -e 's/^.*bitrate: //p' "

Это скрипт bash.

#!/bin/bash -e
for i in ~/ffmpeg/*.mp4;    
do    
ffmpeg -i "$i" -c:v libx265 -crf 26 -c:a libopus -b:a 48k -vbr on -compression_level 10 -frame_duration 60 -application audio "${i%.*}.mkv"    
mv "${i%.*}.mkv" ~/ffmpeg/hevc    
rm -f -- "$i"    
done

Как я могу динамически изменять CRF в зависимости от диапазона битрейтов в этом скрипте bash? Например, если общая скорость передачи данных выше 950 = 26 крф, если общая скорость передачи от 750 до 949 = 24 крф, если общая скорость передачи от 500 до 749 = 22 крф, если общая скорость передачи ниже 499 = 18 крф.

2
задан 23 July 2020 в 14:30

1 ответ

Вот - ваши идеи объединены в один скрипт:

#!/bin/bash

# Script name: /usr/local/bin/ffscript.sh
# Usage:       go into the source directory and execute `ffscript.sh`  
                                                                                      
for file in *.mp4
do
        # Use command substitution `$()` in order to get the bit rate of the mp4 file as variable
        BIT_RATE=$(ffmpeg -i "$file" 2>&1 | sed -n -e 's/^.*bitrate: //p' | sed -r 's#([0-9]+)\skb/s#\1#')
        echo; echo "$BIT_RATE"

        SRC_FILE="$file"
        NEW_FILE="${file%.*}.mkv"

        if   (( BIT_RATE > 950 )); then CFR='26'
        elif (( BIT_RATE > 750 )); then CFR='24'
        elif (( BIT_RATE > 500 )); then CFR='22'
        else CFR='18'; fi

        echo "$CFR";

        # Remove the leading echo below in order to do the actions
        echo ffmpeg -i "$SRC_FILE" -c:v libx265 -crf "$CFR" -c:a libopus -b:a 48k -vbr on -compression_level 10 -frame_duration 60 -application audio "$NEW_FILE"
        echo mv "$NEW_FILE" ~/ffmpeg/hevc/
        echo rm -f -- "$SRC_FILE"
done
2
ответ дан 30 July 2020 в 22:03

Другие вопросы по тегам:

Похожие вопросы: