Foto jpg-Dateien mit Audio mp3-Dateien verknüpfen

  • Hallo Leute,
    heute wird massenhaft fotografiert und archiviert. Zeigt
    man nun andern Menschen die schönen Bilder, muss immer wieder dasselbe
    erzählen!

    Heute Nacht kam mir folgende Idee:
    Warum nicht zu den Fotos (Foto123.jpg) eine jeweils passende
    Audio-Datei (Foto123.mp3) erstellen.

    Schaut man sich mit eine speziellen Viewer das Foto an,
    dann ertönt gleichzeitig dazu der Kommentar.

    Man bräuchte 2 Autoit-Scripts
    1. FotoRecorder.au3 zum Aufnehmen der zu den Fotos
    passenden Soundtracks.

    2. FotoViewer.au3 zum Ansehen der Fotos bei gleichzeitigem
    Abspielen des Soundtrack

    Das sollte sich doch mit Autoit realisieren können.

    Gibt es vielleicht schon etwas dergleichen? Ich glaube ein Markt dafür gibt es bestimmt!

  • Im Grunde ist das was du willst einfach ein Cover (in dem Fall dein Foto) zu einer MP3-Datei hinzufügen. Dafür gibt es hunderte Programme.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Natürlich geht das so, aber dabei gehen alle EXIF Daten des Fotos verloren. Die Fotodatei sollte nicht verändert werden.

  • Einfache Struktur wäre durch ZIP-Verzeichnisse möglich:
    Im ZIP-Ordner jeweils (mit gleichem Namen, andere Endung?):
    1 Bild-Datei
    1 Song-Datei
    1 Config-Datei

    So würde ich das angehen.
    Etwas ähnliches hatte ich auch schonmal geplant, allerdings um Diashows simpel mit Bildkommentaren (visuell) und Musik zu versehen.

    Gruß

  • Du kannst beide Dateien in eine Datei verschmelzen und später die Mp3 wieder extrahieren:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    _CombineJpgMp3(@ScriptDir & "\Out.jpg", @ScriptDir & "\Test.jpg", @ScriptDir & "\Test.mp3")

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

    $bMp3 = _ExtractMp3(@ScriptDir & "\Out.jpg")
    $hFile = FileOpen(@TempDir & "\JpgMp3.mp3", 18)
    FileWrite($hFile, $bMp3)
    FileClose($hFile)

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

    SoundPlay(@TempDir & "\JpgMp3.mp3")
    ShellExecuteWait(@ScriptDir & "\Out.jpg")

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

    Func _ExtractMp3($sFile)
    If Not FileExists($sFile) Then
    MsgBox(16, "ERROR", $sFile & " not found")
    Return
    EndIf

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

    Local $iJpgSize = _JpgGetSize($sFile)

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

    Local $hFile = FileOpen($sFile, 16)
    Local $bMp3 = FileRead($hFile)
    FileClose($hFile)

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

    $bMp3 = BinaryMid($bMp3, $iJpgSize, BinaryLen($bMp3))

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

    Return $bMp3
    EndFunc ;==>_ExtractMp3

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

    Func _CombineJpgMp3($sFile, $sFile_Jpg, $sFile_Mp3)
    If Not FileExists($sFile_Jpg) Then
    MsgBox(16, "ERROR", $sFile_Jpg & " not found")
    Return
    EndIf
    If Not FileExists($sFile_Mp3) Then
    MsgBox(16, "ERROR", $sFile_Mp3 & " not found")
    Return
    EndIf

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

    Local $hFile = FileOpen($sFile_Jpg, 16)
    Local $bJpg = FileRead($hFile)
    FileClose($hFile)

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

    Local $iJpgSize = _JpgGetSize($sFile_Jpg)
    If @extended Or $iJpgSize <> BinaryLen($bJpg) Then
    MsgBox(16, "ERROR", "error calculating jpg size")
    Return
    EndIf

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

    $hFile = FileOpen($sFile_Mp3, 16)
    Local $bMp3 = FileRead($hFile)
    FileClose($hFile)

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

    $hFile = FileOpen($sFile, 18)
    FileWrite($hFile, $bJpg)
    FileWrite($hFile, $bMp3)
    FileClose($hFile)
    EndFunc ;==>_CombineJpgMp3

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

    Func _JpgGetSize($sFile)
    Local $hFile = FileOpen($sFile, 16)
    Local $bJpg = FileRead($hFile)
    FileClose($hFile)

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

    Local $iLen = BinaryLen($bJpg)
    Local $iSize = 0

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

    Local $tJpg = DllStructCreate("byte Data[" & $iLen + 1 & "];")
    $tJpg.Data = $bJpg

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

    Local $iIdx = 1, $iOffset
    While $iIdx < $iLen ;looking for Start Of Scan (SOS)
    $iOffset = 1

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

    If $tJpg.Data(($iIdx)) = 0xFF Then
    Switch $tJpg.Data(($iIdx + 1))
    Case 0x00, 0xFF ;not a marker
    Case 0xD8 ;SOI
    Case 0x01 ;TEM
    Case 0xD0 To 0xD7 ;RST
    Case 0xD9 ;EOI
    $iSize = $iIdx + 2
    ExitLoop
    Case 0xDA ;SOS
    ExitLoop
    Case Else
    $iOffset = ($tJpg.Data(($iIdx + 2)) * (2 ^ 8) + $tJpg.Data(($iIdx + 3))) + 2
    EndSwitch
    EndIf

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

    $iIdx += $iOffset
    WEnd

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

    If $tJpg.Data(($iIdx)) = 0xFF And $tJpg.Data(($iIdx + 1)) = 0xDA Then
    $bJpg = BinaryMid($bJpg, $iIdx, $iLen)
    $iSize = $iIdx + (StringInStr($bJpg, "FFD9") - 1) / 2
    EndIf

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

    If $iSize <> $iLen Then Return SetExtended(1, $iSize)
    Return $iSize
    EndFunc ;==>_JpgGetSize

    [/autoit]

    Speichere niemals über deine Originalbilder!!!

    Das erzeugte Jpg-Bild sollte von jedem Bildbetrachter (auch mit AutoIt via GDI+) angezeigt werden können, obwohl eine Mp3 dranhängt.
    Um die Mp3 abzuspielen, muss man vorher den Jpg-Teil wegschneiden.

    Die Mp3 kann auch direkt (ohne im Tempordner zu speichern) vom Speicher abgespielt werden: http://www.autoitscript.com/forum/topic/12…e/#entry1004262

    E