1 votos

Uso de Applescript en la aplicación Automator para ejecutar ffmpeg

ffmpeg funciona exactamente como quiero. Estoy seguro de que lo siguiente no es súper limpio pero funciona con una excepción: simplemente añade el .mp4 al nombre del archivo original para que el nuevo nombre del archivo parezca tener dos extensiones.

He pasado días buscando problemas similares en múltiples foros sin ninguna ayuda real. He intentado copiar y pegar sugerencias con diferentes errores. Realmente me gustaría arrastrar un archivo de vídeo a este applet y hacer que se ejecute ffmpeg de la manera que he especificado en la parte del shell con el archivo de salida resultante que se crea en la ubicación del archivo de entrada, pero con una extensión diferente.

He probado la forma "filesString" y la forma "f\" + "{$f%.*}" y por la razón que sea eso no parece hacer nada más que abrir el terminal con el texto del shell. Otras opciones resultan en un mensaje que dice que "NO HAY SALIDA ADECUADA" lo que finalmente he descubierto que significa, "lo que sea que estés haciendo es genial, pero te voy a dar este error hasta que quites los espacios de tu nombre de archivo/carpetas".

Así que:

  1. Para soltar un archivo y que se convierta en un archivo con las normas especificadas. (comprobar)

  2. Haz que ese archivo de salida vuelva a la carpeta donde vive el archivo de entrada. (comprobar)

  3. Pero sólo con la nueva extensión. (falla)

  4. Una ventaja sería editar el script de forma que pudiera soltar una carpeta de archivos en el applet y que se convirtieran de uno en uno. Creo que puedo soltar una carpeta en este momento pero entonces se abren múltiples instancias de Terminal y se procesan simultáneamente. Me gustaría que los archivos se procesaran de uno en uno.


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

3voto

user3439894 Puntos 5883

Esto soluciona el número 3, el problema de la doble extensión de los archivos.

He modificado el código a continuación de su original código de las siguientes maneras:

Se ha añadido el remove_extension(this_name) subrutina desde el fondo del Subprogramas esenciales página.

Cambiado:

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

Para:

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

Eliminado & ".mp4" desde el final de la do script ... línea.

Luego lo probé en un .mkv y aunque el proceso se inició, sin embargo lo detuve poco después, ya que era sólo una prueba para ver el filename.mkv le escribía a filename.mp4 Y así fue.

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

Si desea utilizar el AppleScript's text item delimiters método , envuelto en un subrutina y sustituir el actual on remove_extension(this_name) subrutina con la siguiente, dejando los otros cambios que hice a su código como yo.

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

Esto es esencialmente hacer lo mismo que el original on remove_extension(this_name) subrutina que utilicé por primera vez, es sólo un método diferente utilizando lo que se mencionó en la respuesta de user14492, sólo que presentado en lo que yo consideraría una forma más adecuada.

0voto

Pejvan Puntos 376

Prueba esto:

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

Más sobre delimitador de texto .

Para añadir soporte de carpetas, intente algo como esto:

#First check if it's folder
set mp4Files to every file of inputFolder whose name extension is "mp4"

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X