1

我正在尝试使用pydub将上传的 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 模型对象,ID 来自数据库):

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

显然,mutagen 可以很好地读取文件,但 pydub 不能。是什么赋予了?

4

2 回答 2

0

这可能无法解决您的问题,但 pydub 也接受文件句柄(而不是路径):

尝试这个?

with open("media/test.mp3", "rb") as f:
    AudioSegment.from_mp3(f)
于 2016-04-15T13:00:17.547 回答
0

我没有玩太多,mutagen因此无法track_obj.id上班。是mutagen属性吗?

此外,由于track_obj.id不起作用,它被替换为通过调用track使用audio["TIT2"].text[0]mutagen.id3

我也删除了所有显式引用,external paths并简化了路径和代码以进行测试。

我还注意到您正在尝试concatenate stringpath, names等)与intbitrate)。这需要一些修复。

此代码不使用save_file function,因此我无法对此发表评论。

无论如何,毕竟,下面的代码可以工作,并且能够通过 提供mp3不同的文件来保存文件。bitratepydub

这是工作代码,希望这会有所帮助

工作代码:

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
>>> 
于 2016-04-14T18:27:14.240 回答