Usando Applescript en la aplicación Automator para ejecutar ffmpeg

0

ffmpeg se ejecuta exactamente como lo deseo. Estoy seguro de que lo siguiente no es súper limpio, pero funciona con una excepción: simplemente agrega .mp4 al nombre de archivo original para que el nuevo nombre de archivo parezca tener dos extensiones.

He pasado días buscando problemas similares en varios foros sin ayuda real. He intentado copiar y pegar sugerencias con diferentes errores. Realmente me gustaría arrastrar un archivo de video 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 creado en la ubicación del archivo de entrada pero con una extensión diferente.

He intentado la forma "filesString" y la \ "f \" + "{$ f%. *}" y por cualquier motivo que no haga nada más que abrir el terminal con el texto del shell . Otras opciones dan como resultado un mensaje que indica que no hay "NINGUNA SALIDA ADECUADA" que finalmente he descubierto significa "lo que esté haciendo es genial, pero le daré este error hasta que saque los espacios de su archivo. nombre / carpetas. "

Entonces:

  1. Para colocar un archivo y convertirlo en un archivo con los estándares especificados. (marcar)

  2. Haga que el archivo de salida regrese a la carpeta donde se encuentra el archivo de entrada. (marcar)

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

  4. Un bono sería editar el script para que yo pueda colocar una carpeta de archivos en el applet y hacer que conviertan 1 a la vez. Creo que puedo eliminar una carpeta en este momento, pero luego abre varias instancias de Terminal y se procesa simultáneamente. Me gustaría que los archivos se procesen 1 a la vez.

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
    
pregunta Rachman 15.09.2016 - 01:15

2 respuestas

2

Esto se ocupa del número 3, el problema de la extensión de archivo doble.

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

Se agregó la subrutina remove_extension(this_name) desde la parte inferior de las Sub-rutinas 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")

Se eliminó & ".mp4" del final de la línea do script ... .

Luego lo probé en un archivo .mkv real y, aunque el proceso comenzó, no obstante, lo detuve poco después, ya que era solo una prueba para ver que filename.mkv original estaba escribiendo en filename.mp4 , y 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 usar el método AppleScript's text item delimiters , envuelto en una subrutina , reemplace la existente subrutina on remove_extension(this_name) con la siguiendo uno, dejando los otros cambios que hice en tu código como lo hice.

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

Básicamente, se trata de hacer lo mismo que la primera subrutina on remove_extension(this_name) que usé, es solo un método diferente utilizando lo que se mencionó en la respuesta del usuario 14492, solo se presenta en lo que consideraría que es una forma más adecuada.

    
respondido por el user3439894 15.09.2016 - 03:34
0

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 información sobre delimitador de texto .

Para agregar soporte para carpetas, intente algo como esto:

#First check if it's folder
set mp4Files to every file of inputFolder whose name extension is "mp4"
    
respondido por el user14492 15.09.2016 - 03:12

Lea otras preguntas en las etiquetas