Audiofiles zusammenführen

  • Hallo,

    ich wollte mal fragen ob es zur Funktionsliste auch irgendwo eine Erläuterung gibt?

    Im Moment suche ich die Möglichkeit 3 Audiofiles zu einem zusammen zu führen und mit einem neuen ID3-Tag zu versehen.

    Gruß
    Anna :)

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Die Funktionsliste hatte isch schon gefunden :)

    Ich wollte eher wissen ob es etwas gibt wo steht welche Funktion was macht. Ich fürchte, dass ich da so sonst nicht durchblicke :(


    Habs dank Hilfe gefunden :) Nu steht Anna vor nem Berg :)

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

    Einmal editiert, zuletzt von AnMa (16. September 2013 um 19:32)

  • Hi

    Schau dir in der Hilfe mal das Beispiel zu _BASS_Mixer_StreamAddChannelEx an.


    Allerdings willst du ja vorher noch die Stille wegschneiden und die Files normalisieren.
    Ein Beispiel zum Normalisieren findest du unter "Advanced examples" - halte ich für den Anfang aber zu kompliziert!

    Wenn ich Zeit hab, kann ich dir eine angepasste Beispielfunktion schreiben...

    E

  • Eine Frage noch:

    Soll die Lautstärke dynamisch angepasst werden?
    Also kommt es vor, dass ein langer Beitrag in der Lautstärke variiert und soll ausgeglichen werden, oder sind die Beiträge schon gut produziert und müssen/dürfen nur als gesammtes normalisiert werden?

    Sind Sprachbeiträge eigentlich schon komprimiert?

    E

  • Huch, habe jetzt erst gesehen, dass du geschrieben hattest :)

    Also das normalisieren konnte ich jetzt schon vorab über mp3Gain lösen und das scheint soweit auch gut zu funktionieren. Wobei es sicherlich qualitativ bessere Methoden gibt.


    Ich versuche das mal zu beschreiben.

    Die zwei Audiofiles die von uns seklbst kommen sind auf 89db normalisiert.
    Das dritte Audiofile vom Drittanbieter kann eben sehr variieren. Hier habe ich leider schon Werte von 85 bis 95 bekommen.

    Der letzte Punkt ist, dass jeder Moderator auf seinem System seine eigene Lautstärke hat. Einige haben alles normal auf 89db angepasst, andere arbeiten mit 92 oder 95 db. Über die Einstellungen im Programm lasse ich den Moderator seine gewünschte Lautstärke vorgeben.

    Nachdem also nun alle drei Files neu auf das System geladen wurden, werden sie jetzt auf die vom Moderator eingestelle Lautstärke normalisiert.

    Jetzt sollten die drei Files aneinandergereiht werden und im Idealfall beim Fremdfile noch eventuell vorhandene Leerzeiten weggeschnitten werden.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Ich kann leider mit deinen dB-Angaben nicht viel anfangen.
    Woher hast du diese Werte?


    Bei Audiodateien ist der Maximalpegel = 0dB
    Deshalb gibt es nur dB-Werte <= 0

    Peak ist nicht gleich Lautstärke!
    Mit einem Kompressor kann man die Lautstärke erhöhen und trotzdem die gleichen Peaks wie vorher erreichen.
    Das war bis vor kurzem noch ein Problem beim Rundfunk - die Werbung war viel lauter als der Film, auch wenn beide die gleichen Peak-Spitzen hatten.
    Deshalb steuert man seit kurzem auf Loudness aus. (Machen leider noch nicht alle Sender)

    Das bedeutet allerdings, dass ein unkomprimierter Sound viel höhrere Peaks hat, als ein komprimiertes Signal.
    Aus diesem Grund braucht man genügend Headroom, damit diese Peakspitzen auch nicht einfach abgeschnitten werden.


    Ich hab dir mal eine Funktion geschrieben.

    Sollte in etwa so funktionieren:
    Die Laudstärke von den 3 Dateien wird analysiert.
    Dann der Gainfaktor ausgerechnet, um auf die gewünschte Ziellautstärke zu kommen.

    Bei Main (=Beitrag) wird die Stille am Anfang und Ende weggeschnitten.

    Dann werden die 3 Audios zusammengemischt und abgespeichert.
    Zusätzlich werden die Peakspitzen noch etwas komprimiert.


    Die Ziellautstärke hab ich mit -9dB angegeben - damit bleiben 9 dB Headroom für die Peaks.
    Welcher Wert optimal ist, musst du durch Tests herausfinden.


    $fTH_Silence gibt den Wert an, welcher als Stille erkannt werden soll (Wert 0 = keine Stille wegschneiden)
    $fXFade ist die Zeit in Sekunden zum überblenden der Audios
    $iCompRatio ist der Kompressionsfaktor: Alle Sample, welche über $fdB_Loudness liegen, werden mit dem Faktor iCompRatio:1 komprimiert
    (Wert 1 = keine Kompression)

    Falls diese Meldung kommt: "Achtung: Main Peaks Clipping"
    muss das nicht unbedingt bedeuten, dass es zu einem Clipping kommt, denn die Peaks werden noch komprimiert.
    Falls iCompRatio zu niedrig und dB_Loudness zu hoch, kann es allerdings zu einem hörbaren Clipping kommen!


    Ich hoffe, das war jetzt nicht allzu kompliziert erklärt ;)


    Viel getestet hab ichs nicht - aber probiers einfach mal aus.

    E

  • Code
    Ich hab dir mal eine Funktion geschrieben.

    Öhm .. Mal eben so? :D

    WOW .. Also erstmal eine gefühlte Baffzigmillionen Dank :D
    Ich werdemir das mal in Ruhe durchgehen, aber es ist so genial übersichtlich geschrieben, dass ich beim überfliegen schon fast verstehe was passiert und das ist mir ja wichtig. Ich will ja wissen was ich tue und verstehen.

    nun zu den Db ... Ich habe die Werte aus den Vorgaben von Mp3Gain übernommen, mit diesem Programm normalisieren die meißten ihre Audiofiles. Dabei ist das PRogramm auf der einen Seite absolut OK, aber trotzdem auch zu Recht umstritten. In MP3Gain wird fälschlicher Weise die %-Zahl der Peak-Lautstärke als Db ausgegeben. Das heißt, wenn dort von 89 Db die Rede ist sind das genaugenommen 89% von 100% also -11 Db. Zumindest habe ich das so verstanden.

    Das mit dem Headroom habe ich auch schon versucht so einigen klar zu machen, insbesondere da heute viele Titel schon um die 97% auf die CD's gebrannt werden. :(

    Nochmals vielen Dank für Deine Mühe ...

    Damit wird das Programm vermutlich diese Woche noch in die Beta-Phase gehen können :)

    LG
    Anna

    PS: Ich trau mich garnicht fragen, aber wenn ich das richtig gelesen habe und verstehe, müßte es mit der Bass UDF auch möglich sein Titel, Interpret und aktuelle Hörerzahlen eines Streams auszulesen und in die Gui einzubinden?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • PS: Ich trau mich garnicht fragen, aber wenn ich das richtig gelesen habe und verstehe, müßte es mit der Bass UDF auch möglich sein Titel, Interpret und aktuelle Hörerzahlen eines Streams auszulesen und in die Gui einzubinden?

    Das geht nur, wenn du auch via Bass streamst.

    Das würd ich aber sein lassen und das Streamen einem fertigen Programm überlassen.
    von diesem kannst du evtl. auch die Daten auslesen.

    Bzw. kann man diese Daten nicht auch direkt vom Icecast-Server abrufen?!

    Ich kann mich leider nicht mehr erinnern, wie ich das damals gelöst hab...

  • Den Stream gibt in dem Fall der Sender vor. Insofern geht es darum die entsprechenden Daten aus dem Shoutcast auszulesen

    Ähnlich dem Schema der RadioToolbox.

    Man kann das wohl sicher über IP und Port direkt auslesen, aber ich habe noch nicht gefunden wo und wie.

    Mir kam nur die Idee, da RadioToolbox anscheinend dazu anscheinend die "Bass.dll", "Bass_aac.dll", "Basswma.dll" und die "Bass.Net.dll" verwendet wird.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Also nach knapp 4 Stunden Rechnerei, habe ich bechlossen bis zur klärung der nötigen Formel, die Normalisierung vorläufig noch mit mp3Gain ausführen zu lassen.

    Die Umrechnung der Schallpegeländerung auf eine prozentuale Angabe ist eine harte Nuss.

    Diese nonlineare Berechnung bricht mir gerade das Genick, aber ich bleibe dran.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Zum auslesen von verschiedensten Informationen kannst du auch die ID3 UDFs nutzen. Mal nach googeln, damit sind im englischen Forum zu hauf Programme zum sortieren und herrichten von Musik :)

    Grüße Yaerox

    Grüne Hölle

  • @YaeroxXO: Vielen Dank, ich muß mal sehen ob mir das weiterhilft. Im Moment erschlägt mich das alles etwas :) .... Bin ich ja doch noch eine blutige Anfängern und vermutlichgeh ich eh shon dem ein oder enderen auf den Nerv :D

    Aktuell habe ich noch immer das Problem mit der Normalisierung. Ich muß da Eukalyptus noch mal nerven.

    Wenn ich das was Du geschrieben hast richtig interpretiere, durchlaufen die drei Files zuerst das Soundprocessing (Compressor, Loudness, Clipping), danach werden die 3 Files gemixt und am Ende normalisiert?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Ich komme hier nicht weiter, denn ich erhalte und finde überall unterschiedliche Informationen zu Deci BEL, Schalldruck, Lautstärke und Lautheit usw.

    Mein größtes Problem ist, dass das Programm multibel einsetzbar sein muß.
    Ich rede hier nicht von einer in sich geschlossenen Sendeanstalt wie SWF oder BR3 oder Antenne, sondern eher von den dezentralen Systemen der Webradios.

    Während bei den großen Sendern auf ein Musikarchiv, ein einheitliches Soundprocessing usw. zurück gegriffen wird. Sind beim Web radio doch teils große Unterschiede vorhanden.

    Ich versuche das noch malzu erklären, vielleicht sieht ja jemand einen Lösungsweg.

    Die Fakten:
    Angefangen damit, dass selbst das Mastering auf den CD's von der Lautstärke schon sehr unterschiedlich ist, hat man eben begonnen die Audiodaten innerhalb eines Systems auf einen gewissen Wert zu normalisiern um am Ende jeden Titel "gleich" laut zu haben.
    Nun gibt es aber eingie die überzeugt davon sind dass 89dB der ideale Wert sind und andere schwören auf 93 - 95 dB. Das hat zur Folge, dass in jedem Studio unterschiedlich laute Audiofiles vorhanden sind.

    Dann ist da der Audiozulieferer (für News usw.) da dieser selbst schon wieder von unterschiedlichen Sprechern Audiofiles bezieht sind auch diese Daten teilweise unterschiedlich laut.

    Der Sender selbst stellt die Opener und Closer zur Verfügung gleichbleibend von der Lautstärke sind. In dem Fall 92dB.

    Das Ziel:
    Alle zusammengetragenen Daten auf das Niveau des jeweiligen Studion zu bringen.

    Beispiele:
    Studiolautstärke: 89 dB
    Opener und Closer 92 dB
    Audiozulieferer: 95 dB
    -> Opener und Closer müssen um 3 dB gesenkt werden -- Das File vom Zulieferer muß um 6 dB gesenkt werden

    Studiolautstärke: 93 dB
    Opener und Closer 92 dB
    Audiozulieferer: 93 dB
    -> Opener und Closer müssen um 1 dB angehoben werden -- Das File vom Zulieferer bleibt unverändert

    Studiolautstärke: 92 dB
    Opener und Closer 92 dB
    Audiozulieferer: 98 dB
    -> Opener und Closer bleiben unverändert -- Das File vom Zulieferer muß um 3 dB angehoben werden

    Um zu verdeutlichen von welchen Werten ich hier spreche hänge ich einen Screenshot aus Wikipedia an.
    Quelle: http://de.wikipedia.org/wiki/Lautst%C3%A4rke

    Eine CD aus den 80er oder 90er Jahren war zumeißt bei 89 dB. Heutige Musik geht aufgrund der fatalen Überzeugung, Lauter ist Besser, zu Lasten des Headrooms mit bis zu 97 dB auf die CD.
    100 dB wären demnach das was bei der Bass 0 dB sind, da das als absolute Obergrenze gilt bei dem das Clipping einsetzt.

    Wenn also bei der Bass von -9 dB die Rede ist heißt das nicht dass dann von den 100 dB Neun abgezogen werden. Denn die Reduktionskurve ist hier nonlinear.

    Wie also berechne ich nun den Wert, damit mir die Bass zuerst feststellt wieviel dB ein Audiofile gemessen anhand der Beispieltabelle hat und um wieviel es gesenkt oder angehoben werden muß um am ende den Wert zu haben der lokal üblich ist?

    Ich hoffe sehr, dass verständlich ist was ich damit meine.

  • Mit Schalldruck hat das nichts zu tun.
    (Hier wird auch anders mit dB´s gerechnet, deshalb die Verwirrung)

    Wir rechnen "ganz normal" wie man es von einem Mischpult kennt: Fader um 6dB nach unten = halbe Lautstärke
    In welchem Bereich sich dB´s bewegen ist egal, es handelt sich um relative Werte
    Deshalb kannst du auch die Angaben von MP3Gain direkt übernehmen.

    Hier eine angepasste Version:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include "Bass.au3"
    #include "BassExt.au3"
    #include "BassMix.au3"
    #include "BassEnc.au3"

    [/autoit] [autoit][/autoit] [autoit]

    ;Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("OnAutoItExit")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _BASS_Startup()
    _BASS_EXT_Startup()
    _BASS_MIX_Startup()
    _BASS_ENCODE_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Init(0, -1, 44100, 0, "")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $sFile_Opener = @ScriptDir & "\Opener.mp3"
    Global $sFile_Main = @ScriptDir & "\Main.mp3"
    Global $sFile_Closer = @ScriptDir & "\Closer.mp3"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $fdB_Opener = _MP3Gain_GetdB($sFile_Opener)
    Global $fdB_Main = _MP3Gain_GetdB($sFile_Main)
    Global $fdB_Closer = _MP3Gain_GetdB($sFile_Closer)
    ConsoleWrite(StringFormat("+ Opener: %.2f dB", $fdB_Opener) & @CRLF)
    ConsoleWrite(StringFormat("+ Main: %.2f dB", $fdB_Main) & @CRLF)
    ConsoleWrite(StringFormat("+ Closer: %.2f dB", $fdB_Closer) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    _Audio_Mix(@ScriptDir & "\Mix.mp3", 89, $sFile_Opener, $fdB_Opener, $sFile_Main, $fdB_Main, $sFile_Closer, $fdB_Closer)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _MP3Gain_GetdB($sFile)
    Local $sStdOut, $aRegExp, $iValue, $fdB

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOn("Analyzing Audiofile", $sFile)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hPID = Run(@ScriptDir & '\mp3gain -s sr -c "' & $sFile & '"', "", @SW_HIDE, 0x8)
    While 1
    $sStdOut = StdoutRead($hPID)
    If @error Then ExitLoop
    If $sStdOut Then
    $aRegExp = StringRegExp($sStdOut, "(?i)\r\h*(\d+)%\h+of\h+\d+\h+bytes\h+analyzed", 3)
    If IsArray($aRegExp) Then ProgressSet(Number($aRegExp[0]))

    [/autoit] [autoit][/autoit] [autoit]

    $aRegExp = StringRegExp($sStdOut, '(?mi)^\h*Recommended\h+"Track"\h+dB\h+change:\h*(-?\d+.\d+)', 3)
    If IsArray($aRegExp) Then $fdB = Number($aRegExp[0])
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOff()

    [/autoit] [autoit][/autoit] [autoit]

    Return 89 - $fdB
    EndFunc ;==>_MP3Gain_GetdB

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Audio_Mix($sFile_Mix, $fdB_Studio, $sFile_Opener, $fdB_Opener, $sFile_Main, $fdB_Main, $sFile_Closer, $fdB_Closer, $fTH_Silence = -30, $fXFade = 0.3, $bLimit = True)
    Local $hStream_Opener = _BASS_StreamCreateFile(False, $sFile_Opener, 0, 0, $BASS_STREAM_DECODE)
    Local $hStream_Main = _BASS_StreamCreateFile(False, $sFile_Main, 0, 0, $BASS_STREAM_DECODE)
    Local $hStream_Closer = _BASS_StreamCreateFile(False, $sFile_Closer, 0, 0, $BASS_STREAM_DECODE)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iByteStart = 0, $iByteEnd = _BASS_ChannelGetLength($hStream_Main, $BASS_POS_BYTE)
    If $fTH_Silence < 0 Then _Audio_FindSilence($hStream_Main, $iByteStart, $iByteEnd, $fTH_Silence)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $fdB_Gain_Opener = $fdB_Studio - $fdB_Opener
    $fdB_Gain_Main = $fdB_Studio - $fdB_Main
    $fdB_Gain_Closer = $fdB_Studio - $fdB_Closer
    ConsoleWrite(StringFormat("> Gain Opener: %.2f dB", $fdB_Gain_Opener) & @CRLF)
    ConsoleWrite(StringFormat("> Gain Main : %.2f dB", $fdB_Gain_Main) & @CRLF)
    ConsoleWrite(StringFormat("> Gain Closer: %.2f dB", $fdB_Gain_Closer) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $fdB_MaxPeak_Opener = _Audio_CalcMaxPeak($hStream_Opener)
    Local $fdB_MaxPeak_Main = _Audio_CalcMaxPeak($hStream_Main)
    Local $fdB_MaxPeak_Closer = _Audio_CalcMaxPeak($hStream_Closer)
    ConsoleWrite(StringFormat("> Max Peak Opener: %.2f dB", $fdB_MaxPeak_Opener) & @CRLF)
    ConsoleWrite(StringFormat("> Max Peak Main : %.2f dB", $fdB_MaxPeak_Main) & @CRLF)
    ConsoleWrite(StringFormat("> Max Peak Closer: %.2f dB", $fdB_MaxPeak_Closer) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hFX_Opener, $hFX_Main, $hFX_Closer

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $fdB_MaxPeak_Opener + $fdB_Gain_Opener > 0 Then
    ConsoleWrite(StringFormat("! Opener Peaks %.2f dB im Clippingbereich", $fdB_MaxPeak_Opener + $fdB_Gain_Opener) & @CRLF)
    If $bLimit Then
    ConsoleWrite(StringFormat("+ Opener Compressor auf %.2f dB, Ratio = 2.1:1", $fdB_MaxPeak_Opener - ($fdB_MaxPeak_Opener + $fdB_Gain_Opener) * 2) & @CRLF)
    $hFX_Opener = _BASS_ChannelSetFX($hStream_Opener, $BASS_FX_DX8_COMPRESSOR, 1)
    _BASS_FXSetParameters($hFX_Opener, "0|0.01|20|" & $fdB_MaxPeak_Opener - ($fdB_MaxPeak_Opener + $fdB_Gain_Opener) * 2 & "|2.1|0")
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $fdB_MaxPeak_Main + $fdB_Gain_Main > 0 Then
    ConsoleWrite(StringFormat("! Main Peaks %.2f dB im Clippingbereich", $fdB_MaxPeak_Main + $fdB_Gain_Main) & @CRLF)
    If $bLimit Then
    ConsoleWrite(StringFormat("+ Main Compressor auf %.2f dB, Ratio = 2.1:1", $fdB_MaxPeak_Main - ($fdB_MaxPeak_Main + $fdB_Gain_Main) * 2) & @CRLF)
    $hFX_Main = _BASS_ChannelSetFX($hStream_Main, $BASS_FX_DX8_COMPRESSOR, 1)
    _BASS_FXSetParameters($hFX_Main, "0|0.01|20|" & $fdB_MaxPeak_Main - ($fdB_MaxPeak_Main + $fdB_Gain_Main) * 2 & "|2.1|0")
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $fdB_MaxPeak_Closer + $fdB_Gain_Closer > 0 Then
    ConsoleWrite(StringFormat("! Closer Peaks %.2f dB im Clippingbereich", $fdB_MaxPeak_Closer + $fdB_Gain_Closer) & @CRLF)
    If $bLimit Then
    ConsoleWrite(StringFormat("+ Closer Compressor auf %.2f dB, Ratio = 2.1:1", $fdB_MaxPeak_Closer - ($fdB_MaxPeak_Closer + $fdB_Gain_Closer) * 2) & @CRLF)
    $hFX_Closer = _BASS_ChannelSetFX($hStream_Closer, $BASS_FX_DX8_COMPRESSOR, 1)
    _BASS_FXSetParameters($hFX_Closer, "0|0.01|20|" & $fdB_MaxPeak_Closer - ($fdB_MaxPeak_Closer + $fdB_Gain_Closer) * 2 & "|2.1|0")
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _Audio_MixFiles($sFile_Mix, $hStream_Opener, $fdB_Gain_Opener, $hStream_Main, $fdB_Gain_Main, $iByteStart, $iByteEnd, $hStream_Closer, $fdB_Gain_Closer, $fXFade)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $hFX_Opener Then _BASS_ChannelRemoveFX($hStream_Opener, $hFX_Opener)
    If $hFX_Main Then _BASS_ChannelRemoveFX($hStream_Main, $hFX_Main)
    If $hFX_Closer Then _BASS_ChannelRemoveFX($hStream_Closer, $hFX_Closer)

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_StreamFree($hStream_Opener)
    _BASS_StreamFree($hStream_Main)
    _BASS_StreamFree($hStream_Closer)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Audio_Mix

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Audio_MixFiles($sFile_Mix, $hStream_Opener, $fdB_Gain_Opener, $hStream_Main, $fdB_Gain_Main, $iByteStart, $iByteEnd, $hStream_Closer, $fdB_Gain_Closer, $fXFade = 1)
    _BASS_ChannelSetPosition($hStream_Opener, 0, $BASS_POS_BYTE) ;Auf Anfang setzen
    _BASS_ChannelSetPosition($hStream_Main, $iByteStart, $BASS_POS_BYTE) ;Auf Anfang (minus Stille) setzen
    _BASS_ChannelSetPosition($hStream_Closer, 0, $BASS_POS_BYTE) ;Auf Anfang setzen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hMixer = _BASS_Mixer_StreamCreate(44100, 2, BitOR($BASS_MIXER_END, $BASS_STREAM_DECODE))

    [/autoit] [autoit][/autoit] [autoit]

    Local $iByteXFade = _BASS_ChannelSeconds2Bytes($hMixer, $fXFade)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iByteLen_Opener = _BASS_ChannelGetLength($hStream_Opener, $BASS_POS_BYTE)
    Local $iByteLen_Main = _BASS_ChannelGetLength($hStream_Main, $BASS_POS_BYTE)
    Local $iByteLen_Closer = _BASS_ChannelGetLength($hStream_Closer, $BASS_POS_BYTE)

    [/autoit] [autoit][/autoit] [autoit]

    ;Crossfade darf maximal die Hälfte eines Audiofiles sein
    If $iByteXFade >= $iByteLen_Opener * 0.5 Then $iByteXFade = Floor($iByteLen_Opener * 0.5)
    If $iByteXFade >= $iByteLen_Main * 0.5 Then $iByteXFade = Floor($iByteLen_Main * 0.5)
    If $iByteXFade >= $iByteLen_Closer * 0.5 Then $iByteXFade = Floor($iByteLen_Closer * 0.5)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Opener an Position 0
    _BASS_Mixer_StreamAddChannelEx($hMixer, $hStream_Opener, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
    0, $iByteLen_Opener)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Main an Position OpenerEnde - Crossfade
    Local $iOffset = $iByteLen_Opener - $iByteXFade
    _BASS_Mixer_StreamAddChannelEx($hMixer, $hStream_Main, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
    $iOffset, $iByteEnd - $iByteStart)

    [/autoit] [autoit][/autoit] [autoit]

    ;Closer an Position MainEnde - Crossfade
    $iOffset += $iByteEnd - $iByteStart - $iByteXFade
    _BASS_Mixer_StreamAddChannelEx($hMixer, $hStream_Closer, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
    $iOffset, $iByteLen_Closer)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $iByteXFade2 = Round($iByteXFade / 2)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aVol_O[5][2] = [[4]]
    $aVol_O[1][0] = 0
    $aVol_O[1][1] = _BASS_EXT_dB2Level($fdB_Gain_Opener, False)
    $aVol_O[2][0] = $iByteLen_Opener - $iByteXFade ;ab hier ausfaden
    $aVol_O[2][1] = _BASS_EXT_dB2Level($fdB_Gain_Opener, False)
    $aVol_O[3][0] = $iByteLen_Opener - $iByteXFade2 ;bis hier -3dB
    $aVol_O[3][1] = _BASS_EXT_dB2Level($fdB_Gain_Opener - 3, False)
    $aVol_O[4][0] = $iByteLen_Opener
    $aVol_O[4][1] = 0

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Mixer_ChannelSetEnvelope($hStream_Opener, $BASS_MIXER_ENV_VOL, $aVol_O)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aVol_M[7][2] = [[6]]
    $aVol_M[1][0] = 0
    $aVol_M[1][1] = 0
    $aVol_M[2][0] = $iByteXFade2 ;bis hier auf -3dB einfaden
    $aVol_M[2][1] = _BASS_EXT_dB2Level($fdB_Gain_Main - 3, False)
    $aVol_M[3][0] = $iByteXFade ;bis hier komplett einfaden
    $aVol_M[3][1] = _BASS_EXT_dB2Level($fdB_Gain_Main, False)

    [/autoit] [autoit][/autoit] [autoit]

    $aVol_M[4][0] = $iByteEnd - $iByteStart - $iByteXFade ;ab hier auf -3dB ausfaden
    $aVol_M[4][1] = _BASS_EXT_dB2Level($fdB_Gain_Main, False)
    $aVol_M[5][0] = $iByteEnd - $iByteStart - $iByteXFade2 ;ab hier komplett ausfaden
    $aVol_M[5][1] = _BASS_EXT_dB2Level($fdB_Gain_Main - 3, False)

    [/autoit] [autoit][/autoit] [autoit]

    $aVol_M[6][0] = $iByteEnd - $iByteStart
    $aVol_M[6][1] = 0

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Mixer_ChannelSetEnvelope($hStream_Main, $BASS_MIXER_ENV_VOL, $aVol_M)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aVol_C[4][2] = [[3]]
    $aVol_C[1][0] = 0
    $aVol_C[1][1] = 0
    $aVol_C[2][0] = $iByteXFade ;bis hier auf -3dB einfaden
    $aVol_C[2][1] = _BASS_EXT_dB2Level($fdB_Gain_Closer - 3, False)
    $aVol_C[3][0] = $iByteXFade ;bis hier komplett einfaden
    $aVol_C[3][1] = _BASS_EXT_dB2Level($fdB_Gain_Closer, False)

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Mixer_ChannelSetEnvelope($hStream_Closer, $BASS_MIXER_ENV_VOL, $aVol_C)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hEncoder
    If StringRight($sFile_Mix, 3) = "mp3" Then
    $hEncoder = _BASS_Encode_Start($hMixer, '"' & @ScriptDir & '\lame" -r -x -b320 -h - "' & $sFile_Mix & '"', 0);MP3 erstellen
    Else
    $hEncoder = _BASS_Encode_Start($hMixer, $sFile_Mix, $BASS_ENCODE_PCM);Wav erstellen
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $iPos, $iLen = $iByteEnd

    [/autoit] [autoit][/autoit] [autoit]

    Local $tBuffer = DllStructCreate("byte[88200];")
    Local $pBuffer = DllStructGetPtr($tBuffer)
    Local $iBuffer = DllStructGetSize($tBuffer)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iByteLen_Mix = $iOffset + $iByteLen_Closer

    [/autoit] [autoit][/autoit] [autoit]

    Local $iBytesDone = 0, $iBytesBuffer
    ProgressOn("Mix", "Mixing Audiofiles")
    Local $iTimer = TimerInit()
    While _BASS_ChannelIsActive($hMixer)
    $iBytesBuffer = _BASS_ChannelGetData($hMixer, $pBuffer, $iBuffer);Daten holen und so Enkodierprozess ausführen
    $iBytesDone += $iBytesBuffer
    If TimerDiff($iTimer) > 250 Then
    ProgressSet($iBytesDone * 100 / $iByteLen_Mix)
    $iTimer = TimerInit()
    EndIf
    WEnd
    ProgressOff()
    _BASS_Encode_Stop($hEncoder)

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_StreamFree($hMixer)
    EndFunc ;==>_Audio_MixFiles

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Audio_CalcMaxPeak($hStream)
    _BASS_ChannelSetPosition($hStream, 0, $BASS_POS_BYTE) ;Auf Anfang setzen

    [/autoit] [autoit][/autoit] [autoit]

    Local $iLevel
    Local $fLeft, $fRight
    Local $fPeak = 0
    Local $iByteLen = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOn("Get Max Peak", "Get Max Peak")
    Local $iTimer = TimerInit()
    While 1
    $iLevel = _BASS_ChannelGetLevel($hStream)
    If @error Then ExitLoop
    $fLeft = _BASS_LoWord($iLevel)
    $fRight = _BASS_HiWord($iLevel)

    [/autoit] [autoit][/autoit] [autoit]

    If $fLeft > $fPeak Then $fPeak = $fLeft
    If $fRight > $fPeak Then $fPeak = $fRight

    [/autoit] [autoit][/autoit] [autoit]

    If TimerDiff($iTimer) > 250 Then
    ProgressSet(_BASS_ChannelGetPosition($hStream, $BASS_POS_BYTE) * 100 / $iByteLen)
    $iTimer = TimerInit()
    EndIf
    WEnd
    ProgressOff()

    [/autoit] [autoit][/autoit] [autoit]

    Return _BASS_EXT_Level2dB($fPeak / 32768, False)
    EndFunc ;==>_Audio_CalcMaxPeak

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Audio_FindSilence($hStream, ByRef $iByteStart, ByRef $iByteEnd, $fThrsHld = -30)
    _BASS_ChannelSetPosition($hStream, 0, $BASS_POS_BYTE) ;Auf Anfang setzen

    [/autoit] [autoit][/autoit] [autoit]

    $iByteStart = 0
    $iByteEnd = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)

    [/autoit] [autoit][/autoit] [autoit]

    $fThrsHld = _BASS_EXT_dB2Level($fThrsHld, False)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iLevel, $fLeft, $fRight
    Local $iBytePos = 0
    Local $bStart = False

    [/autoit] [autoit][/autoit] [autoit]

    Local $iByteLen = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOn("Cut Silence", "Find Silence")
    Local $iTimer = TimerInit()
    While 1
    $iLevel = _BASS_ChannelGetLevel($hStream)
    If @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    $iBytePos = _BASS_ChannelGetPosition($hStream, $BASS_POS_BYTE) ;aktuelle Postition ermitteln
    If TimerDiff($iTimer) > 250 Then
    ProgressSet($iBytePos * 100 / $iByteLen)
    $iTimer = TimerInit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $fLeft = _BASS_LoWord($iLevel) / 32768
    $fRight = _BASS_HiWord($iLevel) / 32768

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $fLeft <= $fThrsHld And $fRight <= $fThrsHld Then ;Level unter Threshold
    If Not $bStart Then;Noch immer Stille am Anfang
    $iByteStart = $iBytePos
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else ;Level über Treshold
    $bStart = True
    $iByteEnd = $iBytePos
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOff()
    EndFunc ;==>_Audio_FindSilence

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit()
    _BASS_Free()
    EndFunc ;==>OnAutoItExit

    [/autoit]

    Du musst vorher noch mp3gain.exe in das Script-Verzeichnis kopieren.

    E

  • OK .. :)

    Ich fürchte ich habe mich unklar ausgedrückt. Das von Dir eingestelle Script funktioniert soweit perfekt, aber ich kann es nicht in mein Programm einbinden.

    Wenn ich das richtig interpretiere normalisiert dieses Script das File "$sFile_Mix" fest auf den Wert 89. Das klappt auch soweit recht gut.

    Jetzt habe ich aber das Problem, dass die unterschiedlichen Moderatoren mit unterschiedlichen Werten arbeiten. Der Eine "89", der andere mit "92" usw. - Dazu hat er in den Programmoptionen die Möglichkeit seinen Wert für die Normalisierung zu hinterlegen "$sOptDb"

    Dazu habe ich im Funktionsaufruf die "89" gegen die Variable "$sOptDb" ausgetauscht, was allerdings nicht den gewünschten Effekt bringt. Zwar wird zum beispiel bei einem Wert von "92"das Ergebnis erhöht, aber eben nicht auf 92, sondern nur um ca. "1,0" auf "90". Entsprechend verhält sich das bei anderen Werten.

    [autoit]

    _Audio_Mix(@ScriptDir & "\temp\Mix.mp3", $sOptDb, $sFile_Opener, $fdB_Opener, $sFile_Main, $fdB_Main, $sFile_Closer, $fdB_Closer)

    [/autoit]

    Ich gehe davon aus, dass ich in der Mp3Gain Funktion auch noch den Wert korrigieren muß, kann das aber nicht ganz nachvollziehen.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Was soll ich sagen? - Perfekt :D

    Danke Dir vielmals ... Nun ich muß mit meinem Programmeben sehen, mich weitgehend an das Level der einzelnen Moderatoren anzupassen. Die sind zumeißt leider mit Hard- und Software eher Low-Level ausgetattet.

    Ich kann nur nochmals vielen Dank sagen. Das hätte ich mit meinem aktuellen Wissen noch lange nciht hinbekommen :)

    Noch das ID3-Taging und ich habe das BasisPaket so gut wie fertig.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Huhu ... ich habe hier nochmal ein hoffentlich kleines Problem, bei dem ich aber keinen Lösungsansatz finde.

    Im Verlauf der diversen Tests ist folgendes Problem aufgetreten.

    Eines der drei Audiofiles die hier zu einem einzigen File zusammengeführt werden wird ja von einem fremden Server gezogen und zur Verfügung gestellt. Allerdings sind die Files von der Qualität nicht immer all zu gut und so ist es des öfteren vorgekommen, dass es innerhalb dieses Files zu Spitzen kommt. Die Normalisierung richtet sich ja nun nach dem max Peak, wen ich das richtig verstehe?

    Das hat dann zur Folge, dass dieses Audiofile derart stark reduziert wird, dass es im Vergleich zu den anderen mit denen es zusammen geführt wird viel zu leise ist.

    Gibt es eine Möglichkeit diese Spitzen zu vermeiden ?

    Gruß
    Anna

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Hi

    ist das auch bei meiner vorigen Version so, wo noch nicht MP3Gain.exe verwendet wird?

    Falls das Problem ist, dass der Beitrag zB leise beginnt und dann immer lauter wird, dann gäbe es 2 Möglichkeiten:

    1) In Bass_FX gibt es "Dynamic Amplification" $BASS_BFX_DAMP. Das ist jedoch mit Vorsicht zu genießen.

    2) Man analysiert nur die ersten bzw. letzten Sekunden der Datei - dann sollten zumindest die Übergänge passen.