Предостережение: здесь относительно новый программист, и у меня не было необходимости конвертировать аудио файлы раньше.
Однако, если я правильно понимаю, что вы подразумеваете под серверной стороной, возможно, вы ищете хороший подход к управлению массовыми конверсиями, и ваш интерес к решению на python может быть частично для того, чтобы иметь возможность лучше управлять ресурсом использовать или интегрировать в вашу цепочку обработки. У меня была похожая проблема / цель, которую я решил, используя сочетание рекомендаций Merlyn и Celery . Я не использую django-celery, но если это для проекта, основанного на django, это может вас заинтересовать. Вы можете узнать больше о сельдерее здесь:
В зависимости от того, что вы уже настроили, может потребоваться немного времени для установки. Чтобы воспользоваться всеми преимуществами, вам нужно установить rabbitmq / erlang, но если вы будете следовать руководству на сайтах, приведенных выше, это довольно быстро.
Вот пример того, как я использую сельдерей с подпроцессом для решения аналогичной проблемы. Подобно предложению автора, приведенному выше, я использую подпроцесс для вызова ffmpeg, который так же хорош, как и для видеоинструментов, и, вероятно, на самом деле будет так же хорош, как и для аудиоинструментов. Я включил здесь немного больше, чем необходимо, чтобы дать вам представление о том, как вы могли бы немного настроить свой собственный.
#example of configuring an option, here I'm selecting how much I want to adjust bitrate
#based on my input's format
def generate_command_line_method(self):
if self.bitrate:
compression_dict = {'.mp4':1.5, '.rm':1.5, '.avi': 1.2,
'.mkv': 1.2, '.mpg': 1, '.mpeg':1}
if self.ext.lower() in compression_dict.keys():
compression_factor = compression_dict[self.ext.lower()]
#Making a list to send to the command line through subprocess
ffscript = ['ffmpeg',
'-i', self.fullpath,
'-b', str(self.bitrate * compression_factor),
'-qscale', '3', #quality factor, based on trial and error
'-g', '90', #iframe roughly per 3 seconds
'-intra',
outpath
]
return ffscript
#The celery side of things, I'd have a celeryconfig.py file in the
#same directory as the script that points to the following function, so my task
#queue would know the specifics of the function I'll call through it. You can
#see example configs on the sites above, but it's basically just going to be
#a tuple that says, here are the modules I want you to look in, celery, e.g.
#CELERY_MODULES = ("exciting_asynchronous_module.py",). This file then contains,
from celery.decorators import task
from mymodule import myobject
from subprocess import Popen
@task(time_limit=600) #say, for example, 10 mins
def run_ffscript(ffscript):
some_result = Popen(ffscript).wait()
#Note: we'll wait because we don't want to compound
#the asynchronous aspect (we don't want celery to launch the subprocess and think
#it has finished.
#Then I start up celery/rabbitmq, and got into my interactive shell (ipython shown):
#I'll have some generator feeding these ffscripts command lines, then process them
#with something like:
In[1]: for generated_ffscript in generator:
run_ffscript.delay(generated_ffscript)
Дайте мне знать, было ли это полезно для вас. Я относительно новичок в ответах на вопросы здесь и не уверен, полезны ли мои попытки или нет. Удачи!