15.10.2019, 17:02
Gelegentlich findet man im Internet mp3-Files, bei denen das Audio-Signal offenbar an einigen Stellen den Maximal-Pegel überschritten hatte und dort verzerrt wiedergegeben wird. Bei Betrachtung mit einem Audio-Editor erscheint das Signal da abgeschnitten.
Übersteuerte mp3-Files gibt es in zwei Varianten:
1. mit tatsächlich bereits geclippten Daten
2. mit noch völlig intakten Daten im File.
An Variante 1 ist nichts mehr zu reparieren.
Bei Variante 2 werden die Daten erst bei Standard-Wiedergabe im 16 Bit Integer Format über das Sound-Interface geclippt, was die typischen Verzerrungen erzeugt.
Das läßt sich jedoch verhindern dadurch, daß man die Daten vorher ausreichend runterskaliert. Das ist möglich, ohne die mp3-Codierung ansonsten zu verändern, also ohne zusätzliche Qualitäts-Verluste durch erneute Codierung, weil jeder Datenblock im File einen Skalierungsfaktor in Form eines Bytes enthält, über den der Ausgabe-Pegel der im Gleitkomma-Format rekostruierten Daten in ~1.5 dB Stufen verändert werden kann, bevor sie zur Standard-Ausgabe mit dem Sound-Interface in 16 Bit Integer umgewandelt werden.
Diese Faktoren benutzt zB das Programm mp3DirectCut zur "Normalisierung" der Daten.
Wenn man weiß, welchen Spitzenpegel das Audio-Signal in einem mp3-File vor Ausgabe annimmt, kann man durch Umskalierung um entsprechend viele 1.5 dB-Stufen ein Clippen bei der Ausgabe vermeiden.
mp3DirectCut schaut nur auf die 16 Bit Integer Daten der Standard-Ausgabe und zeigt deshalb bei einem übersteuerten mp3-File immer nur 0 dB an.
Den wahren Spitzenpegel kann man sich zB mit den beiden folgenden Methoden verschaffen:
1. den File in Audacity laden. Audacity tut das in der Default-Einstellung, wenn es möglich ist, im Gleitkomma-Format, also ohne die Umwandlung ins Integer-Format mit Clippen bei 0 dB.
Hat man in der englischen Version unter "View"->"Show clipping" letzteres aktiviert, werden die übersteuerten Bereiche rot markiert.
Geht man auf "Effect"->"Amplify", wird im auf-poppenden Window bei "Amplification (dB)" der Wert angezeigt, den man anwenden müßte, um den Spitzenpegel auf 0 dB zu bringen. Wenn der Spitzenpegel bei +6dB liegt, werden also -6 dB angezeigt.
Nun kann man Audacity wieder verlassen, denn Anwendung und Speicherung als mp3-File würden hier durch Multiplikation der Gleitkomma-Daten mit einem geeigneten Faktor und erneute mp3-Codierung erfolgen.
Stattdessen könnte man jetzt mp3DirectCut aufrufen, unter "Edit"->"Normalize" manuell mit dem Schieber -6 oder -7.5 dB einstellen und ausführen lassen. Das Programm ändert dann nur die Skalenfaktoren und speichert den mp3-File ansonsten unverändert ab. Danach kann man ihn ohne Clipp-Verzerrungen abspielen.
2. Wenn man das ffmpeg-Paket installiert hat (das benötigt zB Audacity, um weniger gebräuchliche Audio-Formate lesen & schreiben zu können), dann kann man mit folgendem Befehl Spitzenwerte (und anderes mehr) aller implementierten Formate anzeigen lassen (Windows):
<ffmpeg_Pfad>ffmpeg -y -i <File_Name> -af astats -f null NUL
Bequemerweise schreibt man das in einen Batch-File (*.bat) so
<ffmpeg_Pfad>ffmpeg -y -i %1 -af astats -f null NUL
, darin steht %1 für den File-Namen, den man dem Batch-File als (ersten) Parameter mitgibt.
ffmpeg wirft dann eine lange Liste von statistischen Daten zum File aus, in der auch der/die Spitzenpegel enthalten sind.
Man kann natürlich auch einen mp3-Decoder verwenden, der Gleitkomma-Daten ausgibt, oder zumindest deren Spitzen-pegel meldet.
Als Beispiel habe ich mit Audacity ein 8 s langes Stereo-Test-Signal erzeugt (mit 48 kS/s), das im einen Kanal einen 440 Hz Ton mit von 1 (=0dB) auf 0 abnehmender (normierter) Amplitude enthält, im zweiten Kanal einen 1 kHz Ton, der von 0 auf 1 ansteigt.
Dieses Signal habe ich zunächst als WAV-File mit 16 Bit Integer PCM Inhalt gespeichert. Dann habe ich das Signal um 6 dB verstärkt und als mp3-File exportiert mit den Einstellungen
Bit Rate Mode: Variable
Quality: 0 (Best Quality)
Variable Speed: Fast
Channel Mode: Joint Stereo
Unter "Variable Speed" gibt es auch noch "Standard". Damit wird stärkere Daten-Reduktion bei geringerer mittlerer Bitrate (und Qualität) erzwungen.
Alternativ dazu habe ich den WAV-File direkt mit Lame in mp3 gewandelt mit dem Befehl
<Lame_Pfad>lame -h -V0 --resample 48 --verbose --scale 2 <wav-file> <mp3-file>
Der Parameter "--scale 2" bewirkt, daß lame die Daten mit 2 multipliziert, also um ~6 dB anhebt, bevor sie zu mp3 gewandelt werden.
Der wav-File ist übrigens 1.501 kB groß,
der von lame erzeugte mp3-File hat 252 kB, mittlere Bitrate 255 kb/s
der von Audacity erzeugte mp3-File 191 kB, 193 kb/s (Standard: 134 kB, 136 kb/s).
Daran sieht man, daß Audacity doch nicht "Best Quality" erzeugt mit der "Fast" Einstellung.
Lädt man die beiden mp3-Files erneut in Audacity, wird nach der oben beschriebenen Methode für den selbst erzeugten File ein Spitzen-Pegel von knapp +0.2 dB angezeigt, für den mit Lame erzeugten File werden 6 dB gemeldet.
Der erste Sreenshot aus Audacity
zeigt oben den mit lame erzeugten mp3-File, darunter den mit Audacity erzeugten.
Nach "Verstärkung" beider Files mit -6.025 dB sieht das so aus
Unnötigerweise clippt Audacity offenbar die selbst erzeugten mp3-Files bei ~0dB.
Der obere File sieht aus wie der originale WAV-File (von der bei der mp3-Wandlung erzeugten Verzögerung am Anfang mal abgesehen).
Den mit lame erzeugten "übersteuerten" mp3-File kann man nach der oben beschriebenen Methode für unverzerrte Wiedergabe reparieren.
Ohne das klingen beide Versionen bei Wiedergabe mit dem Windows-Media-Player (oder einem anden Tool) gleich verzerrt.
Im Anhang befinden sich die beiden mp3-Files zum Ausprobieren.
Das gleiche Umskalierungsverfahren läßt sich bei AAC-Files anwenden.
MfG Kai
Übersteuerte mp3-Files gibt es in zwei Varianten:
1. mit tatsächlich bereits geclippten Daten
2. mit noch völlig intakten Daten im File.
An Variante 1 ist nichts mehr zu reparieren.
Bei Variante 2 werden die Daten erst bei Standard-Wiedergabe im 16 Bit Integer Format über das Sound-Interface geclippt, was die typischen Verzerrungen erzeugt.
Das läßt sich jedoch verhindern dadurch, daß man die Daten vorher ausreichend runterskaliert. Das ist möglich, ohne die mp3-Codierung ansonsten zu verändern, also ohne zusätzliche Qualitäts-Verluste durch erneute Codierung, weil jeder Datenblock im File einen Skalierungsfaktor in Form eines Bytes enthält, über den der Ausgabe-Pegel der im Gleitkomma-Format rekostruierten Daten in ~1.5 dB Stufen verändert werden kann, bevor sie zur Standard-Ausgabe mit dem Sound-Interface in 16 Bit Integer umgewandelt werden.
Diese Faktoren benutzt zB das Programm mp3DirectCut zur "Normalisierung" der Daten.
Wenn man weiß, welchen Spitzenpegel das Audio-Signal in einem mp3-File vor Ausgabe annimmt, kann man durch Umskalierung um entsprechend viele 1.5 dB-Stufen ein Clippen bei der Ausgabe vermeiden.
mp3DirectCut schaut nur auf die 16 Bit Integer Daten der Standard-Ausgabe und zeigt deshalb bei einem übersteuerten mp3-File immer nur 0 dB an.
Den wahren Spitzenpegel kann man sich zB mit den beiden folgenden Methoden verschaffen:
1. den File in Audacity laden. Audacity tut das in der Default-Einstellung, wenn es möglich ist, im Gleitkomma-Format, also ohne die Umwandlung ins Integer-Format mit Clippen bei 0 dB.
Hat man in der englischen Version unter "View"->"Show clipping" letzteres aktiviert, werden die übersteuerten Bereiche rot markiert.
Geht man auf "Effect"->"Amplify", wird im auf-poppenden Window bei "Amplification (dB)" der Wert angezeigt, den man anwenden müßte, um den Spitzenpegel auf 0 dB zu bringen. Wenn der Spitzenpegel bei +6dB liegt, werden also -6 dB angezeigt.
Nun kann man Audacity wieder verlassen, denn Anwendung und Speicherung als mp3-File würden hier durch Multiplikation der Gleitkomma-Daten mit einem geeigneten Faktor und erneute mp3-Codierung erfolgen.
Stattdessen könnte man jetzt mp3DirectCut aufrufen, unter "Edit"->"Normalize" manuell mit dem Schieber -6 oder -7.5 dB einstellen und ausführen lassen. Das Programm ändert dann nur die Skalenfaktoren und speichert den mp3-File ansonsten unverändert ab. Danach kann man ihn ohne Clipp-Verzerrungen abspielen.
2. Wenn man das ffmpeg-Paket installiert hat (das benötigt zB Audacity, um weniger gebräuchliche Audio-Formate lesen & schreiben zu können), dann kann man mit folgendem Befehl Spitzenwerte (und anderes mehr) aller implementierten Formate anzeigen lassen (Windows):
<ffmpeg_Pfad>ffmpeg -y -i <File_Name> -af astats -f null NUL
Bequemerweise schreibt man das in einen Batch-File (*.bat) so
<ffmpeg_Pfad>ffmpeg -y -i %1 -af astats -f null NUL
, darin steht %1 für den File-Namen, den man dem Batch-File als (ersten) Parameter mitgibt.
ffmpeg wirft dann eine lange Liste von statistischen Daten zum File aus, in der auch der/die Spitzenpegel enthalten sind.
Man kann natürlich auch einen mp3-Decoder verwenden, der Gleitkomma-Daten ausgibt, oder zumindest deren Spitzen-pegel meldet.
Als Beispiel habe ich mit Audacity ein 8 s langes Stereo-Test-Signal erzeugt (mit 48 kS/s), das im einen Kanal einen 440 Hz Ton mit von 1 (=0dB) auf 0 abnehmender (normierter) Amplitude enthält, im zweiten Kanal einen 1 kHz Ton, der von 0 auf 1 ansteigt.
Dieses Signal habe ich zunächst als WAV-File mit 16 Bit Integer PCM Inhalt gespeichert. Dann habe ich das Signal um 6 dB verstärkt und als mp3-File exportiert mit den Einstellungen
Bit Rate Mode: Variable
Quality: 0 (Best Quality)
Variable Speed: Fast
Channel Mode: Joint Stereo
Unter "Variable Speed" gibt es auch noch "Standard". Damit wird stärkere Daten-Reduktion bei geringerer mittlerer Bitrate (und Qualität) erzwungen.
Alternativ dazu habe ich den WAV-File direkt mit Lame in mp3 gewandelt mit dem Befehl
<Lame_Pfad>lame -h -V0 --resample 48 --verbose --scale 2 <wav-file> <mp3-file>
Der Parameter "--scale 2" bewirkt, daß lame die Daten mit 2 multipliziert, also um ~6 dB anhebt, bevor sie zu mp3 gewandelt werden.
Der wav-File ist übrigens 1.501 kB groß,
der von lame erzeugte mp3-File hat 252 kB, mittlere Bitrate 255 kb/s
der von Audacity erzeugte mp3-File 191 kB, 193 kb/s (Standard: 134 kB, 136 kb/s).
Daran sieht man, daß Audacity doch nicht "Best Quality" erzeugt mit der "Fast" Einstellung.
Lädt man die beiden mp3-Files erneut in Audacity, wird nach der oben beschriebenen Methode für den selbst erzeugten File ein Spitzen-Pegel von knapp +0.2 dB angezeigt, für den mit Lame erzeugten File werden 6 dB gemeldet.
Der erste Sreenshot aus Audacity
zeigt oben den mit lame erzeugten mp3-File, darunter den mit Audacity erzeugten.
Nach "Verstärkung" beider Files mit -6.025 dB sieht das so aus
Unnötigerweise clippt Audacity offenbar die selbst erzeugten mp3-Files bei ~0dB.
Der obere File sieht aus wie der originale WAV-File (von der bei der mp3-Wandlung erzeugten Verzögerung am Anfang mal abgesehen).
Den mit lame erzeugten "übersteuerten" mp3-File kann man nach der oben beschriebenen Methode für unverzerrte Wiedergabe reparieren.
Ohne das klingen beide Versionen bei Wiedergabe mit dem Windows-Media-Player (oder einem anden Tool) gleich verzerrt.
Im Anhang befinden sich die beiden mp3-Files zum Ausprobieren.
Das gleiche Umskalierungsverfahren läßt sich bei AAC-Files anwenden.
MfG Kai