-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathverblassen-normalisieren
executable file
·155 lines (127 loc) · 5.24 KB
/
verblassen-normalisieren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/bin/sh
#===============================================================================
# fade-normalize
# verblassen-normalisieren
# Video verblassen und Audiopegel normalisieren
#===============================================================================
# Abhängigkeiten:
# ffmpeg awk grep
#===============================================================================
# Verwendung von Skripten
#===============================================================================
usage()
{
# Wenn das Argument an die Funktion übergeben wird, echo es
[ -z "${1}" ] || echo "! ${1}"
# Hilfe anzeigen
echo "\
# Video verblassen und Audiopegel normalisieren
$(basename "$0") -i eingang.(mp4|mkv|mov|m4v) -d (0.[0-9]|1) -o ausgang.mp4
-d (0.[0-9]|1) : optionales Argument # wenn die Option nicht angegeben wird, ist der Standardwert 0,5
-o ausgang.mp4 : optionales Argument # wenn die Option nicht angegeben ist,
wird standardmäßig Eingabename-normalisiertes-Datum-Uhrzeit verwendet"
exit 2
}
#===============================================================================
# Fehlermeldungen
#===============================================================================
INVALID_OPT_ERR='Ungültige Option:'
REQ_ARG_ERR='erfordert eine Argumentation'
WRONG_ARGS_ERR='falsche Anzahl von Argumenten an Skript übergeben'
#===============================================================================
# Überprüfen Sie die Anzahl der an das Skript übergebenen Argumente
#===============================================================================
[ $# -gt 0 ] || usage "${WRONG_ARGS_ERR}"
#===============================================================================
# getopts Prüfoptionen, die an das Skript übergeben werden
#===============================================================================
while getopts ':i:d:o:h' opt
do
case ${opt} in
i) infile="${OPTARG}";;
d) dur="${OPTARG}";;
o) outfile="${OPTARG}";;
h) usage;;
\?) usage "${INVALID_OPT_ERR} ${OPTARG}" 1>&2;;
:) usage "${INVALID_OPT_ERR} ${OPTARG} ${REQ_ARG_ERR}" 1>&2;;
esac
done
shift $((OPTIND-1))
#===============================================================================
# Variablen
#===============================================================================
# Eingabe, Eingabename und Dateierweiterung
infile_nopath="${infile##*/}"
infile_name="${infile_nopath%.*}"
# Standardwerte für Variablen, falls nicht definiert
outfile_default="${infile_name}-normalized-$(date +"%Y-%m-%d-%H-%M-%S").mp4"
duration_default="0.5"
# Analysedatei drucken
echo '+ Analyzing file with ffmpeg'
# ffmpeg loudnorm erhält Statistiken aus der Datei
normalize=$(ffmpeg \
-hide_banner \
-i "${infile}" \
-af "loudnorm=I=-16:dual_mono=true:TP=-1.5:LRA=11:print_format=summary" \
-f null - 2>&1 | tail -n 12)
# Lesen Sie die Ausgabe von Normalize Zeile für Zeile und speichern Sie sie in Variablen
for line in "${normalize}"; do
measured_I=$(echo "${line}" | awk -F' ' '/Input Integrated:/ {print $3}')
measured_TP=$(echo "${line}" | awk -F' ' '/Input True Peak:/ {print $4}')
measured_LRA=$(echo "${line}" | awk -F' ' '/Input LRA:/ {print $3}')
measured_thresh=$(echo "${line}" | awk -F' ' '/Input Threshold:/ {print $3}')
offset=$(echo "${line}" | awk -F' ' '/Target Offset:/ {print $3}')
done
# Überprüfen Sie, ob der libfdk_aac-Codec installiert ist, falls nicht, greifen Sie auf den aac-Codec zurück
aac_codec="$(ffmpeg -hide_banner -stats -v panic -h encoder=libfdk_aac)"
aac_error="Codec 'libfdk_aac' is not recognized by FFmpeg."
aac_check="$(echo "${aac_codec}" | grep "${aac_error}")"
# Überprüfen Sie die ffmpeg-AAC-Codecs
if [ -z "${aac_check}" ]; then
aac='libfdk_aac' # libfdk_aac-Codec ist installiert
else
aac='aac' # Der libfdk_aac-Codec ist nicht installiert, greifen Sie auf den aac-Codec zurück
fi
#===============================================================================
# Funktionen
#===============================================================================
# Videofunktion
video () {
video_dur=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${infile}" | cut -d\. -f1)
vid_offset=$(echo "${video_dur}-${dur:=${duration_default}}" | bc -l)
ffmpeg \
-hide_banner \
-stats -v panic \
-i "${infile}" \
-filter_complex \
"[0:a] afade=t=in:st=0:d=${dur:=${duration_default}},afade=t=out:st='${vid_offset}':d=${dur:=${duration_default}},
compand=attacks=0:points=-70/-90|-24/-12|0/-6|20/-6,
highpass=f=60,
lowpass=f=13700,
afftdn=nt=w,
adeclick,
deesser,
loudnorm=I=-16:
dual_mono=true:
TP=-1.5:
LRA=11:
measured_I=${measured_I}:
measured_LRA=${measured_LRA}:
measured_TP=${measured_TP}:
measured_thresh=${measured_thresh}:
offset=${offset}:
linear=true:
print_format=summary [audio];
[0:v] fade=t=in:st=0:d=${dur:=${duration_default}},fade=t=out:st='${vid_offset}':d=${dur:=${duration_default}}[video]" \
-map "[video]" -map "[audio]" \
-c:a "${aac}" -ar 44100 \
-c:v libx264 -preset fast \
-profile:v high \
-crf 18 -coder 1 \
-pix_fmt yuv420p \
-movflags +faststart \
-f mp4 \
"${outfile:=${outfile_default}}"
}
# Führen Sie die Videofunktion aus
video "${infile}"