diff --git a/scripts/estimate_fg.sh b/scripts/estimate_fg.sh old mode 100644 new mode 100755 index aea1909..5dbe457 --- a/scripts/estimate_fg.sh +++ b/scripts/estimate_fg.sh @@ -1,45 +1,73 @@ #!/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() { ffmpeg -i "$1" 2>&1 | grep "Duration" | awk '{print $2}' | tr -d , } -INPUT="bebop.mkv" +segment_video() { + # set number of segments and start times + SEGMENT_PERCENTAGE=$((100 / SEGMENTS)) + SEGMENT=$SEGMENT_PERCENTAGE + START_TIMES=() + while [[ $SEGMENT -lt 100 ]] + do + START_TIME="$(echo "$SEGMENT * $TOTAL_SECONDS / 100" | bc)" + START_TIMES+=("$START_TIME") + SEGMENT=$((SEGMENT + SEGMENT_PERCENTAGE)) + done + + # split up video into segments based on start times + rm -rf "$SEGMENT_DIR" + mkdir -p "$SEGMENT_DIR" + for INDEX in "${!START_TIMES[@]}" + do + # don't concatenate the last segment + if [[ $((INDEX + 1)) == "${#START_TIMES[@]}" ]]; then + break + fi + START_TIME="${START_TIMES[$INDEX]}" + OUTPUT_SEGMENT="$SEGMENT_DIR/segment_$INDEX.mkv" + echo "START_TIME: $START_TIME" + 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" + done + + # ffmpeg -f concat -safe 0 -i "$SEGMENTS_LIST" -hide_banner -loglevel error -c copy "$OUTPUT_CONCAT" +} -DURATION="$(get_duration "$INPUT")" -TOTAL_SECONDS="$(echo "$DURATION" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')" -echo "TOTAL_SECONDS: $TOTAL_SECONDS" +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 -# set number of segments and start times -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_TIMES+=("$START_TIME") - SEGMENT=$((SEGMENT + SEGMENT_PERCENTAGE)) -done - -# split up video into segments based on start times -SEGMENT_TIME=1 -SEGMENT_DIR='./tmp/fg_segments' -SEGMENTS_LIST="$SEGMENT_DIR/segments_list.txt" -OUTPUT_CONCAT="$SEGMENT_DIR/concatenated.mkv" -rm -rf "$SEGMENT_DIR" -mkdir -p "$SEGMENT_DIR" -for INDEX in "${!START_TIMES[@]}" -do - # don't concatenate the last segment - if [[ $((INDEX + 1)) == "${#START_TIMES[@]}" ]]; then - break - fi - START_TIME="${START_TIMES[$INDEX]}" - OUTPUT_SEGMENT="$SEGMENT_DIR/segment_$INDEX.mkv" - 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" - echo "file '$(basename "$OUTPUT_SEGMENT")'" >> "$SEGMENTS_LIST" -done - -ffmpeg -f concat -safe 0 -i "$SEGMENTS_LIST" -hide_banner -loglevel error -c copy "$OUTPUT_CONCAT" + clear + cat "$GRAIN_LOG" +} diff --git a/scripts/recc_encode.sh b/scripts/recc_encode.sh index dad707d..5fb61f6 100755 --- a/scripts/recc_encode.sh +++ b/scripts/recc_encode.sh @@ -17,18 +17,27 @@ encode() { UNMAP=$(unmap_streams "$INPUT") AUDIO_FORMAT='-af "aformat=channel_layouts=7.1|5.1|stereo|mono" -c:a libopus' 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' + 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 -e ffmpeg -i \""$INPUT"\" -map 0 $UNMAP \ $AUDIO_FORMAT $NL $AUDIO_BITRATE \ + $ADD_METADATA $NL \ "$FFMPEG_PARAMS" -dolbyvision 1 -svtav1-params \ $NL "\"$SVT_PARAMS\" \"$OUTPUT\" ||" $NL \ ffmpeg -i \""$INPUT"\" -map 0 $UNMAP \ $AUDIO_FORMAT $NL $AUDIO_BITRATE \ + $ADD_METADATA $NL \ "$FFMPEG_PARAMS" -svtav1-params \ - $NL "\"$SVT_PARAMS\" \"$OUTPUT\"" >> "$ENCODE_FILE" + $NL "\"$SVT_PARAMS\" \"$OUTPUT\" || exit 1" >> "$ENCODE_FILE" if [[ "$EXT" == "mkv" ]]; then echo "mkvpropedit \"$OUTPUT\" --add-track-statistics-tags" >> "$ENCODE_FILE"