我想使用芹菜转码用户上传的视频。我想首先我应该上传视频,然后产生一个用于转码的芹菜任务。
在tasks.py中可能是这样的:
subprocess.call('ffmpeg -i path/.../original path/.../output')
刚刚完成First steps with celery,在views.py
和tasks.py
中如此混淆了。这也是一个很好的解决方案吗?我非常感谢你的帮助和建议。谢谢。
models.py:
class Video(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=100)
original = models.FileField(upload_to=get_upload_file_name)
mp4_480 = models.FileField(upload_to=get_upload_file_name, blank=True, null=True)
mp4_720 = models.FileField(upload_to=get_upload_file_name, blank=True, null=True)
privacy = models.CharField(max_length=1,choices=PRIVACY, default='F')
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
我的不完整的views.py:
@login_required
def upload_video(request):
if request.method == 'POST':
form = VideoForm(request.POST, request.FILES)
if form.is_valid():
if form.cleaned_data:
user = request.user
#
#
# No IDEA WHAT TO DO NEXT
#
#
return HttpResponseRedirect('/')
else:
form = VideoForm()
return render(request, 'upload_video.html', {
'form':form
})
答案 0 :(得分:1)
我想你已经解决了这个问题,但我会提供更多信息来说明已经说过的GwynBleidD,因为我遇到了同样的问题。
因此,作为GwynBleidD,您需要调用Celery任务,但是如何编写这些任务?这是结构:
首先,在您的设置中设置FFMPEG_PATH
变量,然后:
import os, subprocess
from .models import Video
@app.task
def encode_mp4(video_id, height):
try:
video = Video.objects.get(id = video_id)
input_file_path = video.original.path
input_file_name = video.original.name
#get the filename (without extension)
filename = os.path.basename(input_file_path)
# path to the new file, change it according to where you want to put it
output_file_name = os.path.join('videos', 'mp4', '{}.mp4'.format(filename))
output_file_path = os.path.join(settings.MEDIA_ROOT, output_file_name)
# 2-pass encoding
for i in range(1):
subprocess.call([FFMPEG_PATH, '-i', input_file_path, '-s', '{}x{}'.format(height * 16 /9, height), '-vcodec', 'mpeg4', '-acodec', 'libvo_aacenc', '-b', '10000k', '-pass', i, '-r', '30', output_file_path])
# Save the new file in the database
video.mp4_720.name = output_file_name
video.save(update_fields=['mp4_720'])
答案 1 :(得分:0)
修改您的模型,以便您可以保存原始(已上传)视频而无需转码版本,并可能在您的模型中添加一些标记,以便在视频转码时保存状态(并根据该标记,您可以向用户显示该视频转码仍在进行中。)
上传视频并将其模型保存到数据库后,运行celery任务将视频的ID传递给它。在芹菜任务中从数据库中检索视频,对其进行转码并将其保存到带有更改标志的数据库中。