boto3 S3对象解析

3

我正在尝试编写一个Python脚本来处理存储在S3上的音频数据。

我有一个S3对象,我是通过以下方式调用它的:

def grabAudio(filename, directory):

     obj = s3client.get_object(Bucket=bucketname, Key=directory+'/'+filename)

return obj['Body'].read()

使用以下方式访问数据:

print(obj['Body'].read())

获取正确的音频信息,因此它可以从存储桶中访问数据。
当我试图在音频处理库(pydub)中使用这些数据时,会失败:
``` audio = AudioSegment.from_wav(grabAudio(filename, bucketname))
Traceback (most recent call last): File "split_audio.py", line 38, in <module> audio = AudioSegment.from_wav(grabAudio(filename, bucketname)) File "C:\Users\jmk_m\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pydub\audio_segment.py", line 544, in from_wav return cls.from_file(file, 'wav', parameters) File "C:\Users\jmk_m\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pydub\audio_segment.py", line 456, in from_file file.seek(0) AttributeError: 'bytes' object has no attribute 'seek' ```
S3传来的对象格式是什么?我想它应该是字节数组吧?如果是这样,有没有一种方法可以将其解析为.wav格式而不必保存到磁盘上?我正在尝试避免保存到磁盘上。
同时也欢迎使用其他音频处理库。

1
你可以使用 io.BytesIObytes 创建一个类似文件的对象,并将其传递给你的库:https://dev59.com/C6Lia4cB1Zd3GeqPimhO#44437265 - Linas Valiukas
1个回答

3

感谢Linas提供了类似问题的链接,以及Jiaaro提供的答案。

 import io
    s = io.BytesIO(y['data'])
    AudioSegment.from_file(s).export(x, format='mp3')

这使我可以直接从存储桶中将数据拉入内存,使用

obj = s3client.get_object(Bucket=bucketname, Key=customername+'/'+filename)

data = io.BytesIO(obj['Body'].read())
audio = AudioSegment.from_file(data)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接