¿La mejor manera de rotar por lotes más de 3000 videos h.264?

8

Tengo aproximadamente 3000 videoclips cortos, cada uno de unos 3 segundos de duración. Necesito rotar cada uno de ellos 90 grados. ¿Cuál es la mejor manera de hacer esto? Tengo una suscripción a Adobe Creative Cloud, así como acceso a máquinas Windows y Mac. Buscando la solución más fácil para automatizar / procesar por lotes la rotación de tantos videos.

Si se estaba preguntando, los videos son parte de un curso de aprendizaje electrónico sobre madera. El alumno ve cada video seleccionado al azar, que es solo un breve clip de una pieza de madera que gira. Los videos fueron grabados para que la madera (2x4, etc.) fuera horizontal. Pero ahora el cliente quiere que la madera sea vertical en los clips.

usuario172586
fuente
¿Solo rotación? Desde, por ejemplo, 1280x720 a 720x1280 ¿verdad?
p2or
Simplemente la rotación de 90 grados en el sentido de las agujas del reloj (o en sentido contrario a las agujas del reloj, no importa para este proyecto).
user172586
¿El contenedor de sus archivos de video incluye metadatos de 'orientación'?
audionuma

Respuestas:

9

Utilice ffmpegy el filtro de "transposición" como "pobre" sugerido . Por ejemplo, si sus archivos son mp4 y están en el directorio actual:

mkdir -p rotated
for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" rotated/"$f"; done
  • El valor de transposición puede ser "1" o "reloj" para rotación en sentido horario, "2" o "cclock" para rotación en sentido antihorario. Hay otros valores que también aplicarán un flip.

  • El audio se copiará en secuencia para evitar una nueva codificación innecesaria.

  • Los metadatos de rotación de transmisión de video se borran en este ejemplo. De ffmpeglo contrario, lo copiará de la entrada a la salida, lo que dará como resultado una rotación incorrecta para los jugadores que prestan atención a estos metadatos (algunos lo hacen y otros no).

Otro ejemplo, más detallado y flexible, y que mantiene el archivo girado en el mismo directorio con un nuevo nombre:

ext=mp4
for f in /some/dir/*.$ext; do
    new=${f/%.$ext/-rotated.$ext};
    ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" "$new"
done
mivk
fuente
¡Si! Debería aprender más acerca de los scripts Bash :)
p2or
1

Ha especificado que está interesado en trabajar en una gran cantidad de videos, si tiene una máquina multinúcleo y utilizará un forbucle normal proporcionado por su shell, tendrá uno de sus núcleos funcionando en caliente, mientras que otros no están haciendo absolutamente nada . Esto no es lo ideal.

Lo que debe hacer para tal trabajo es usar paralleluna herramienta que le permite iniciar varios trabajos a la vez, y puede hacer todo lo que puede hacer un bucle for, pero mejor.

No escribiré sobre todas las características de esta herramienta, pero me concentraré en su tarea específica.

Una forma de comenzar todos estos trabajos sería:

parallel avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Aquí {}reemplaza cada nombre de archivo, y {.}reemplaza el nombre de archivo sin una extensión.

Sugeriré que comience tantos trabajos como tenga núcleos, quítese uno. La razón de esto es que su sistema operativo seguirá siendo utilizable, y esto también le ahorrará en caso de que esté utilizando el cifrado de disco duro (que utilizará la potencia de procesamiento para leer / escribir datos). Para hacer esto, simplemente agregue --jobs -1a su línea de comando y limitará el número de trabajos.

parallel --jobs -1 avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Tenga en cuenta que no se dará salida hasta que se complete cada codificación. Por lo tanto, no verá cuánto de cada video se hace.

v010dya
fuente
1

Según esta respuesta , puede usar ffmpeg con los siguientes comandos para rotar un video:

ffmpeg -i input -vf transpose=2 output

Para procesar por lotes una carpeta de películas, puede usar un lenguaje de programación de su elección e iterar a través de los archivos. He usado Linux con Python 2.7+ aquí. Solo tiene que editar la folder_moviesruta path_to_ffmpegy configurar su película extension:

import os # import os module
import subprocess # import subprocess module

# set the path to your video folder
folder_movies = '/home/user/Desktop/test/'

# set ffmpeg path
path_to_ffmpeg = "/opt/ffmpeg/ffmpeg"

# set file extension
ext = ".mp4"

# collect all videos in folder_movies
movie_files = [f for f in os.listdir(folder_movies) if f.endswith(ext)] 

# iterate through the files
for i in movie_files:

    # setup correct filepath for mov's
    file_path = os.path.join(folder_movies,i)

    # generate new file path
    new_path = os.path.splitext(file_path)[0] + '_rotated_90' + ext

    # call ffmpeg with the correct arguments
    # command: ffmpeg -i input -vf transpose=2 output
    subprocess.call([path_to_ffmpeg, "-i",  file_path, "-vf", "transpose=2", "-c:a", "copy", new_path])

Luego, su carpeta de películas debería verse así:

ingrese la descripción de la imagen aquí

La ventaja de usar Python es que el código corre multiplataforma . Lo único que debe tener en cuenta son las rutas al directorio y el ejecutable ffmpeg. Para ejecutar esto en una máquina Windows solo tiene que reemplazar las rutas a algo como:

# folder_movies = '/home/user/Desktop/test/' # linux or osx
folder_movies = r'c:\some\directory\test'    # windows, the r is important
folder_movies = 'c:/some/directory\test'     # windows (alternative)

# path_to_ffmpeg = '/opt/ffmpeg/ffmpeg'            # linux or osx
path_to_ffmpeg = r'c:\Program Files\ffmpeg\ffmpeg' # windows, the r is important
path_to_ffmpeg = 'c:/Program Files/ffmpeg\ffmpeg'  # windows (alternative)

Nota: no soy un experto en ffmpeg, tal vez haya una forma de procesar por lotes directamente con él.

p2or
fuente
1
Realmente no necesitas un script completo para esto. Se puede hacer directamente en la línea de comandos de Mac o Linux con algo como: mkdir -p rotated; for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 rotated/"$f"; done(suponiendo que sus archivos de video sean .mp4 en este ejemplo).
mivk
@mivk bien, ¿por qué no convertir esto en una respuesta?
p2or
@mivk Dado que está utilizando un bucle for, es casi lo mismo. Para aquellos que no usan Linux u OSX, tiene sentido usar Python u otro lenguaje de script.
p2o
@poor: bueno, para aquellos usuarios que no están en Linux ni en Mac, la traducción a PowerShell se "deja como un ejercicio para el lector" ... :-)
mivk
@mivk jeje, sí, pero nadie quiere usarlo;)
p2o