FFmpeg.workflow

Dieses Thema im Forum "Videosoftware" wurde erstellt von flashi, 06.02.19.

  1. flashi

    flashi Idared

    Dabei seit:
    11.01.19
    Beiträge:
    27
    HI Leute,

    Ich hatte keine Lust mehr jedes mal die Video Dateien im Terminal mit ffmpeg umzuwandeln darum habe ich mit Automator ein Einfaches Script geschrieben um es einen zu vereinfachen.

    Man Markiert im Finder mehre Video Dateien oder eben nur eine und wählt dann mit ein Rechtsklick den Reiter ffmpeg aus und startet es. Jetzt muss man noch die Output File Options setzten und dann auf OK klicken und jetzt kann man noch das
    Output Format setzen und klickt dann auf OK. Wenn das gemacht wurde werden jetzt die Video Dateien Umgewandelt. Sie werden im gleichen Ordner angelegt wo die Input Video Dateien enthalten sind.

    Es wird auch geprüft ob ffmpeg installiert ist und wird in /usr/local/bin erwartet. Wie man ffmpeg Installiert kann man ihr nachlesen. Ich habe das auch so gemacht. Die Installation von ffmpeg ist sehr einfach.

    Wenn man ein Fehler in den Output File Options macht wird ein Fehler ausgegeben und ffmpeg wird nicht gestartet.

    Beim Erfolgreichen Umwandeln wird eine Notification mit ein Ton kurz eingeblendet.

    Mit ein Doppelklick auf FFmpeg.workflow wird die Datei installiert. Wenn man FFmpeg.workflow wieder Deinstallieren will geht das ganz einfach. Öffnet die Einstellungen und geht dann auf Erweiterungen. Dann unter Finder FFmpeg Rechtsanklicken und Löschen. Es wird dann die FFmpeg.workflow Datei in den Papierkorb gelegt.

    PS. Für Verbesserung's Vorschläge bin ich gern zu haben.

    Code:
    on run {input, parameters}
        try
            set ffmpegPath to do shell script "export PATH=$PATH:/usr/local/bin; which ffmpeg"
        on error
            beep 1
            display dialog "Please install \"ffmpeg\" on /usr/local/bin/ and try again." with title "Could not find \"ffmpeg\"!" buttons {"OK"} default button 1
            return
        end try
        set fcount to 0
        try
            set output_file_options to "-threads 1 -preset fast -c:a aac -b:a 128k -c:v libx264 -vf scale=854:480"
            set output_format to "mp4"
            set {text returned:output_file_options} to (display dialog "Output File Options" default answer output_file_options buttons {"Abbrechen", "OK"} default button "OK" with title "ffmpeg")
            set {text returned:output_format} to (display dialog "Output Format?" default answer output_format buttons {"Abbrechen", "OK"} default button "OK" with title "ffmpeg")
            repeat with i in input
                set fname to POSIX path of i
                set o to text 1 thru -5 of fname
                do shell script ffmpegPath & " -i " & quoted form of fname & " " & output_file_options & " " & quoted form of (o & ".") & output_format
                set fcount to fcount + 1
            end repeat
            #display dialog "Number of files converted: " & fcount buttons {"OK"} default button 1 with title "ffmpeg" with hidden answer
            display notification "Number of files converted: " & fcount with title "ffmpeg"
        on error errorMessage
            beep 1
            display dialog errorMessage buttons {"OK"} with title "ffmpeg"
        end try
        return fcount
    end run
     

    Anhänge:

    kelevra, Freddy K. und Dx667 gefällt das.
  2. flashi

    flashi Idared

    Dabei seit:
    11.01.19
    Beiträge:
    27
    Ich habe mal das Script verbessert/verändert.

    Die Output Optionen werden jetzt aus einer Text Datei ausgelesen. Das gleiche gilt für das Output Format. Die Text Dateien müssen nach Dokumente.

    Die Error Logs werden jetzt auch in eine Log Datei gespeichert. Es werden jetzt auch der Erfolg in eine Log Datei gespeichert. Die Log Dateien werden in Dokumente erstellt.

    Es wird jetzt gefragt ob das Script ausgeführt werden soll.


    ffmpeg_output_file_options.txt
    Code:
    -threads 1 -preset fast -c:a aac -b:a 128k -c:v libx264 -vf scale=854:480
    ffmpeg_output_format.txt
    Code:
    mp4
    ffmpeg.workflow
    Code:
    on run {input, parameters}
    
    try
    
    set ffmpegPath to do shell script "export PATH=$PATH:/usr/local/bin; which ffmpeg"
    
    on error
    
    beep 1
    
    display dialog "Please install \"ffmpeg\" on /usr/local/bin/ and try again." with title "Could not find \"ffmpeg\"!" buttons {"OK"} default button 1
    
    
    return
    
    end try
    
    set fcount to 0
    
    display dialog "Should the script be executed?" buttons {"Yes", "No"} with title "ffmpeg"
    
    set DlogResult to result
    
    if button returned of result = "Yes" then
    
    try
    
    set file_path_output_file_options to ((path to documents folder) & "ffmpeg_output_file_options.txt") as string
    
    read file file_path_output_file_options
    
    set output_file_options to result
    
    set file_path_output_format to ((path to documents folder) & "ffmpeg_output_format.txt") as string
    
    read file file_path_output_format
    
    set output_format to result
    
    repeat with i in input
    
    set fname to POSIX path of i
    
    set o to text 1 thru -5 of fname
    
    do shell script ffmpegPath & " -i " & quoted form of fname & " " & output_file_options & " " & quoted form of (o & ".") & output_format
    
    set fcount to fcount + 1
    
    set logPath to (path to documents folder as string) & "ffmpeg_video_ created.log"
    
    try
    
    set logFile to open for access file logPath with write permission
    
    write (date string of (current date) & " " & time string of (current date) & " -- " & ffmpegPath & " -i " & quoted form of fname & " " & output_file_options & " " & quoted form of (o & ".") & output_format & return) to logFile starting at eof
    
    close access logFile
    
    try
    
    close access logFile
    
    end try
    
    end try
    
    end repeat
    
    display notification "Number of files converted: " & fcount with title "ffmpeg"
    
    on error errorMessage
    
    set logPath to (path to documents folder as string) & "ffmpeg_errors.log"
    
    try
    
    set logFile to open for access file logPath with write permission
    
    write (errorMessage & return) to logFile starting at eof
    
    beep 2
    
    display dialog "An error has occurred! More is in the log file!" & logPath buttons {"OK"} with title "ffmpeg" default button 1
    
    close access logFile
    
    on error
    
    try
    
    close access logFile
    
    end try
    
    end try
    
    end try
    
    else
    
    beep 3
    
    end if
    
    return fcount
    
    end run
    
    EDIT
    Es war ein Fehler im Code. Ist gefixt.
     

    Anhänge:

    #2 flashi, 10.02.19
    Zuletzt bearbeitet: 10.02.19
    kelevra und Freddy K. gefällt das.
  3. Keef

    Keef Rheinischer Bohnapfel

    Dabei seit:
    17.07.09
    Beiträge:
    2.432
    Für die, denen das Verständnis für Automator oder AppleScript fehlt (metoo:D ), gibt es ein gutes Programm.
     
    kelevra gefällt das.
  4. flashi

    flashi Idared

    Dabei seit:
    11.01.19
    Beiträge:
    27
    Da gebe ich dir recht mit Automator und AppleScript ist es nicht einfach. Ich bin Anfänger und es macht mir einfach spass und wenn es dann noch klappt ist es noch besser.

    Hier noch ein kleines update.

    FFmpeg Script Installer.app

    • Es wird FFmpeg Edit.app in Programme installiert
    • Es wird FFmpeg.workflow in Services Installiert
    • Es wird ffmpeg_output_file_options.txt in Dokumente installiert
    • Es wird ffmpeg_output_format.txt in Dokumente installiert
    main.scpt von FFmpeg Script Installer.app
    Code:
    set theicon to alias ((path to me as text) & "Contents:Resources:applet.icns")
    set the_path to "/usr/local/bin/ffmpeg"
    try
        POSIX file (the_path) as alias
        set file_exists to true
        display dialog "Should the FFmpeg script be installed?" buttons {"Yes", "No"} with title "ffmpeg" with icon theicon
        set DlogResult to result
        if button returned of result = "Yes" then
            set theFileFFmpegWorkflow to alias ((path to me as text) & "Contents:Resources:Stuff:FFmpeg.workflow")
            set theFileFFmpegOutputFormatTxt to alias ((path to me as text) & "Contents:Resources:Stuff:ffmpeg_output_format.txt")
            set theFileFFmpegOutputFileOptionsTxt to alias ((path to me as text) & "Contents:Resources:Stuff:ffmpeg_output_file_options.txt")
            set theFileFFmpegEditapp to alias ((path to me as text) & "Contents:Resources:Stuff:FFmpeg Edit.app")
            set theNewFolderServices to (path to services folder)
            set theNewFolderDocuments to (path to documents folder)
            set theNewFolderApplications to (path to applications folder)
            tell application "Finder"
                activate
                duplicate theFileFFmpegWorkflow to theNewFolderServices with replacing
                duplicate theFileFFmpegOutputFormatTxt to theNewFolderDocuments with replacing
                duplicate theFileFFmpegOutputFileOptionsTxt to theNewFolderDocuments with replacing
                duplicate theFileFFmpegEditapp to theNewFolderApplications with replacing
            end tell
        end if
    on error
        set file_exists to false
        beep 3
        display dialog "Please install \"ffmpeg\" on /usr/local/bin/ and try again." with title "Could not find \"ffmpeg\"!" with icon theicon buttons {"OK"} default button 1
        return
    end try

    FFmpeg Edit.app

    • Man kann die ffmpeg_output_file_options.txt bearbeiten
    • Man kann die ffmpeg_output_format.txt bearbeiten

    main.scpt von FFmpeg Edit.app

    Code:
    set theicon to alias ((path to me as text) & "Contents:Resources:applet.icns")
    set the_path to "/usr/local/bin/ffmpeg"
    try
        POSIX file (the_path) as alias
        set file_exists to true
        set theicon to alias ((path to me as text) & "Contents:Resources:applet.icns")
        set output_file_options to ""
        set theFileRead to (path to documents folder as string) & "ffmpeg_output_file_options.txt"
        try
            open for access theFileRead
            set output_file_options to (read file theFileRead as «class utf8»)
            close access theFileRead
        end try
        set output_format to ""
        set theFileRead1 to (path to documents folder as string) & "ffmpeg_output_format.txt"
        try
            open for access theFileRead1
            set output_format to (read file theFileRead1 as «class utf8»)
            close access theFileRead1
        end try
        set {text returned:output_file_options} to (display dialog "Output File Options" default answer output_file_options buttons {"Abort", "Save"} with title "FFmpeg Edit" with icon theicon)
        set DlogResult to result
        if button returned of result = "Save" then
            set theFileWrite_output_file_options to (path to documents folder as string) & "ffmpeg_output_file_options.txt"
            try
                set theFileWrite to open for access file theFileWrite_output_file_options with write permission
                set eof of theFileWrite to 0
                write (output_file_options) to theFileWrite
                close access theFileWrite
            end try
            set {text returned:output_format} to (display dialog "Output Format" default answer output_format buttons {"Abort", "Save"} with title "FFmpeg Edit" with icon theicon)
            set theFileWrite_output_format to (path to documents folder as string) & "ffmpeg_output_format.txt"
            try
                set theFileWrite1 to open for access file theFileWrite_output_format with write permission
                set eof of theFileWrite1 to 0
                write (output_format) to theFileWrite1
                close access theFileWrite1
            end try
        end if
    on error
        set file_exists to false
        beep 3
        display dialog "Please install \"ffmpeg\" on /usr/local/bin/ and try again." with title "Could not find \"ffmpeg\"!" with icon theicon buttons {"OK"} default button 1
        return
    end try


    FFmpeg.workflow

    • Check ob ffmpeg installiert ist
    • Es werden die Errors in einer ffmpeg_errors.log geschrieben und in Dokumente abgelegt.
    • Bei erfolgreichen Erstellen der Video Datei wird eine ffmpeg_video_created.log in Dokumente erstellt
    Code:
    on run {input, parameters}
        set ffmpegPath to "/usr/local/bin/ffmpeg"
        try
            POSIX file (ffmpegPath) as alias
            set file_exists to true
            set file_path_output_file_options to ((path to documents folder) & "ffmpeg_output_file_options.txt") as string
            set file_path_output_format to ((path to documents folder) & "ffmpeg_output_format.txt") as string
            set logPath_ffmpeg_video_created to (path to documents folder as string) & "ffmpeg_video_created.log"
            set logPath_ffmpeg_errors to (path to documents folder as string) & "ffmpeg_errors.log"
            set fcount to 0
            display dialog "Should the script be executed?" buttons {"Yes", "No"} with title "ffmpeg"
            set DlogResult to result
            if button returned of result = "Yes" then
                try
                    read file file_path_output_file_options
                    set output_file_options to result
                    read file file_path_output_format
                    set output_format to result
                    repeat with i in input
                        set fname to POSIX path of i
                        set o to text 1 thru -5 of fname
                        do shell script ffmpegPath & " -i " & quoted form of fname & " " & output_file_options & " " & quoted form of (o & ".") & output_format
                        set fcount to fcount + 1
                        try
                            set logFile to open for access file logPath_ffmpeg_video_created with write permission
                            write (date string of (current date) & " " & time string of (current date) & " -- " & ffmpegPath & " -i " & quoted form of fname & " " & output_file_options & " " & quoted form of (o & ".") & output_format & return) to logFile starting at eof
                            close access logFile
                            try
                                close access logFile
                            end try
                        end try
                    end repeat
                    display notification "Number of files converted: " & fcount with title "ffmpeg"
                on error errorMessage
                    try
                        set logFile to open for access file logPath_ffmpeg_errors with write permission
                        write (errorMessage & return) to logFile starting at eof
                        beep 3
                        tell application "Console"
                            activate
                            open logPath_ffmpeg_errors
                        end tell
                        close access logFile
                    on error
                        try
                            close access logFile
                        end try
                    end try
                end try
            else
                beep 3
            end if
            return fcount
        on error
            set file_exists to false
            beep 3
            display dialog "Please install \"ffmpeg\" on /usr/local/bin/ and try again." with title "Could not find \"ffmpeg\"!" buttons {"OK"} default button 1
            return
        end try
    end run
    PS. Es gibt noch ein kleinen Schönheit's Fehler. Bei ein Fehler soll ja die ffmpeg_errors.log mit der Konsole.app angezeigt werden. Das geht auch soweit aber es wird dann auch noch ein 2 Konsolen Fenster Angezeigt was nicht gewollt ist. Ihr der Code dazu. Wo ist da der Fehler?

    Code:
    set logPath_ffmpeg_errors to (path to documents folder as string) & "ffmpeg_errors.log"
    Code:
                on error errorMessage
                    try
                        set logFile to open for access file logPath_ffmpeg_errors with write permission
                        write (errorMessage & return) to logFile starting at eof
                        beep 3
                        tell application "Console"
                            activate
                            open logPath_ffmpeg_errors
                        end tell
                        close access logFile
                    on error
                        try
                            close access logFile
                        end try
                    end try
                end try
    Im Bild zu sehen, Links. Die Mitteilungen sollen natürlich nicht Angezeigt werden. Wie bekomme ich das hin?

    [​IMG]
     

    Anhänge:

    kelevra gefällt das.
  5. flashi

    flashi Idared

    Dabei seit:
    11.01.19
    Beiträge:
    27
    Den Schönheit's Fehler habe ich selbst Korrigiert. Jetzt wird bei ein Fehler nur die Datei ffmpeg_errors.log geöffnet und bei Erfolg nur die Datei ffmpeg_video_created.log geöffnet

    Alter Code für ffmpeg_errors.log
    Code:
               on error errorMessage
                   try
                       set logFile to open for access file logPath_ffmpeg_errors with write permission
                       write (errorMessage & return) to logFile starting at eof
                       beep 3
                       tell application "Console"
                           activate
                           open logPath_ffmpeg_errors
                       end tell
                       close access logFile
                   on error
                       try
                           close access logFile
                       end try
                   end try
    
    Neuer Code für ffmpeg_errors.log
    Code:
                on error errorMessage
                    try
                        set logFile to open for access file logPath_ffmpeg_errors with write permission
                        write (errorMessage & return) to logFile starting at eof
                        beep 3
                        set hiddenscriptpath to logPath_ffmpeg_errors
                        set hiddenscriptpath to POSIX path of hiddenscriptpath
                        set qtdhiddenscriptpath to quoted form of hiddenscriptpath
                        try
                            set command to "open " & qtdhiddenscriptpath
                            do shell script command
                        end try
                        close access logFile
                    on error
                        try
                            close access logFile
                        end try
                    end try
                end try

    Neuer Code für ffmpeg_video_created.log
    Code:
    display notification "Number of files converted: " & fcount with title "ffmpeg"
    
    set hiddenscriptpath to logPath_ffmpeg_video_created
    
    set hiddenscriptpath to POSIX path of hiddenscriptpath
    
    set qtdhiddenscriptpath to quoted form of hiddenscriptpath
    
    try
    
    set command to "open " & qtdhiddenscriptpath
    
    do shell script command
    
    end try