mirror of
https://github.com/levogevo/ffmpeg-av1-builder.git
synced 2026-01-15 16:56:18 +00:00
use max N to encode for film grain
This commit is contained in:
@@ -118,21 +118,22 @@ check_bitrate_bounds() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# global variables
|
# global variables
|
||||||
SEGMENTS=15
|
SEGMENTS=30
|
||||||
SEGMENT_TIME=3
|
SEGMENT_TIME=3
|
||||||
MAX_SEGMENTS=6
|
MAX_SEGMENTS=5
|
||||||
TOTAL_SECONDS="$(get_duration "$INPUT")"
|
TOTAL_SECONDS="$(get_duration "$INPUT")"
|
||||||
INPUT_BITRATE="$(get_avg_bitrate "$INPUT")"
|
# INPUT_BITRATE="$(get_avg_bitrate "$INPUT")"
|
||||||
CLEAN_INP_NAME="$(echo "$INPUT" | tr ' ' '.' | tr -d '{}[]+')"
|
CLEAN_INP_NAME="$(echo "$INPUT" | tr ' ' '.' | tr -d '{}[]+')"
|
||||||
SEGMENT_DIR="/tmp/${CLEAN_INP_NAME}/fg_segments"
|
SEGMENT_DIR="/tmp/${CLEAN_INP_NAME}/fg_segments"
|
||||||
|
SEGMENT_BITRATE_LIST="$SEGMENT_DIR/segment_bitrates.txt"
|
||||||
SEGMENTS_LIST="$SEGMENT_DIR/segments_list.txt"
|
SEGMENTS_LIST="$SEGMENT_DIR/segments_list.txt"
|
||||||
OUTPUT_CONCAT="$SEGMENT_DIR/concatenated.mkv"
|
# OUTPUT_CONCAT="$SEGMENT_DIR/concatenated.mkv"
|
||||||
OPTS_HASH="$(echo "${LOW_GRAIN}${STEP_GRAIN}${HIGH_GRAIN}" | sha256sum | tr -d ' ' | cut -d'-' -f1)"
|
OPTS_HASH="$(echo "${LOW_GRAIN}${STEP_GRAIN}${HIGH_GRAIN}" | sha256sum | tr -d ' ' | cut -d'-' -f1)"
|
||||||
GRAIN_LOG="$SEGMENT_DIR/grain_log-${OPTS_HASH}.txt"
|
GRAIN_LOG="$SEGMENT_DIR/grain_log-${OPTS_HASH}.txt"
|
||||||
|
|
||||||
segment_video() {
|
segment_video() {
|
||||||
# set number of segments and start times
|
# set number of segments and start times
|
||||||
SEGMENT_PERCENTAGE=$((100 / SEGMENTS))
|
SEGMENT_PERCENTAGE=$(echo "100 / $SEGMENTS" | bc)
|
||||||
SEGMENT=$SEGMENT_PERCENTAGE
|
SEGMENT=$SEGMENT_PERCENTAGE
|
||||||
START_TIMES=()
|
START_TIMES=()
|
||||||
while [[ $SEGMENT -lt 100 ]]
|
while [[ $SEGMENT -lt 100 ]]
|
||||||
@@ -146,35 +147,31 @@ segment_video() {
|
|||||||
rm -rf "$SEGMENT_DIR"
|
rm -rf "$SEGMENT_DIR"
|
||||||
mkdir -p "$SEGMENT_DIR"
|
mkdir -p "$SEGMENT_DIR"
|
||||||
NUM_SEGMENTS=0
|
NUM_SEGMENTS=0
|
||||||
|
echo > "$SEGMENT_BITRATE_LIST"
|
||||||
for INDEX in "${!START_TIMES[@]}"
|
for INDEX in "${!START_TIMES[@]}"
|
||||||
do
|
do
|
||||||
# don't concatenate the last segment
|
|
||||||
if [[ $((INDEX + 1)) == "${#START_TIMES[@]}" ]]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
# only encode the max number of segments
|
|
||||||
if [[ $NUM_SEGMENTS == "$MAX_SEGMENTS" ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
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"
|
|
||||||
ffmpeg -ss "$START_TIME" -i "$INPUT" \
|
ffmpeg -ss "$START_TIME" -i "$INPUT" \
|
||||||
-hide_banner -loglevel error -t "$SEGMENT_TIME" \
|
-hide_banner -loglevel error -t "$SEGMENT_TIME" \
|
||||||
-map 0:0 -reset_timestamps 1 -c copy "$OUTPUT_SEGMENT"
|
-map 0:v -reset_timestamps 1 -c copy "$OUTPUT_SEGMENT"
|
||||||
OUTPUT_SEGMENT_BITRATE="$(get_avg_bitrate "$OUTPUT_SEGMENT")"
|
OUTPUT_SEGMENT_BITRATE="$(get_avg_bitrate "$OUTPUT_SEGMENT")"
|
||||||
echo "comparing: $OUTPUT_SEGMENT_BITRATE vs $INPUT_BITRATE"
|
echo "$(get_avg_bitrate "$OUTPUT_SEGMENT"): $OUTPUT_SEGMENT" >> "$SEGMENT_BITRATE_LIST"
|
||||||
CHECK_BOUNDS="$(check_bitrate_bounds "$OUTPUT_SEGMENT_BITRATE" "$INPUT_BITRATE")"
|
|
||||||
if [[ "$CHECK_BOUNDS" == "pass" ]]; then
|
|
||||||
echo "$OUTPUT_SEGMENT is within bitrate bounds"
|
|
||||||
echo "file '$(basename "$OUTPUT_SEGMENT")'" >> "$SEGMENTS_LIST"
|
|
||||||
NUM_SEGMENTS=$((NUM_SEGMENTS + 1))
|
|
||||||
else
|
|
||||||
echo "$OUTPUT_SEGMENT is not within bitrate bounds"
|
|
||||||
rm "$OUTPUT_SEGMENT"
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# remove all but the highest bitrate MAX_SEGMENTS
|
||||||
|
mapfile -t KEEP_SEGMENTS< <(cat "$SEGMENT_BITRATE_LIST" | sort -nr | head -${MAX_SEGMENTS} | tr -d ' ' | cut -d':' -f2)
|
||||||
|
for KEEP in "${KEEP_SEGMENTS[@]}"
|
||||||
|
do
|
||||||
|
mv "$KEEP" "${KEEP}.keep"
|
||||||
|
done
|
||||||
|
rm "$SEGMENT_DIR"/*.mkv
|
||||||
|
for KEEP in "${KEEP_SEGMENTS[@]}"
|
||||||
|
do
|
||||||
|
mv "${KEEP}.keep" "$KEEP"
|
||||||
|
done
|
||||||
|
ls "$SEGMENT_DIR"
|
||||||
|
|
||||||
# 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"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user