2016-04-14 4 views
0

Ich versuche pydub zu verwenden uploaded mp3s auf eine bestimmte Bitrate zu konvertieren, mit diesem Code:FileNotFoundError versuchen, mp3-Datei zu erhalten

from pydub import AudioSegment 

def process_mp3(mp3, id): 
    print(mp3) # media/track1-original 
    audio = AudioSegment.from_mp3(mp3) 
    bitrates = [128, 192, 256, 320] 

    for bitrate in bitrates: 
     audio.export(settings.MEDIA_ROOT + '/' + 'track' + id + '-' + bitrate, format="mp3", bitrate=bitrate + 'k') 

def save_file(file, name): 

    with open(default_storage.path(settings.MEDIA_ROOT + '/' + name), 'wb+') as destination: 
     for chunk in file.chunks(): 
      destination.write(chunk) 

    return name 

Ich erhalte diese Fehlermeldung:

FileNotFoundError: [WinError 2] Systemet finner ikke angitt fil

Und der Code, der process_mp3 aufruft, ist (Anmerkung: track_obj ist ein Django-Modellobjekt und die ID stammt aus einer Datenbank):

from mutagen.mp3 import MP3 

.... 

mp3 = save_file(mp3, 'track' + str(track_obj.id) + '-' + 'original') 

mp3_info = MP3('media/' + mp3); # This works 

process_mp3('media/' + mp3, str(track_obj.id)) # This does not 

Anscheinend kann mutagen die Datei gut lesen, aber pydub kann nicht. Was gibt?

+0

Versuchen Sie, den absoluten Pfad zur Datei anstelle eines relativen Pfad 'media/...' – Alasdair

+0

@Alasdair Das mit ist eigentlich das, was ich versuchte, erste und das verursacht sowohl mutagen und pydub diesen Fehler zu werfen. –

+0

haben Sie ohne das Medienverzeichnis versucht? Versuchen Sie einfach, die Datei im aktuellen Verzeichnis zu behalten und sehen Sie, ob pydub die Datei sieht, um das Problem zu isolieren. – Deva

Antwort

0

Ich habe nicht viel mit mutagen gespielt und war daher nicht in der Lage, track_obj.id zu arbeiten. Ist es ein mutagen Attribut? Auch

, da track_obj.id nicht funktionierte, wurde mit track substituiert mit audio["TIT2"].text[0] von mutagen.id3 Aufruf

Ich entfernte alle expliziten Verweise auf external paths auch und vereinfacht die Wege und den Code für Testzwecke.

Ich habe auch bemerkt, dass Sie concatenatestring (path, names etc.) versuchen, mit int (bitrate). Das brauchte etwas reparieren.

Dieser Code verwendet nicht save_filefunction, so kann ich dazu nicht kommentieren.

Wie auch immer, unten Code funktioniert und ist in der Lage, mp3 Dateien mit verschiedenen bitrate zu speichern, indem Sie es durch pydub.

Hier ist Code arbeiten, Hoffnung, das hilft

Arbeits Code:

from mutagen.mp3 import MP3 
from mutagen.id3 import ID3 
from pydub import AudioSegment 



def process_mp3(mp3, id): 
    print(mp3) # media/track1-original 
    audio = AudioSegment.from_mp3(mp3) 
    bitrates = [128, 192, 256, 320] 

    for bitrate in bitrates: 
     export_file = my_media_path + '/' + 'track_' + id + '-' + str(bitrate) +'.mp3' 
     print ("exporting %s" % export_file) 
     audio.export(export_file, format="mp3", bitrate= str(bitrate) + 'k') 

def save_file(file, name): 

    with open(default_storage.path(settings.MEDIA_ROOT + '/' + name), 'wb+') as destination: 
     for chunk in file.chunks(): 
      destination.write(chunk) 


mp3 = "test.mp3" 

mp3_info = MP3('media/' + mp3); # This works 

my_media_path = 'media' 
audio = ID3('media/' + 'test.mp3') 
#print "audio_info = ",audio 
track = audio["TIT2"].text[0] 
process_mp3('media/' + mp3, str(track)) 

Ausgang:

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> ================================ RESTART ================================ 
>>> 
media/test.mp3 
exporting media/track_End Matter-128.mp3 
exporting media/track_End Matter-192.mp3 
exporting media/track_End Matter-256.mp3 
exporting media/track_End Matter-320.mp3 
>>> 
+0

Ich habe vergessen hinzuzufügen, dass dies aus einem Django-Projekt stammt, "track_obj" ist eine Django-Model-Instanz/ein Objekt und die ID stammt aus der Datenbank-ID dieser Instanz. Es tut uns leid! –

+0

Ja, es funktioniert immer noch nicht, ich verstehe nicht warum, obwohl ich genau die gleiche Sache an "process_mp3" übergebe, die ich an mutagens MP3-Funktion übergebe, mutagen funktioniert, pydub nicht. –

+0

Sie können die gleiche Sache nicht an 'process_mp3' übergeben,' str (track_obj.id) ist ein zusätzlicher Parameter, der an diese Funktion übergeben wird. Haben Sie versucht, zu überprüfen, ob Sie für "str (track_obj.id)" den richtigen Wert erhalten, bevor Sie ihn in "process_mp3" eingeben? Wahrscheinlich einige print-Anweisungen, um zu sehen, was übertragen und ausgeführt wird. –

0

Dies kann Ihr Problem nicht lösen, sondern pydub akzeptiert auch Datei-Handles (anstelle von Pfaden):

Versuch das?

with open("media/test.mp3", "rb") as f: 
    AudioSegment.from_mp3(f) 
+0

Versucht es, selbe excact error, das weigert sich einfach zu arbeiten, egal was es scheint.Andere Datei in meinem Skript funktioniert gut, aber pydub kann nicht –

+0

@SebastianOlsen erhalten Sie eine Warnung, dass pydub ffmpeg/avlib nicht finden kann? Es könnte die Datei sein, die fehlt, ist die ffmpeg ausführbare Datei (die zum Entschlüsseln der mp3 verwendet wird) – Jiaaro

+0

ich installiert ffmpeg obwohl, aber es gab mir einen Fehler, wenn ich sage, dass es fmmpeg nicht finden konnte, aber das war nicht einmal, als ich versuchte, es in der Datei –