Перекодировать видео с помощью сельдерея и ffmpeg в django

Я хотел бы перекодировать загруженные пользователем видео с помощью сельдерея. Я думаю, что сначала я должен загрузить видео и создать задачу сельдерея для перекодирования.

Может быть, что-то вроде этого в tasks.py:

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

Только что завершили Первые шаги с сельдереем, так запутался, как это сделать в views.py и tasks.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
            })

person Robin    schedule 20.02.2015    source источник


Ответы (2)


Я думаю, вы уже решили проблему, но я предоставлю немного больше информации о том, что уже сказал 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'])
person Mijamo    schedule 20.10.2015

Измените свою модель, чтобы вы могли сохранять исходное (загруженное) видео без перекодированных версий и, возможно, добавить в свою модель некоторый флаг, который сохранит состояние, если видео было перекодировано (и на основе этого флага вы можете показать пользователю, что транскодирование видео все еще в ходе выполнения).

После загрузки видео и сохранения его модели в базе данных запустите задачу celery, передав в нее идентификатор вашего видео. В задаче celery извлеките видео из базы данных, перекодируйте его и сохраните в базе данных с измененным флагом.

person GwynBleidD    schedule 20.02.2015
comment
Я изменил свою модель, чтобы ее можно было сохранить. Не могли бы вы написать, что вы упомянули в коде, пожалуйста, потому что это то, что меня смущает. Спасибо. - person Robin; 20.02.2015