我有一个模型 for Video:
class Video(models.Model):
title = models.CharField(max_length=75)
pubdate = models.DateTimeField(default=timezone.now)
original_video = models.FileField(upload_to=get_upload_file_name)
mp4_720 = models.FileField(upload_to=get_upload_file_name,blank=True, null=True)
converted = models.BooleanField(default=False)
这是 views.py :
def upload_video(request):
if request.POST:
form = VideoForm(request.POST, request.FILES)
if form.is_valid():
video = form.save(commit=False)
video.save()
convert_video.delay(video.id)
return HttpResponseRedirect('/')
最后 tasks.py :
def get_upload_file_name(video):
name = video.title
name = name+'.mp4'
return name
from pyvid.settings import MEDIA_ROOT
@app.task
def convert_video(video_id):
video = Video.objects.get(id=video_id)
video_path = str(MEDIA_ROOT)+'/'+str(video.original_video)
convert_video_name = get_upload_file_name(video)
cmd = 'ffmpeg -i %s -codec:v libx264 -profile:v baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -codec:a libfdk_aac -movflags +faststart %s.mp4' % (video_path, convert_video_name)
subprocess.call(
cmd,
shell=True
)
video.mp4_720 = convert_video_name
video.converted = True
video.save()
问题是,即使要video.mp4_720
上传upload_to=get_upload_file_name()
,它只需要获取convert_video_name文件路径的值(这是转换后的视频并位于项目的基本目录中)但不能将新文件上传到指定的路径。
如何使用上传的路径将新转换的文件上传到mp4_720
的文件字段?
谢谢
答案 0 :(得分:0)
1. upload_to
保存相对于MEDIA_ROOT
(ref)的图片。
只有当您使用表单上传文件时,此工作才有效,但在此处,您手动设置video.mp4_720
。
2.转换视频时,您应该将输出保存在MEDIA_ROOT中(您应该提供绝对URL)但是您只是提供文件名, 修改你的代码:
video_path = str(MEDIA_ROOT)+'/'+str(video.original_video)
convert_video_name = get_upload_file_name(video)
output_path = MEDIA_ROOT + '/' + convert_video_name
cmd = 'ffmpeg -i %s -codec:v libx264 -profile:v baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -codec:a libfdk_aac -movflags +faststart %s.mp4' % (video_path, output_path)
MEDIA_ROOT
相关的文件路径。现在,您的代码应该在语句video.mp4_720 = convert_video_name
中已经相对于MEDIA_ROOT
。我希望这能解决你的问题。我必须测试代码。