es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de Python FileNotFoundError: [Errno 2] No existe el archivo o directorio: ‘ffprobe’ en Synology.

Estaba haciendo un pequeño script de Python 3.8 para ordenar fotos y videos según sus metadatos en mi Synology NAS (trabajando en DSM 7.0), en general funciona bien en Ubuntu pero falla en el NAS con este error:

FileNotFoundError: [Errno 2] No existe el archivo o el directorio: ‘ffprobe’

He estado buscando en todas partes ayuda sobre este problema, vi esta publicación y probé las soluciones pero aún así obtengo el error en cualquier video del cual intento leer metadatos.

Tengo instalado ffmpeg, ffmpeg-python y ffprobe-python.

Aquí está mi código de prueba:

from datetime import datetime
import ffmpeg

name = "VID20200130_185053.mp4"
path = "/volume1/photo/phone/DCIM/Camera/"
data_keys = ["DateTimeOriginal", "DateTime", "creation_time"]
file = f"{path}{name}"
print(file)
vid = ffmpeg.probe(file)['streams']

vid = ffprobe.FFProbe(file).streams

for key in data_keys:
    if key in vid[0]['tags']:
        print(datetime.strptime(vid[0]['tags'].get(key).split('T')[0], "%Y-%m-%d"))
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error indica que el script no puede encontrar el ejecutable de ffprobe. A pesar de que ffmpeg, ffmpeg-python y ffprobe-python están instalados, asegúrese de que ffprobe también esté instalado y sea accesible desde la línea de comandos en su Synology NAS.

    Una posible solución sería usar la ruta completa al ejecutable de ffprobe en el script, por ejemplo:

    import ffmpeg
    
    name = "VID_20200130_185053.mp4"
    path = "/volume1/photo/phone/DCIM/Camera/"
    data_keys = ["DateTimeOriginal", "DateTime", "creation_time"]
    file = f"{path}{name}"
    print(file)
    vid = ffmpeg.probe(file, cmd='ffprobe')
    for key in data_keys:
        if key in vid[0]['tags']:
            print(datetime.strptime(vid[0]['tags'].get(key).split('T')[0], "%Y-%m-%d"))
    

    Tenga en cuenta la adición del parámetro cmd='ffprobe' al llamar a ffmpeg.probe(), que especifica la ruta completa al ejecutable de ffprobe.

    Alternativamente, podría intentar agregar el directorio que contiene el ejecutable de ffprobe a la variable de entorno PATH antes de ejecutar el script, por ejemplo:

    import os
    import subprocess
    import ffmpeg
    
    os.environ["PATH"] += os.pathsep + "/ruta/al/directorio/de/ffprobe"
    
    name = "VID_20200130_185053.mp4"
    path = "/volume1/photo/phone/DCIM/Camera/"
    data_keys = ["DateTimeOriginal", "DateTime", "creation_time"]
    file = f"{path}{name}"
    print(file)
    cmd = ["ffprobe", "-v", "quiet", "-print_format", "json", "-show_streams", file]
    result = subprocess.check_output(cmd).decode("utf-8")
    vid = json.loads(result)["streams"]
    for key in data_keys:
        if key in vid[0]['tags']:
            print(datetime.strptime(vid[0]['tags'].get(key).split('T')[0], "%Y-%m-%d"))
    

    Aquí, agregamos el directorio de ffprobe a la variable de entorno PATH antes de importar los módulos necesarios, y luego usamos el módulo subprocess para ejecutar ffprobe como un proceso separado e interpretar su salida. Tenga en cuenta que también usamos el formato de salida json en lugar del formato de clave-valor predeterminado para facilitar el análisis.

    ¡Espero que esto ayude!

Comments are closed.