首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题mixer.music.get_pos()在mixer.music.set_pos()设置位置后

问题mixer.music.get_pos()在mixer.music.set_pos()设置位置后
EN

Stack Overflow用户
提问于 2022-07-23 10:04:38
回答 1查看 43关注 0票数 0

我在做音乐播放器时使用pygame.mixer模块,遇到了一个问题,当我在set_pos()函数中设置新位置时,get_pos()函数没有输出新位置并输出初始位置时,遇到了一个来自pygame.mixer模块的问题。

代码语言:javascript
复制
from time import sleep
from pygame import mixer

mixer.init()
mixer.music.load("file.mp3")
mixer.music.play()
mixer.music.set_pos(10.0)
sleep(2)
print(mixer.music.get_pos())

产出:

代码语言:javascript
复制
2000 ms

如果对我的逻辑来说,这个输出是正确的:

代码语言:javascript
复制
12000 ms
EN

回答 1

Stack Overflow用户

发布于 2022-11-07 20:13:10

这将设置音乐文件中将开始播放的位置。"pos“的含义取决于音乐格式,pos是一个浮点数(或者一个可以转换成浮点数的数字)。 对于MOD文件,pos是模块中的整数模式号。对于OGG来说,它是声音开始时的绝对位置,以秒为单位。对于MP3文件,它是当前位置的相对位置(以秒为单位)。要在MP3文件中进行绝对定位,首先调用回退()。

因此,您可以使用以下代码:

代码语言:javascript
复制
def set_pos(s): # /!\ seconds
    pygame.mixer.music.rewind() # mp3 files need a rewind first
    freq = pygame.mixer.get_init()[0] # get the music frequency
    pygame.mixer.music.set_pos(int(s*freq))

但是,使用set_pos()可以给您带来这样的错误,例如,对于.ogg声音文件:

代码语言:javascript
复制
pygame.error: set_pos unsupported for this codec

然后,您应该更喜欢像这样使用pygame.mixer.music.play(loops, start)

代码语言:javascript
复制
pygame.mixer.music.play(0, s) # /!\ seconds

从医生那里:

开始位置取决于所播放的音乐的格式。MP3和OGG以秒为单位使用这个位置作为时间。对于MP3文件,选择的启动时间位置可能不准确,因为可变比特率编码和ID3标记可能会抛出计时计算。对于MOD音乐,它是模式序号。如果无法设置开始位置,传递开始位置将引发NotImplementedError。

通常情况下,您应该使用.ogg文件,因为在.mp3之前已经实现了它们,并且它们具有精确的移动位置(“对于MP3文件,选择的启动时间位置可能不准确”)。

  • get_pos()可以给出奇怪的结果,因为它只显示了播放的时间。所以,它没有考虑到,如果音乐在1秒前开始播放,你会“跳”整整一分钟。它将输出1000 (ms)。医生:

这将获得音乐播放的毫秒数。返回的时间仅表示音乐播放了多长时间;它不考虑任何起始位置偏移。

链接:不支持此编解码器的pos

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73089784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档