2016-04-14 2 views
0

Я пытаюсь использовать pydub конвертировать загруженные mp3s в определенной скорости передачи, используя этот код:FileNotFoundError пытается получить файл mp3

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 

Я получаю эту ошибку:

FileNotFoundError: [WinError 2] Systemet finner ikke angitt fil

И код, который вызывает process_mp3 (Примечание: track_obj - это объект модели Django, а идентификатор - из базы данных):

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 

Видимо, мутаген может читать файл просто отлично, но pydub не может. Что дает?

+0

Попробуйте использовать абсолютный путь к файлу, а не относительный путь 'СМИ/...' – Alasdair

+0

@Alasdair Это на самом деле то, что я пытался первым, что вызвало как мутаген и pydub бросить эту ошибку. –

+0

Вы пробовали без медиа-каталога? просто попробуйте сохранить файл в текущем каталоге и посмотреть, видит ли pydub файл, чтобы изолировать проблему. – Deva

ответ

0

Я не много играл с mutagen и, следовательно, не смог получить track_obj.id для работы. Это атрибут mutagen?

Кроме того, поскольку track_obj.id не работали, он был заменен track использованием audio["TIT2"].text[0] по телефону mutagen.id3

Я удалил все явные ссылки на external paths, а также и упростил пути и код для целей тестирования.

Я также заметил, что вы пытаетесь concatenatestring (path, names и т.д.) с int (bitrate). Это требовало некоторой фиксации.

Этот код не использует save_filefunction, поэтому я не могу прокомментировать это.

В любом случае, после этого код работает и может сохранять mp3 файлы с различными bitrate путем подачи через pydub.

Вот рабочий код, Надеюсь, что это помогает

Рабочий код:

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)) 

Выход:

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

Я забыл добавить, что это из проекта django, 'track_obj' - экземпляр/объект модели django, а идентификатор - из идентификатора базы данных экземпляра. Сожалею! –

+0

Да, он все еще не работает, я не понимаю, почему, хотя причина я передаю то же самое, что и 'process_mp3', что я перехожу к функции MP3 мутагена, мутаген работает, pydub этого не делает. –

+0

Вы не можете передавать одну и ту же вещь в 'process_mp3',' str (track_obj.id) - это дополнительный параметр, переданный этой функции. Вы пытались проверить, правильно ли вы используете '' str (track_obj.id) '', прежде чем загружать его в 'process_mp3'? Вероятно, сделайте несколько инструкций печати, чтобы увидеть, что передается и выполняется. –

0

Это не может решить вашу проблему, но pydub также принимает дескрипторы файлов (а не пути):

попробуйте это?

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

Пробовал это, то же самое исправить ошибку, это просто отказывается работать независимо от того, что кажется. Все остальное файл, связанный с моим скриптом, отлично работает, но pydub просто не могу. –

+0

@SebastianOlsen вы получаете предупреждение о том, что pydub не может найти ffmpeg/avlib? Может быть, файл, который отсутствует, является исполняемым файлом ffmpeg (который используется для декодирования mp3) – Jiaaro

+0

Я установил ffmpeg, хотя, но это дало мне ошибку, сказав, что не может найти fmmpeg, но это даже не было, когда я пытался прочитать файл –

Смежные вопросы