【问题标题】:how can I get the length of an video in order to validate django form before upload can begin?如何获取视频的长度以便在开始上传之前验证 django 表单?
【发布时间】:2013-07-07 19:10:33
【问题描述】:

我有一个在 heroku 上运行的应用程序,允许用户上传视频,然后我使用 ffmpeg 使用 celery 和 redis-to-go 执行 3 个任务:

1) Check the format and if it isn't already mp4, convert it to mp4.
2) Extract a 3 minute clip, in mp4 format
3) Grab an image from the video

问题是我想在上传视频之前验证视频长度并运行三个任务,因为我想确保所有视频至少 15 分钟,如果不是,我想引发 ValidationError。所以在验证表单时,我想做这样的事情:

def clean(self, *args, **kwargs):        
    data = super(ContentTypeRestrictedVideoField, self).clean(*args, **kwargs)

    file = data.file
    try:
        content_type = file.content_type
        main, extension = content_type.split('/')
        if content_type in self.content_types:
            if file._size > self.max_upload_size:
                raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(self.max_upload_size), filesizeformat(file._size)))
            if VIDEO_LENGTH < MINIMUM_LENGTH:
                raise forms.ValidationError(_('Please make sure video file is at least %s. Current video length %s') % (MINIMUM_LENGTH, VIDEO_LENGTH)
        else:
            raise forms.ValidationError(_('File type is not supported. File must be mov, flv, avi, mpeg, wmv, or mp4.'))
    except AttributeError:
        pass        

    return data

我可以为 VIDEO_LENGTH 和 MINIMUM_LENGTH 做什么?我读到 ffprobe 可用于获取持续时间,但它不适用于我正在使用的 buildpack 并且我非常缺乏经验。我不能只验证文件大小,因为它可能会因许多因素而有很大差异。有人对我可以尝试什么有任何解决方案吗?谢谢

【问题讨论】:

    标签: python django ffmpeg django-forms


    【解决方案1】:

    我能够使用 moviepy 完成此操作。

    我的用例有点不同,但原理应该是一样的。

    from moviepy.editor import *
    
    
    def video_form_upload(request):
    if request.method == 'POST':
        form = VideoForm(request.POST, request.FILES)
    
        if form.is_valid():
            obj = form.save(commit=False)
            # 'upload' is the name of the input field
            vid = request.FILES['upload']
            clip = VideoFileClip(vid.temporary_file_path())
            obj.duration = clip.duration
            obj.save()
            return HttpResponseRedirect("/video/")
    else:
        form = VideoForm()
    context = {
        "form": form
    }
    return render(request, 'html/media/upload.html', context)
    

    【讨论】:

      【解决方案2】:

      如果我正确理解了您的问题,您是在尝试知道视频的长度而不上传视频。该代码应该存在于客户端机器中。

      您可以在客户端机器上执行的唯一代码是 Javascript,并且可能:

      1. 闪光
      2. Java 小程序
      3. 任何其他(取决于浏览器插件)客户端逻辑。

      这是我认为完成您想要的任务的唯一方法,当然,您不能假设每个浏览器都具有所需的扩展程序,也不能假设客户端都安装了 ffmpeg

      恕我直言,我认为您无法以这种方式完成任务。您应该上传文件并对其进行验证,如果验证未通过,则将其删除。

      希望这会有所帮助!

      【讨论】:

      • 谢谢。虽然这不是我想听到的,但它确实有帮助,因为现在我知道我无法按照我一直尝试的方式去做。
      • 不客气。我知道这是个坏消息,但我只是没有办法做到这一点。此外,您可以警告您的用户不要上传超过 15 分钟的视频,当他/她这样做时,您只需将其丢弃在服务器端。用户有罪并浪费了他/她的时间没有阅读警告:)
      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2013-01-24
      • 2012-01-02
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多