mirror of
https://github.com/levogevo/ffmpeg-av1-builder.git
synced 2026-01-15 16:56:18 +00:00
versioning
This commit is contained in:
80
scripts/estimate_fg.sh
Normal file → Executable file
80
scripts/estimate_fg.sh
Normal file → Executable file
@@ -1,36 +1,40 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# global variables
|
||||||
|
INPUT="bebop.mkv"
|
||||||
|
SEGMENTS=10
|
||||||
|
SEGMENT_TIME=3
|
||||||
|
DURATION="$(get_duration "$INPUT")"
|
||||||
|
TOTAL_SECONDS="$(echo "$DURATION" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')"
|
||||||
|
SEGMENT_DIR='/tmp/fg_segments'
|
||||||
|
SEGMENTS_LIST="$SEGMENT_DIR/segments_list.txt"
|
||||||
|
OUTPUT_CONCAT="$SEGMENT_DIR/concatenated.mkv"
|
||||||
|
TEST_MIN_GRAIN=0
|
||||||
|
TEST_MAX_GRAIN=30
|
||||||
|
GRAIN_STEP=5
|
||||||
|
GRAIN_LOG="grain_log.txt"
|
||||||
|
|
||||||
get_duration() {
|
get_duration() {
|
||||||
ffmpeg -i "$1" 2>&1 | grep "Duration" | awk '{print $2}' | tr -d ,
|
ffmpeg -i "$1" 2>&1 | grep "Duration" | awk '{print $2}' | tr -d ,
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT="bebop.mkv"
|
segment_video() {
|
||||||
|
# set number of segments and start times
|
||||||
DURATION="$(get_duration "$INPUT")"
|
SEGMENT_PERCENTAGE=$((100 / SEGMENTS))
|
||||||
TOTAL_SECONDS="$(echo "$DURATION" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')"
|
SEGMENT=$SEGMENT_PERCENTAGE
|
||||||
echo "TOTAL_SECONDS: $TOTAL_SECONDS"
|
START_TIMES=()
|
||||||
|
while [[ $SEGMENT -lt 100 ]]
|
||||||
# set number of segments and start times
|
do
|
||||||
SEGMENTS=9
|
|
||||||
SEGMENT_PERCENTAGE=$((100 / SEGMENTS))
|
|
||||||
SEGMENT=$SEGMENT_PERCENTAGE
|
|
||||||
START_TIMES=()
|
|
||||||
while [[ $SEGMENT -lt 100 ]]
|
|
||||||
do
|
|
||||||
START_TIME="$(echo "$SEGMENT * $TOTAL_SECONDS / 100" | bc)"
|
START_TIME="$(echo "$SEGMENT * $TOTAL_SECONDS / 100" | bc)"
|
||||||
START_TIMES+=("$START_TIME")
|
START_TIMES+=("$START_TIME")
|
||||||
SEGMENT=$((SEGMENT + SEGMENT_PERCENTAGE))
|
SEGMENT=$((SEGMENT + SEGMENT_PERCENTAGE))
|
||||||
done
|
done
|
||||||
|
|
||||||
# split up video into segments based on start times
|
# split up video into segments based on start times
|
||||||
SEGMENT_TIME=1
|
rm -rf "$SEGMENT_DIR"
|
||||||
SEGMENT_DIR='./tmp/fg_segments'
|
mkdir -p "$SEGMENT_DIR"
|
||||||
SEGMENTS_LIST="$SEGMENT_DIR/segments_list.txt"
|
for INDEX in "${!START_TIMES[@]}"
|
||||||
OUTPUT_CONCAT="$SEGMENT_DIR/concatenated.mkv"
|
do
|
||||||
rm -rf "$SEGMENT_DIR"
|
|
||||||
mkdir -p "$SEGMENT_DIR"
|
|
||||||
for INDEX in "${!START_TIMES[@]}"
|
|
||||||
do
|
|
||||||
# don't concatenate the last segment
|
# don't concatenate the last segment
|
||||||
if [[ $((INDEX + 1)) == "${#START_TIMES[@]}" ]]; then
|
if [[ $((INDEX + 1)) == "${#START_TIMES[@]}" ]]; then
|
||||||
break
|
break
|
||||||
@@ -38,8 +42,32 @@ do
|
|||||||
START_TIME="${START_TIMES[$INDEX]}"
|
START_TIME="${START_TIMES[$INDEX]}"
|
||||||
OUTPUT_SEGMENT="$SEGMENT_DIR/segment_$INDEX.mkv"
|
OUTPUT_SEGMENT="$SEGMENT_DIR/segment_$INDEX.mkv"
|
||||||
echo "START_TIME: $START_TIME"
|
echo "START_TIME: $START_TIME"
|
||||||
ffmpeg -ss "$START_TIME" -i "$INPUT" -hide_banner -loglevel error -t "$SEGMENT_TIME" -map 0:0 -c copy "$OUTPUT_SEGMENT"
|
ffmpeg -ss "$START_TIME" -i "$INPUT" \
|
||||||
|
-hide_banner -loglevel error -t "$SEGMENT_TIME" \
|
||||||
|
-map 0:0 -reset_timestamps 1 -c copy "$OUTPUT_SEGMENT"
|
||||||
echo "file '$(basename "$OUTPUT_SEGMENT")'" >> "$SEGMENTS_LIST"
|
echo "file '$(basename "$OUTPUT_SEGMENT")'" >> "$SEGMENTS_LIST"
|
||||||
done
|
done
|
||||||
|
|
||||||
ffmpeg -f concat -safe 0 -i "$SEGMENTS_LIST" -hide_banner -loglevel error -c copy "$OUTPUT_CONCAT"
|
# ffmpeg -f concat -safe 0 -i "$SEGMENTS_LIST" -hide_banner -loglevel error -c copy "$OUTPUT_CONCAT"
|
||||||
|
}
|
||||||
|
|
||||||
|
encode_segments() {
|
||||||
|
cd "$SEGMENT_DIR" || exit
|
||||||
|
clear
|
||||||
|
echo > "$GRAIN_LOG"
|
||||||
|
for VIDEO in $(ls segment*.mkv)
|
||||||
|
do
|
||||||
|
echo "$VIDEO" >> "$GRAIN_LOG"
|
||||||
|
for GRAIN in $(seq $TEST_MIN_GRAIN $GRAIN_STEP $TEST_MAX_GRAIN)
|
||||||
|
do
|
||||||
|
OUTPUT_VIDEO="encoded_$VIDEO"
|
||||||
|
encode -i "$VIDEO" -g $GRAIN "$OUTPUT_VIDEO"
|
||||||
|
BITRATE="$(mediainfo "$OUTPUT_VIDEO" | tr -s ' ' | grep 'Bit rate : ' | cut -d':' -f2)"
|
||||||
|
echo -e "\tgrain: $GRAIN, bitrate:$BITRATE" >> "$GRAIN_LOG"
|
||||||
|
done
|
||||||
|
echo >> "$GRAIN_LOG"
|
||||||
|
done
|
||||||
|
|
||||||
|
clear
|
||||||
|
cat "$GRAIN_LOG"
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,18 +17,27 @@ encode() {
|
|||||||
UNMAP=$(unmap_streams "$INPUT")
|
UNMAP=$(unmap_streams "$INPUT")
|
||||||
AUDIO_FORMAT='-af "aformat=channel_layouts=7.1|5.1|stereo|mono" -c:a libopus'
|
AUDIO_FORMAT='-af "aformat=channel_layouts=7.1|5.1|stereo|mono" -c:a libopus'
|
||||||
AUDIO_BITRATE=$(get_bitrate_audio "$INPUT")
|
AUDIO_BITRATE=$(get_bitrate_audio "$INPUT")
|
||||||
FFMPEG_PARAMS='-y -c:s copy -c:V libsvtav1 -pix_fmt yuv420p10le -crf 25 -preset 3 -g 240'
|
VIDEO_ENCODER="libsvtav1"
|
||||||
|
VIDEO_PARAMS="-pix_fmt yuv420p10le -crf 25 -preset 3 -g 240"
|
||||||
|
FFMPEG_PARAMS="-y -c:s copy -c:V $VIDEO_ENCODER $VIDEO_PARAMS"
|
||||||
NL=' \\\n\t'
|
NL=' \\\n\t'
|
||||||
|
|
||||||
|
FFMPEG_VERSION="$(ffmpeg -version 2>&1 | grep version | cut -d' ' -f1-3)"
|
||||||
|
VIDEO_ENC_VERSION="$(ldd $(which ffmpeg) | grep -i "$VIDEO_ENCODER" | cut -d' ' -f3 | xargs readlink)"
|
||||||
|
AUDIO_ENC_VERSION="$(ldd $(which ffmpeg) | grep -i libopus | cut -d' ' -f3 | xargs readlink)"
|
||||||
|
ADD_METADATA="-metadata encoding_params=\"$FFMPEG_VERSION $AUDIO_ENC_VERSION $VIDEO_ENC_VERSION $VIDEO_PARAMS $SVT_PARAMS\""
|
||||||
|
|
||||||
echo '#!/bin/bash' > "$ENCODE_FILE"
|
echo '#!/bin/bash' > "$ENCODE_FILE"
|
||||||
echo -e ffmpeg -i \""$INPUT"\" -map 0 $UNMAP \
|
echo -e ffmpeg -i \""$INPUT"\" -map 0 $UNMAP \
|
||||||
$AUDIO_FORMAT $NL $AUDIO_BITRATE \
|
$AUDIO_FORMAT $NL $AUDIO_BITRATE \
|
||||||
|
$ADD_METADATA $NL \
|
||||||
"$FFMPEG_PARAMS" -dolbyvision 1 -svtav1-params \
|
"$FFMPEG_PARAMS" -dolbyvision 1 -svtav1-params \
|
||||||
$NL "\"$SVT_PARAMS\" \"$OUTPUT\" ||" $NL \
|
$NL "\"$SVT_PARAMS\" \"$OUTPUT\" ||" $NL \
|
||||||
ffmpeg -i \""$INPUT"\" -map 0 $UNMAP \
|
ffmpeg -i \""$INPUT"\" -map 0 $UNMAP \
|
||||||
$AUDIO_FORMAT $NL $AUDIO_BITRATE \
|
$AUDIO_FORMAT $NL $AUDIO_BITRATE \
|
||||||
|
$ADD_METADATA $NL \
|
||||||
"$FFMPEG_PARAMS" -svtav1-params \
|
"$FFMPEG_PARAMS" -svtav1-params \
|
||||||
$NL "\"$SVT_PARAMS\" \"$OUTPUT\"" >> "$ENCODE_FILE"
|
$NL "\"$SVT_PARAMS\" \"$OUTPUT\" || exit 1" >> "$ENCODE_FILE"
|
||||||
|
|
||||||
if [[ "$EXT" == "mkv" ]]; then
|
if [[ "$EXT" == "mkv" ]]; then
|
||||||
echo "mkvpropedit \"$OUTPUT\" --add-track-statistics-tags" >> "$ENCODE_FILE"
|
echo "mkvpropedit \"$OUTPUT\" --add-track-statistics-tags" >> "$ENCODE_FILE"
|
||||||
|
|||||||
Reference in New Issue
Block a user