如何使用(django-celery,RQ)worker在heroku上的django中执行视频文件类型转换(ffmpeg)(我的代码在本地工作)

时间:2013-01-11 17:01:24

标签: django heroku python-2.7 ffmpeg django-celery

我网站的一部分包含一个允许用户上传视频的表单。我使用ffmpeg将视频转换为flv。我的媒体和静态文件存储在Amazon S3上。我可以在本地完成所有工作,但我似乎无法弄清楚如何使用工作人员在生产中运行视频转换子流程。我在我的应用程序中安装了dj-celery和rq。我认为我能够在本地工作的代码是:

#views.py
def upload_broadcast(request):
    if request.method == 'POST':
        form = VideoUploadForm(request.POST, request.FILES)
        if form.is_valid():
            new_video=form.save()
            def convert_to_flv(video):
                filename = video.video_upload
                sourcefile = "%s%s" % (settings.MEDIA_ROOT, filename)
                flvfilename = "%s.flv" % video.id
                imagefilename = "%s.png" % video.id
                thumbnailfilename = "%svideos/flv/%s" % (settings.MEDIA_ROOT, imagefilename)
                targetfile = "%svideos/flv/%s" % (settings.MEDIA_ROOT, flvfilename)
                ffmpeg = "ffmpeg -i %s -acodec mp3 -ar 22050 -f flv -s 320x240 %s" % (sourcefile, targetfile)
                grabimage = "ffmpeg -y -i %s -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 320x240 %s" % (sourcefile, thumbnailfilename)
                print ("SOURCE: %s" % sourcefile)
                print ("TARGET: %s" % targetfile)
                print ("TARGET IMAGE: %s" % thumbnailfilename)
                print ("FFMPEG TASK CODE: %s" % ffmpeg)
                print ("IMAGE TASK CODE: %s" % grabimage)
                try:
                    ffmpegresult = subprocess.call(ffmpeg)
                    print "---------------FFMPEG---------------"
                    print ffmpegresult
                except:
                    print "Not working."
                try:
                    videothumbnail = subprocess.call(grabimage)
                    print "---------------IMAGE---------------"
                    print videothumbnail
                except:
                    print "Not working."
                video.flvfilename = flvfilename
                video.videothumbnail = imagefilename
                video.save()

            convert_to_flv(new_video)

            return HttpResponseRedirect('/video_list/')
    else:
...

这是我第一次尝试使用工作人员(或曾经将项目推向生产),所以即使使用文档,我仍然不清楚我需要做什么。我尝试过几种不同的东西但似乎没什么用。有没有一种简单的方法告诉芹菜运行ffmpegresult = subprocess.call(ffmpeg)?提前感谢任何帮助或见解。

编辑 - 添加了heroku日志

2013-01-10T20:58:57+00:00 app[web.1]: TARGET: /media/videos/flv/8.flv
2013-01-10T20:58:57+00:00 app[web.1]: IMAGE TASK CODE: ffmpeg -y -i /media/videos/practice.wmv -vframes 1 -ss 00:00:02 - an -vcodec png -f rawvideo -s 320x240 /media/videos/flv/8.png
2013-01-10T20:58:57+00:00 app[web.1]: SOURCE: /media/videos/practice.wmv
2013-01-10T20:58:57+00:00 app[web.1]: FFMPEG TASK CODE: ffmpeg -i /media/videos/practice.wmv -acodec mp3 -ar 22050 -f fl v -s 320x240 /media/videos/flv/8.flv
2013-01-10T20:58:57+00:00 app[web.1]: TARGET IMAGE: /media/videos/flv/8.png
2013-01-10T20:58:57+00:00 app[web.1]: Not working.
2013-01-10T20:58:57+00:00 app[web.1]: Not working.

NEWER EDIT

我尝试添加tasks.py并添加了任务:

celery = Celery('tasks', broker='redis://guest@localhost//')

@celery.task
def ffmpeg_task(video):
    converted_file = subprocess.call(video)
    return converted_file

然后我将视图的相关部分更改为:

...
try:
    ffmpeg_task.delay(ffmpeg)
    print "---------------FFMPEG---------------"
    print ffmpegresult
except:
    print "Not working."
...

我的新日志是:

2013-01-15T13:19:52+00:00 app[web.1]: TARGET IMAGE: /media/videos/flv/12.png
2013-01-15T13:19:52+00:00 app[web.1]: SOURCE: /media/videos/practice.wmv
2013-01-15T13:19:52+00:00 app[web.1]: FFMPEG TASK CODE: ffmpeg -i /media/videos/practice.wmv -acodec mp3 -ar 22050 -f fl v -s 320x240 /media/videos/flv/12.flv
2013-01-15T13:19:52+00:00 app[web.1]: IMAGE TASK CODE: ffmpeg -y -i /media/videos/practice.wmv -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 320x240 /media/videos/flv/12.png
2013-01-15T13:19:52+00:00 app[web.1]: TARGET: /media/videos/flv/12.flv
2013-01-15T13:20:17+00:00 app[web.1]: 2013-01-15 13:20:17 [2] [CRITICAL] WORKER TIMEOUT (pid:12)
2013-01-15T13:20:17+00:00 app[web.1]: 2013-01-15 13:20:17 [2] [CRITICAL] WORKER TIMEOUT (pid:12)
2013-01-15T13:20:17+00:00 app[web.1]: 2013-01-15 13:20:17 [19] [INFO] Booting worker with pid: 19

我完全错过了什么吗?我会继续努力,但会非常感谢任何指导或帮助。

0 个答案:

没有答案