繁体   English   中英

python io.BytesIO 和 pygame.mixer

[英]python io.BytesIO and pygame.mixer

我正在将音频 mp3 文件加载到 python io.BytesIO 缓冲区中。

然后我想用 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM