ffmpeg-python
ffmpeg-python es un wrapper (un conector) para interactuar con el utilitario FFMPEG, el cual permite manipular video, audio e imágenes.
Instalar
Se necesita instalar el utilitario en el sistema operativo:
El wrapper (conector) para Python se instala mediante PIP
Importar
Ejemplos de uso
Cortar clip (trim)
# REVISAR: IMAGEN CONGELADA AL COMIENZO
import ffmpeg
ruta_entrada = "demo.mp4"
ruta_salida = "clip.mp4"
video = ffmpeg.input(ruta_entrada)
video = video.trim(start=20, duration=5) # MAL
video = ffmpeg.output(video, ruta_salida)
ffmpeg.run(video)
Otra alternativa:
# ...
# tiempo en segundos
inicio = 10
fin = 20
video = ffmpeg.input(ruta_entrada, ss=inicio, to=fin)
video = ffmpeg.output(video, ruta_salida)
ffmpeg.run(video)
Notación reducida:
# ...
# tiempo en segundos
inicio = 10
fin = 20
(
ffmpeg.input(ruta_entrada,ss=inicio, to=fin)
.output( ruta_salida)
.run()
)
Dimensiones
import ffmpeg
ruta_entrada = "demo.mp4"
probe = ffmpeg.probe(ruta_entrada)
video = next(
(stream for stream in probe["streams"] if stream["codec_type"] == "video"), None
)
ancho = int( video["width"])
alto = int(video["height"])
Miniatura
import ffmpeg
ruta_entrada = "demo.mp4"
# Ejemplo 1: PNG con anchura 500 px
salida_png = "miniatura.png"
instante = 4 # segundo 4
ancho = 500 # 500 px
alto = -1 # automatico
video = ffmpeg.input(ruta_entrada, ss=instante)
video = video.filter("scale", ancho, alto) # (mantiene proporcion)
video = ffmpeg.output(video, salida_png , vframes=1)
# orden de ejecucion
ffmpeg.run(video)
Invertir imagen (flip)
import ffmpeg
ruta_entrada = "demo.mp4"
salida_horizontal = "horizontal.mp4"
salida_vertical = "vertical.mp4"
Volteo horizontal
# 'hflip': voltea de derecha a izquierda
video = ffmpeg.input(ruta_entrada)
video = ffmpeg.hflip(video)
video = ffmpeg.output(video, salida_horizontal)
# orden de ejecucion
ffmpeg.run(video)
Volteo vertical:
# 'vflip' : voltea de arriba a abajo
video = ffmpeg.input(ruta_entrada)
video = ffmpeg.vflip(video)
video = ffmpeg.output(video, salida_vertical)
# orden de ejecucion
ffmpeg.run(video)
Convertir Video
import ffmpeg
ruta_entrada = "demo.mp4"
ruta_salida = "demo.wmv"
(
ffmpeg.input(ruta_entrada)
.output(ruta_salida)
.run()
)
Extraer Audio
import ffmpeg
ruta_entrada = "demo.mp4"
audio_salida = "audio.mp3"
(
ffmpeg.input(ruta_entrada)
.output(audio_salida)
# .output(audio_salida , acodec='libshine') # codec personalizado
.run()
)
Extraer frames (imagenes del video)
- Número fijo de frames, desde el comienzo del video:
import ffmpeg
ruta_entrada = "demo.mp4"
frames_salida = "frame_%d.png" # formato para nombrar los frames de salida
nro_frames = 500 # primeros 500 frames de video
(
ffmpeg.input(ruta_entrada)
.output(frames_salida , vframes=nro_frames)
.run()
)
- Tasa de frames por segundo a elección, desde el comienzo:
import ffmpeg
ruta_entrada = "demo.mp4"
frames_salida = "frame_%d.png" # formato para nombrar los frames de salida
fps = 0.1 # 1 frame cada 10 segundos
(
ffmpeg.input(ruta_entrada)
.output(frames_salida , vf=f'fps={fps}')
.run()
)
Thumbnails
- Una captura, tiempo elegido por usuario:
import ffmpeg
ruta_entrada = "demo.mp4"
thumbnail_salida = "thumbnail.png"
## instante fijo
(
ffmpeg.input(ruta_entrada, ss="00:00:15")
.output(thumbnail_salida, vframes=1)
.run()
)
- Una captura, elegida automáticamente entre los 100 primeros frames (valor predefinido):
import ffmpeg
ruta_entrada = "demo.mp4"
thumbnail_salida = "thumbnail.png"
# ventana seleccion 100 muestras (default)
(
ffmpeg.input(ruta_entrada)
.filter('thumbnail')
.output(thumbnail_salida, vframes=1)
.run()
)
- Una captura, elegida automáticamente entre los N primeros frames:
import ffmpeg
ruta_entrada = "demo.mp4"
thumbnail_salida = "thumbnail.png"
nro_frames = 500
# ventana seleccion 500 muestras
(
ffmpeg.input(ruta_entrada)
.filter('thumbnail', n=nro_frames)
.output(thumbnail_salida, vframes=1)
.run()
)