gpt4 book ai didi

django - 在 django 中使用 celery 和 ffmpeg 转码视频

转载 作者:行者123 更新时间:2023-12-03 20:07:53 25 4
gpt4 key购买 nike

我想使用 celery 对用户上传的视频进行转码。我想我应该先上传视频,然后生成一个用于转码的 celery 任务。

在 tasks.py 中可能是这样的:

subprocess.call('ffmpeg -i path/.../original path/.../output')

刚刚完成First steps with celery , 所以很困惑如何在 views.pytasks.py 中这样做。这也是一个好的解决方案吗?非常感谢您的帮助和建议。谢谢。

模型.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
})

最佳答案

我猜你已经解决了这个问题,但我会提供更多关于 GwynBleidD 已经说过的信息,因为我遇到了同样的问题。

因此,作为 GwynBleidD,您需要调用 Celery 任务,但如何对这些任务进行编码?这是结构:

  1. 任务从数据库中获取视频
  2. 它使用 ffmepg 对其进行编码并将其输出到您想要的任何地方
  3. 完成编码后,它会为模型设置相应的属性并保存(注意,如果您在同一视频上运行多个任务,请不要使用旧实例保存,因为您可能会丢失其他任务的信息运行)

首先,在您的设置中设置一个 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'])

关于django - 在 django 中使用 celery 和 ffmpeg 转码视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28626523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com