versioning

This commit is contained in:
2024-06-15 16:28:11 -05:00
parent 8c399e9f76
commit 65923b0fc9
2 changed files with 76 additions and 39 deletions

80
scripts/estimate_fg.sh Normal file → Executable file
View 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"
}

View File

@@ -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"