How to transcode MP3 files in django by using FFMPEG, Celery and RabbitMQ?

520 Views Asked by At

I am trying to transcode user uploaded MP3 audio files into ogg, ac3 wav or other formats by using django, celery, rabbitMQ and FFMPEG. But i am getting the error with [WinError 10042] An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call

OS-Window 10-64bit Python 3.0 Django - 1.10

here is the code I followed:

models.py
import uuid
from django.db import models

   # Create your models here.

    def unique_file_path(instance, filename):
    new_file_name = uuid.uuid4()
    return str(new_file_name)

    class AudioFile(models.Model):
    name = models.CharField(max_length=100, blank=True)
    mp3_file = models.FileField(upload_to=unique_file_path)
    ogg_file = models.FileField(blank=True, upload_to=unique_file_path)
    wav_file = models.FileField(blank=True, upload_to=unique_file_path)
    ac3_file = models.FileField(blank=True, upload_to=unique_file_path)

    def __str__(self):
        return self.name

    views.py
    from django.shortcuts import render

    # Create your views here.

    from django.views.generic.edit import FormView
    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import reverse

    from django.views.generic import FormView
    from audio_transcoder.taskapp.tasks import transcode_mp3

    from .forms import AudioFileFrom
    from .models import AudioFile

    class UploadAudioFileView(FormView):
    template_name = 'upload/upload.html'
    form_class = AudioFileFrom


    def form_valid(self, form):
        audio_file = AudioFile(
            name=self.get_form_kwargs().get('data')['name'],
            mp3_file=self.get_form_kwargs().get('files')['mp3_file']
        )
        audio_file.save()
        transcode_mp3.delay(audio_file.id)

        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('/')


    tasks.py
    import os
    import os.path
    import subprocess

    from audio_transcoder.taskapp.celery import app




    from celery import Celery

    app = Celery('fftest',
             broker='amqp://guest@localhost//',
             include=['taskapp.tasks'])

    if __name__ == '__main__':
    app.start()

    from audio_transcoder.models import AudioFile
    import fftest.settings as settings

    @app.task
    def transcode_mp3(mp3_id):
    audio_file = AudioFile.objects.get(id=mp3_id)
    input_file_path = audio_file.mp3_file.path
    filename = os.path.basename(input_file_path)

    ogg_output_file_name = os.path.join('transcoded', '{}.ogg'.format(filename))
    ogg_output_file_path = os.path.join(settings.MEDIA_ROOT, ogg_`enter code     
    here`output_file_name)
    enter code here
    ac3_output_file_name = os.path.join('transcoded', '{}.ac3'.format(filename))
    ac3_output_file_path = os.path.join(settings.MEDIA_ROOT,  
    ac3_output_file_name)

    wav_output_file_name = os.path.join('transcoded', '{}.wav'.format(filename))
    wav_output_file_path = os.path.join(settings.MEDIA_ROOT, 
    wav_output_file_name)

    if not os.path.isdir(os.path.dirname(ogg_output_file_path)):
        os.makedirs(os.path.dirname(ogg_output_file_path))

    subprocess.call([
            settings.FFMPEG_PATH,
            '-i',
            input_file_path,
            ogg_output_file_path,
            ac3_output_file_path,
            wav_output_file_path
        ]
    )

    audio_file.ogg_file = ogg_output_file_name
    audio_file.ac3_file = ac3_output_file_name
    audio_file.wav_file = wav_output_file_name
    audio_file.save()

Not sure where the mistake is happening. While uploading video it is showing below:

OperationalError at /new/
[WinError 10042] An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call
Request Method: POST
Request URL:  http://127.0.0.1:8000/new/
Django Version: 1.10.4
Exception Type: OperationalError`enter code here`
Exception Value:  
[WinError 10042] An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call
Exception Location: C:\Users\RAMa2r3e4s5h6\fftest\lib\site-packages\amqp\transport.py in _set_socket_options, line 204
1

There are 1 best solutions below

0
On

If you are using Celery version 4+ they removed Windows support entirely.

I would recommend installing celery v. 3.1.25

pip install celery==3.1.25

Source: Removed features in Celery 4.0