Add discompress
This commit is contained in:
parent
5c8ad98bb5
commit
ce12e90225
|
|
@ -0,0 +1,82 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Re-encode a video to a target size in MB.
|
||||
# Example:
|
||||
# ./this_script.sh video.mp4 15
|
||||
|
||||
T_SIZE="$2" # target size in MB
|
||||
T_FILE="${1%.*}-$2MB.mp4" # filename out
|
||||
|
||||
# Original duration in seconds
|
||||
O_DUR=$(\
|
||||
ffprobe \
|
||||
-v error \
|
||||
-show_entries format=duration \
|
||||
-of csv=p=0 "$1")
|
||||
|
||||
# Original audio rate
|
||||
O_ARATE=$(\
|
||||
ffprobe \
|
||||
-v error \
|
||||
-select_streams a:0 \
|
||||
-show_entries stream=bit_rate \
|
||||
-of csv=p=0 "$1")
|
||||
|
||||
# Original audio rate in KiB/s
|
||||
O_ARATE=$(\
|
||||
awk \
|
||||
-v arate="$O_ARATE" \
|
||||
'BEGIN { printf "%.0f", (arate / 1024) }')
|
||||
|
||||
# Target size is required to be less than the size of the original audio stream
|
||||
T_MINSIZE=$(\
|
||||
awk \
|
||||
-v arate="$O_ARATE" \
|
||||
-v duration="$O_DUR" \
|
||||
'BEGIN { printf "%.2f", ( (arate * duration) / 8192 ) }')
|
||||
|
||||
# Equals 1 if target size is ok, 0 otherwise
|
||||
IS_MINSIZE=$(\
|
||||
awk \
|
||||
-v size="$T_SIZE" \
|
||||
-v minsize="$T_MINSIZE" \
|
||||
'BEGIN { print (minsize < size) }')
|
||||
|
||||
# Give useful information if size is too small
|
||||
if [[ $IS_MINSIZE -eq 0 ]]; then
|
||||
printf "%s\n" "Target size ${T_SIZE}MB is too small!" >&2
|
||||
printf "%s %s\n" "Try values larger than" "${T_MINSIZE}MB" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Set target audio bitrate
|
||||
T_ARATE=$O_ARATE
|
||||
|
||||
|
||||
# Calculate target video rate - MB -> KiB/s
|
||||
T_VRATE=$(\
|
||||
awk \
|
||||
-v size="$T_SIZE" \
|
||||
-v duration="$O_DUR" \
|
||||
-v audio_rate="$O_ARATE" \
|
||||
'BEGIN { print ( ( size * 8192.0 ) / ( 1.048576 * duration ) - audio_rate) }')
|
||||
|
||||
# Perform the conversion
|
||||
ffmpeg \
|
||||
-y \
|
||||
-i "$1" \
|
||||
-c:v libx264 \
|
||||
-b:v "$T_VRATE"k \
|
||||
-pass 1 \
|
||||
-an \
|
||||
-f mp4 \
|
||||
/dev/null \
|
||||
&& \
|
||||
ffmpeg \
|
||||
-i "$1" \
|
||||
-c:v libx264 \
|
||||
-b:v "$T_VRATE"k \
|
||||
-pass 2 \
|
||||
-c:a aac \
|
||||
-b:a "$T_ARATE"k \
|
||||
$T_FILE
|
||||
Loading…
Reference in New Issue