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.

¿Cómo poner y acceder a un archivo con FFmpeg en Google Cloud Storage? Para comenzar, asegúrate de tener una cuenta activa de Google Cloud Storage y tener instalado FFmpeg en tu sistema. 1. Subir el archivo a Google Cloud Storage: – Accede a tu cuenta de Google Cloud Platform y abre la consola de administración. – Navega hasta el Google Cloud Storage. – Crea un nuevo bucket o selecciona uno existente donde desees almacenar el archivo. – Haz clic en el botón “Cargar archivos” y selecciona el archivo que deseas subir. – Espera a que finalice la carga del archivo. 2. Usar FFmpeg para acceder al archivo en Google Cloud Storage: – Abre una ventana de terminal o línea de comandos en tu sistema. – Accede al directorio donde tienes instalado FFmpeg. – Utiliza el comando de FFmpeg para acceder al archivo en Google Cloud Storage. El formato general del comando es el siguiente: ffmpeg -i gs://ruta/al/archivo -opciones_de_transformación salida_deseada – Reemplaza “gs://ruta/al/archivo” con la ruta de acceso completa al archivo que deseas acceder. – Añade las opciones de transformación necesarias según tus requerimientos. – Especifica el nombre y la ubicación de la salida deseada. – Ejecuta el comando y espera a que FFmpeg procese el archivo. Ahora deberías poder poner y acceder a un archivo con FFmpeg en Google Cloud Storage. Recuerda adaptar las instrucciones según tus necesidades específicas y asegurarte de tener los permisos adecuados dentro de tu cuenta de Google Cloud Platform. ¡Buena suerte!

Hola, soy un desarrollador novato y desplegué mi primer proyecto Django en Heroku.
Quiero comprimirlo con ffmpeg y guardarlo en Google Cloud Storage cuando el usuario suba un archivo de video desde uploadForm en el proyecto Django. Y extrayendo la duración del video guardado utilizando ffprobe y almacenándola en el campo de duración del objeto.

El código Save() de mi archivo forms.py es el siguiente:

def save(self, *args, **kwargs):

    def clean_video(self):
        raw_video = self.cleaned_data.get("video")
        timestamp = int(time())
        raw_video_path = raw_video.temporary_file_path()
        print(raw_video_path)
        video_name = f"{raw_video}".split(".")[0]
        subprocess.run(f"ffmpeg -i {raw_video_path} -vcodec libx265 -crf 28 -acodec mp3 -y uploads/videoart_files/{video_name}_{timestamp}.mp4", shell=True)

        return f"videoart_files/{video_name}_{timestamp}.mp4"

    videoart = super().save(commit=False)
    videoart.video = clean_video(self)
    video_path = videoart.video.path
    get_duration =  subprocess.check_output(['ffprobe', '-i', f'{video_path}', '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")])
    duration = int(float(get_duration.decode('utf-8').replace("\n", ""))) 
    videoart.duration = duration

    return videoart

Después de todas las validaciones de los otros campos, coloco el código para procesar el video dentro del método save para comprimir el video al final. De todos modos, este código no es un problema en el servidor local, funciona muy bien. Sin embargo, el servidor produce un error de NotImplementedError (“Este backend no es compatible con rutas absolutas”).

Naturalmente, ffmpeg puede recibir videos de entrada desde temporary_file_path(), pero no encuentra una ruta de salida. Esta ruta absoluta no es la ruta de GCS. Sin embargo, ffmpeg no reconocerá la URL. No estoy seguro de cómo guardar un archivo creado en ffmpeg en el servidor de GCS y cómo acceder a él. ¿No me darías algunos consejos?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    ¡Hola!

    Parece que estás teniendo problemas para guardar tu video comprimido en Google Cloud Storage (GCS) en lugar del sistema de archivos local.

    Para guardar archivos directamente en GCS, necesitarás utilizar una de las bibliotecas de clientes de GCS. Django proporciona una clase de almacenamiento de GCS que puedes utilizar para guardar fácilmente archivos en GCS. Aquí tienes un ejemplo de cómo puedes modificar tu función clean_video para guardar el video comprimido en GCS:

    from django.conf import settings
    from django.core.files.storage import default_storage
    from django.core.files.base import ContentFile
    
    def clean_video(self):
        raw_video = self.cleaned_data.get("video")
        timestamp = int(time())
        raw_video_path = raw_video.temporary_file_path()
        print(raw_video_path)
        video_name = f"{raw_video}".split(".")[0]
        compressed_path = f"videoart_files/{video_name}_{timestamp}.mp4"
        subprocess.run(f"ffmpeg -i {raw_video_path} -vcodec libx265 -crf 28 -acodec mp3 -y {compressed_path}", shell=True)
    
        # Guardar video comprimido en GCS
        compressed_video = open(compressed_path, "rb")
        compressed_video_content = compressed_video.read()
        compressed_video_size = len(compressed_video_content)
        compressed_video.seek(0)
    
        media_path = default_storage.save(compressed_path, ContentFile(compressed_video_content))
        video_path = f"{settings.MEDIA_URL}{media_path}"
    
        compressed_video.close()
        os.remove(compressed_path)
    
        return video_path
    

    Primero, importa los módulos necesarios y define la función clean_video. Luego, deberás guardar el video comprimido en un archivo temporal que se subirá a GCS. En este ejemplo, estamos utilizando la función open para abrir el archivo de video comprimido como un archivo binario y leer su contenido. Luego, estamos utilizando el módulo default_storage de Django para guardar el archivo en GCS.

    Finalmente, estamos devolviendo la variable video_path, que contiene la URL del video comprimido en GCS.

    ¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.

Comments are closed.