我有一个在heroku上运行的应用程序允许用户上传视频,然后我使用ffmpeg使用芹菜和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并且我非常缺乏经验。我不能仅仅验证文件大小,因为它可能会因许多因素而有很大差异。任何人都有任何解决方案,我可以尝试什么?感谢
答案 0 :(得分:0)
如果我正确理解了您的问题,那么您无需上传即可了解视频的长度。该代码应该存在于客户机中。
您可以在客户端计算机上执行的唯一代码是Javascript,可能是:
这是我看到完成您想要的任务的唯一方式,当然,您不能假设每个浏览器都需要扩展名,客户端也没有安装ffmpeg
。
希望这有帮助!
答案 1 :(得分:0)
我能够使用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)