Python 芹菜来处理任务和修改模型字段

Python 芹菜来处理任务和修改模型字段,python,django,ffmpeg,celery,Python,Django,Ffmpeg,Celery,对于异步任务,我想使用ffmpeg和cellery将视频转换为mp4。当用户上传视频时,它将用于原始视频,并将其保存。之后,我希望芹菜将其转换为mp4\u 720字段的不同版本。然而,我对如何使用芹菜来应用这种逻辑感到困惑 app.models.py: class Video(models.Model): title = models.CharField(max_length=75) pubdate = models.DateTimeField(default=timezone.

对于异步任务,我想使用
ffmpeg
cellery
将视频转换为mp4。当用户上传视频时,它将用于
原始视频
,并将其保存。之后,我希望芹菜将其转换为
mp4\u 720
字段的不同版本。然而,我对如何使用芹菜来应用这种逻辑感到困惑

app.models.py:

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)
app.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()

            // Celery to convert the video
            convert_video.delay(video)

            return HttpResponseRedirect('/')
    else:
        form = VideoForm()
    return render(request, 'upload_video.html', {
        'form':form
    })
app.tasks.py:

@app.task
def convert_video(video):

    // Convert the original video into required format and save it in the mp4_720 field using the following command:
    //subprocess.call('ffmpeg -i (path of the original_video) (video for mp4_720)')

    // Change the converted boolean field to True

    // Save
基本上,我的问题是如何在mp4_720中保存转换后的视频。非常感谢您的帮助和指导。多谢各位

**更新**


我希望该方法首先转换video.original_视频,然后将转换后的视频保存在video.mp4_720字段中。如果所有操作都正确,请将video.converted更改为True。如何定义执行此操作的方法?

首先,您可能不想将
视频对象传递给芹菜-有关详细信息,请参见问题

所以你想这样称呼它:

        convert_video.delay(video.id)
然后

logger = logging.getLogger(__name__)  # assuming you have set up logging elsewhere

@app.task
def convert_video(video_id):
    video = Video.objects.get(video_id)

    cmd = ['ffmpeg',  '-i', video.original_video.path, video.mp4_720.path]
    log.info('running %s', ' '.join(cmd))
    proc = subprocess.Popen(cmd)
    proc.subprocess.wait()

    if p.returncode != 0:
        log.error('command failed with ret val %s', p.returncode)
        log.info(p.stderr)
        log.info(p.stdout)
    else:
        video.converted = True
        video.save()
        log.info('video converted ok')

你在问什么是正确的
ffmpeg
命令行参数吗?@scytale我知道执行ffmpeg的命令。我不知道如何获取原始视频->转换->并将其保存在mp4\U 720中。你能帮我一下吗。你能准确地解释一下你发布的代码中缺少或损坏了什么吗?@scytale我对convert_video()方法感到困惑。我希望该方法首先转换
video.original\u video
,然后将转换后的视频保存在
video.mp4\u 720
字段中。如果所有操作都正确,请将
video.converted
更改为True。我如何定义这样做的方法?请用您刚才在评论中给出的澄清更新您的问题。非常感谢。我会查一查很快回来的。斯凯特尔,对不起,我真的很忙。您认为我如何为mp4_720指定文件名,因为它需要此函数的文件名
get_upload_file_name()
?否-函数负责创建文件名-请参阅[