python io.BytesIO and pygame.mixer



>我正在将音频mp3文件加载到python io中。字节IO缓冲区。

然后我想用pygame.mixer多次播放这个音频文件。

它第一次工作正常,但似乎pygame.mixer.music.play删除了缓冲区。

以下是源代码:

import io
import time
import pygame
with open(path_to_my_mp3_file, 'rb') as in_file:
  buffer = io.BytesIO(in_file.read())
pygame.mixer.init()
pygame.mixer.music.load(buffer)
pygame.mixer.music.play()  # works fine !
time.sleep(1)
pygame.mixer.music.load(buffer) # the buffer seems to be cleared
pygame.mixer.music.play()  

我收到此错误:

  File "test.py", line 17, in <module>
    pygame.mixer.music.load(buffer)
pygame.error: Couldn't read from RWops

知道吗?

谢谢

附注:

我试过这个:

with open(path_to_my_mp3_file, 'rb') as in_file:
  buffer = in_file.read()
pygame.mixer.init()
pygame.mixer.music.load(io.BytesIO(buffer))
pygame.mixer.music.play()
time.sleep(1)
pygame.mixer.music.load(io.BytesIO(buffer))
pygame.mixer.music.play()

它可以工作,但我认为这段代码的性能较差

BytesIO 是一个类似文件的对象;因此,与任何流文件一样,它有一个位置,所有读写操作都发生在这里。因为您刚刚从中读取了数据,所以位置在末尾,进一步读取没有任何作用;你应该倒带它

buffer.seek(0)

在将其加载到音乐中之间。但是你不需要加载它两次,因为pygame.mixer.music对象本身有rewind((方法:

pygame.mixer.music.rewind() # to the beginning

但这里也不需要它,因为 play(( 方法...将音乐倒回开头!

pygame.mixer.music.load(buffer)
pygame.mixer.music.play()  # works fine !
time.sleep(1)
pygame.mixer.music.play()   # and play it again!

就这么简单!

这对

我有用

from io import BytesIO
import pygame
def speak():
    mp3_fp = BytesIO()
    tts = gTTS('hello', lang='en')
    tts.write_to_fp(mp3_fp)
    # mp3_fp.seek(0)
    # return this to the client side.
    return mp3_fp
pygame.init()
pygame.mixer.init()
sound = speak()
sound.seek(0)
pygame.mixer.music.load(sound, "mp3")
pygame.mixer.music.play()

相关内容

  • 没有找到相关文章

最新更新