在django中使用芹菜和ffmpeg对视频进行转码

在django中使用芹菜和ffmpeg对视频进行转码,django,ffmpeg,django-views,celery,celery-task,Django,Ffmpeg,Django Views,Celery,Celery Task,我想转码用户上传的视频使用芹菜。我想首先我应该上传视频,然后生成一个芹菜任务来进行代码转换 可能在tasks.py中有类似的内容: subprocess.call('ffmpeg -i path/.../original path/.../output') 刚刚完成,对如何在视图.py和任务.py中执行感到困惑。这也是一个好的解决方案吗?我非常感谢你的帮助和建议。多谢各位 models.py: class Video(models.Model): user = models.Forei

我想转码用户上传的视频使用芹菜。我想首先我应该上传视频,然后生成一个芹菜任务来进行代码转换

可能在tasks.py中有类似的内容:

subprocess.call('ffmpeg -i path/.../original path/.../output')
刚刚完成,对如何在
视图.py
任务.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)
我的不完整视图.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
            })

修改您的模型,以便您可以保存原始(上传)视频,而无需转码版本,并且可能会在模型中添加一些标志,以便在视频转码时保存状态(并且基于该标志,您可以向用户显示视频转码仍在进行)


上传视频并将其模型保存到数据库后,运行芹菜任务,将视频的ID传递给它。在芹菜任务中,从数据库检索视频,对其进行转码并将其保存到带有更改标志的数据库中。

我想您已经解决了这个问题,但我将提供更多关于GwynBleidD的信息,因为我也遇到了同样的问题

所以作为GwynBleidD,您需要调用芹菜任务,但是如何对这些任务进行编码呢?结构如下:

  • 任务从数据库中获取视频
  • 它使用ffmepg对其进行编码,并将其输出到您想要的任何位置
  • 编码完成后,它将为模型设置相应的属性并保存它(请注意,如果在同一视频上运行各种任务,请不要使用旧实例保存,因为您可能会丢失运行的其他任务的信息)
  • 首先,在设置中设置一个
    FFMPEG\u路径
    变量,然后:

    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'])
    

    我已经修改了我的模型,以便可以保存它。请你写下你在代码中提到的内容,因为这正是我所困惑的。非常感谢。