Fritzbox Speex to wav!?

  • Hallo

    ich habe mir ein paar sachen zusammen gesucht um die Fritzbox Anrufbeantworter Files (speex formart ohne Container) in wave zu Convertieren.
    Aber so wie Ich das machen wollte geht es nicht.

    Converter Funktionen:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <Constants.au3>

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

    Global $sSpeexDecBin = @ScriptDir & "\speexdec-fb.exe"
    Global $sSpeexEncBin = @ScriptDir & "\speexenc-fb.exe"
    Global $bSpeexDec = FileExists($sSpeexDecBin)
    Global $bSpeexEnc = FileExists($sSpeexEncBin)

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

    FileInstall(@ScriptDir & "\speexdec-fb.exe",@ScriptDir & "\speexdec-fb.exe")
    FileInstall(@ScriptDir & "\speexenc-fb.exe",@ScriptDir & "\speexenc-fb.exe")

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

    Func _speexDecFB($infile)
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $infile = ' & BinaryToString($infile) & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Local $outfile
    if $bSpeexDec Then
    $Pid = Run($sSpeexDecBin & " - - ",@ScriptDir,$STDIN_CHILD+$STDOUT_CHILD)
    StdinWrite($Pid,$infile)
    StdinWrite($Pid)
    While True
    $outfile &= StdoutRead($Pid)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $outfile = ' & $outfile & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    If @error Then ExitLoop
    Sleep(25)
    WEnd
    return $outfile
    Else
    Return SetError(1,0,0)
    EndIf
    EndFunc

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

    Func _speexEncFB($infile)
    Local $outfile
    if $bSpeexEnc Then
    $Pid = Run($sSpeexEncBin & " - -",@ScriptDir,$STDIN_CHILD+$STDOUT_CHILD)
    StdinWrite($Pid,$infile)
    StdinWrite($Pid)
    While True
    $outfile &= StdoutRead($Pid)
    If @error Then ExitLoop
    Sleep(25)
    WEnd
    return $outfile
    Else
    Return SetError(1,0,0)
    EndIf
    EndFunc

    [/autoit]

    Testscript:

    Spoiler anzeigen
    [autoit]

    #include "speex_converter.au3"
    $infile = FileOpen(@ScriptDir & "\rec.0.spx")
    $RC = FileRead($infile)
    $RC = _speexDecFB($RC)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $RC = ' & $RC & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    Im Anhang befindet sich ein Speex File rec.0.spx welches convertiert werden soll. Es schein aber irgent wie mit dem IOStreem probleme zu geben.

  • Ich versteh irgendiwe nicht was du da genau tust in deinen Funktionen. So wie ich das sehe versuchst du dem encoder per stdin die Daten zu übergeben, anstatt wie gedacht einfach beim Aufruf der exe.

    Hier mal ein funktionierendes Script:

    [autoit]


    $decoder = @ScriptDir & "\speexdec-fb.exe"
    $encoder = @ScriptDir & "\speexenc-fb.exe"
    $inputfile = @ScriptDir & "\rec.0.spx"
    $outputfile = @ScriptDir & "\output.wav"

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

    decodeandreverse()

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

    Func decodeandreverse() ; wandelt spx Datei zu wav und erstellt aus Ergenbis erneut eine spx Datei
    decode()
    $inputfile = $outputfile
    $outputfile = @ScriptDir & "\output.spx"
    encode()
    EndFunc

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

    Func decode()
    RunWait('"' & $decoder & '" "' & $inputfile & '" "' & $outputfile & '"')
    EndFunc

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

    Func encode()
    RunWait('"' & $encoder & '" "' & $inputfile & '" "' & $outputfile & '"')
    EndFunc

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

    Und hier die korrekte Syntax zur Anwendung des Decoders:

    Spoiler anzeigen

    2 Mal editiert, zuletzt von misterspeed (5. November 2010 um 14:19)

  • Ahja, sorry hatte vorhin noch nicht einmal gesehen, dass der encoder diese Art der Daten Übergabe unterstützt.
    Du könntest mal versuchen beim fileopen() den Binärmodus zu erzwingen.

  • Also so funktioniert es bei mir:

    Spoiler anzeigen
    [autoit]

    Func _RunSpeexDec($sSpeex, $sIn, $sOut, $sOpts='')
    Return Run(StringFormat('"%s" %s "%s" "%s"', $sSpeex, $sOpts, $sIn, $sOut) ,@WorkingDir, @SW_HIDE, 0x9)
    EndFunc

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

    ;~ FileGetShortName(@ScriptDir&'\rec.0.spx')
    $hFile = FileOpen(@ScriptDir&'\rec.0.spx', 16)
    $iSpeex = _RunSpeexDec(@ScriptDir&'\speexdec-fb.exe', '-', @ScriptDir&'\test.wav')

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

    While 1
    $bData = FileRead($hFile, 1234)
    If @error Then ExitLoop
    StdinWrite($iSpeex, $bData)
    If @error Then ExitLoop
    WEnd
    While 1
    $s = StdoutRead($iSpeex)
    If @error Or Not $s Then ExitLoop
    ConsoleWrite($s & @CRLF)
    WEnd
    StdIoClose($iSpeex)

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

    FileClose($hFile)
    While ProcessExists($iSpeex)
    ToolTip("Waiting for speexdec to finish")
    Sleep(500)
    WEnd

    [/autoit]