Utilizzo di Applescript nell'app Automator per eseguire ffmpeg

0

ffmpeg funziona esattamente come lo voglio io. Sono sicuro che quanto segue non è super pulito, ma funziona con un'eccezione: aggiunge semplicemente .mp4 al nome file originale in modo che il nuovo nome file abbia due estensioni.

Ho trascorso giorni a cercare problemi simili su più forum senza un vero aiuto. Ho provato a copiare e incollare suggerimenti con diversi errori. Mi piacerebbe davvero trascinare un file video su questa applet e farlo girare ffmpeg come ho specificato nella parte della shell con il file di output risultante creato nella posizione del file di input ma con un'estensione diversa.

Ho provato il metodo "filesString" e il \ "f \" + "{$ f%. *}" e per qualsiasi motivo non sembra che faccia nulla tranne il terminale aperto con il testo della shell . Altre opzioni danno luogo a un messaggio che afferma che c'è "NO USIT OUTPUT" che ho finalmente capito significa "qualunque cosa tu stia facendo è grandiosa, ma ti darò questo errore fino a che non togli gli spazi dal tuo file nome / cartelle ".

  1. Per rilasciare un file e convertirlo in file con gli standard specificati. (Controllo)

  2. Il file di output torna alla cartella in cui risiede il file di input. (Controllo)

  3. Ma con solo la nuova estensione. (Fail)

  4. Un bonus sarebbe quello di modificare lo script in modo tale da poter rilasciare una cartella di file sull'applet e convertirli 1 alla volta. Credo di poter rilasciare una cartella in questo momento ma poi apre più istanze di Terminale e processi contemporaneamente. Mi piacerebbe che i file venissero processati 1 alla volta.

on run {input, parameters}
    repeat with file_ in input
        tell application "System Events"
            set inputFilename to name of (get properties of file_)
        end tell
        set inputFilePath to quoted form of (POSIX path of file_)
        set outputFilePath to quoted form of (POSIX path of file_)
        tell application "Terminal"
            activate
            do script "/usr/local/Cellar/ffmpeg/3.0.2/bin/ffmpeg -i " & inputFilePath & " -aspect 4:3 -vf yadif=0:-1:0,scale=720:486 -acodec libfdk_aac -cutoff 20000 -vcodec libx264 -preset medium -pix_fmt yuv420p " & outputFilePath & ".mp4"
        end tell
    end repeat
    return input
end run
    
posta Rachman 15.09.2016 - 01:15
fonte

2 risposte

2

Questo si occupa del numero 3, il problema dell'estensione del doppio file.

Ho modificato il codice sotto dal tuo codice originale nei seguenti modi:

Aggiunta la subroutine remove_extension(this_name) dalla parte inferiore delle Sub-routine essenziali pagina.

Modificato:

set outputFilePath to quoted form of (POSIX path of file_)

A:

set outputFilePath to quoted form of (my remove_extension(POSIX path of file_) & ".mp4")

Rimosso & ".mp4" dalla fine della riga do script ... .

L'ho testato su un file .mkv effettivo e mentre il processo è iniziato, tuttavia l'ho interrotto poco dopo, poiché era solo un test per vedere che filename.mkv originale stava scrivendo su filename.mp4 , e lo era.

on remove_extension(this_name)
    if this_name contains "." then
        set this_name to (the reverse of every character of this_name) as string
        set x to the offset of "." in this_name
        set this_name to (text (x + 1) thru -1 of this_name)
        set this_name to (the reverse of every character of this_name) as string
    end if
    return this_name
end remove_extension

on run {input, parameters}
    repeat with file_ in input
        tell application "System Events"
            set inputFilename to name of (get properties of file_)
        end tell
        set inputFilePath to quoted form of (POSIX path of file_)
        set outputFilePath to quoted form of (my remove_extension(POSIX path of file_) & ".mp4")
        tell application "Terminal"
            activate
            do script "/usr/local/Cellar/ffmpeg/3.0.2/bin/ffmpeg -i " & inputFilePath & " -aspect 4:3 -vf yadif=0:-1:0,scale=720:486 -acodec libfdk_aac -cutoff 20000 -vcodec libx264 -preset medium -pix_fmt yuv420p " & outputFilePath
        end tell
    end repeat
    return input
end run

Se si desidera utilizzare il metodo AppleScript's text item delimiters , racchiuso in una subroutine , sostituire la% subroutine esistente con on remove_extension(this_name) con seguendo uno, lasciando le altre modifiche che ho apportato al tuo codice come ho fatto io.

on remove_extension(this_name)
    try
        set oldDelims to AppleScript's text item delimiters
        set AppleScript's text item delimiters to {"."}
        if number of text items of this_name > 1 then
            set this_name to (text items 1 thru -2 of this_name as text)
        end if
        set AppleScript's text item delimiters to oldDelims
    on error
        set AppleScript's text item delimiters to oldDelims
    end try
    return this_name
end remove_extension

Questo essenzialmente fa la stessa cosa della% originaleon remove_extension(this_name) subroutine che ho usato per la prima volta, è solo un metodo diverso che usa quello che è stato menzionato nella risposta di user14492, presentato solo in quello che considererei essere una forma più corretta.

    
risposta data 15.09.2016 - 03:34
fonte
0

Prova questo:

set posixPath to (POSIX path of file_)
set AppleScript's text item delimiters to "."
if number of text items of posixPath > 1 then
    set outputFilePath to quoted form of (text items 1 thru -2 of posixPath as text)
end if

Ulteriori informazioni su delimitatore di testo .

Per aggiungere il supporto per le cartelle, prova qualcosa del tipo:

#First check if it's folder
set mp4Files to every file of inputFolder whose name extension is "mp4"
    
risposta data 15.09.2016 - 03:12
fonte

Leggi altre domande sui tag