首页 > 解决方案 > Django - 仅在文件更改时编码视频和音频文件

问题描述

django-storages用于在 Amazon S3 上存储媒体文件。我使用 boto3 开发了一个接口,以使用 Elastic Transcoder 对视频或音频文件进行编码。此外,对于视频文件,我将添加仍然使用 Elastic Transcoder 的水印徽标。

流程如下:

  1. 客户端应用程序通过我开发的 REST API 上传文件——完成
  2. Django 将文件存储在 Amazon S3 上——完成
  3. 如果是视频或音频,Django 将启动 Amazon Elastic Transcoder Job 来对文件进行编码。输出文件将添加到同一个 S3 存储桶上的不同路径。
  4. 使用 Amazon SNS,Django 将在编码文件准备就绪时收到通知

要启动编码过程,我正在考虑使用post_save. 所以我可以检查文件是否已上传,然后启动 Amazon Elastic Transcoder。例子:

@receiver(post_save, sender=MyModel)
def encode_file(sender, instance, created, **kwargs):
    if instance.content_type in ['video'] and instance.file:
        encode_file(instance.file) # Launch Amazon Elastic Transcoder

是否有更好的方法仅在文件更改时才启动视频或音频文件的编码过程?

标签: djangodjango-storageamazon-elastic-transcoder

解决方案


您可以在models.py中查看文件更新:</p>

class MyModel(models.Model):
    ...

    def save(self, *args, **kwargs):
        if not self.id:
            pass # for create
        else:
            # update
            this = MyModel.objects.get(id=self.id)
            if this.file != self.file:
                encode_file(instance.file) # Launch Amazon Elastic Transcoder
        return super(MyModel, self).save(*args, **kwargs)

之前super().save()的文件在数据库和内存中不同,所以你可以检查更新


推荐阅读