找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 20952|回复: 10

[原创] [教程]音乐进度条显示,全长和已播放进度,附加播放/暂停.

[复制链接]
发表于 2021-2-15 13:27:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 blackpineapple 于 2021-2-23 15:12 编辑

下面代码的主要功能是把音乐的播放位置用进度条的形式显示出来。
使用AudioPositionValue来确定现在音乐播放的位置数值,参数是channel,缺省频道是music。

renpy.music.get_duration 函数可以获得设定channel播放音乐的总长度,单位是秒,类型是float。
renpy.music.get_pos 函数可以获得设定channel当前播放进度,单位是秒,类型是float。

audio相关函数请参考:https://doc.renpy.cn/zh-CN/audio.html#functions

convert_format 函数入参是秒,可以转换为12:01这样的形式。
renpy.music.get_pos函数在音乐是mp3的时候会不能正常工作,也不知道是为什么。

[RenPy] 纯文本查看 复制代码
init python:
    def get_audio_duration():
        duration = renpy.music.get_duration()
        return convert_format(int(duration))

    def get_audio_position():
        music_pos = renpy.music.get_pos()
        # music_pos can be None
        if music_pos:
            return convert_format(int(music_pos))
        return "0"

    def convert_format(second):
        minute = second // 60
        second = second % 60
        result = ""
        if minute:
            result = str(minute) + ":"
            if second < 10:
                result += '0'
        result += str(second)
        return result

screen audio:
    timer 0.1 action [Hide('audio'), Show('audio')]
    vbox:
        xpos 0.5
        ypos 0.2
        python:
            duration = get_audio_duration()
            music_pos = get_audio_position()
        hbox:
            spacing 20
            text music_pos
            text "/"
            text duration

        bar:
            value AudioPositionValue("music", update_interval=0.1)
            xalign 0.5
            yalign 0.5
            xsize 500
            xmaximum 500


本帖参考了:
https://lemmasoft.renai.us/forums/viewtopic.php?t=40989

评分

参与人数 1活力 +60 干货 +3 收起 理由
被诅咒的章鱼 + 60 + 3 感谢分享!

查看全部评分

 楼主| 发表于 2021-2-17 12:26:06 | 显示全部楼层
本帖最后由 blackpineapple 于 2021-2-17 12:27 编辑

实现了一个播放,暂停合一的按钮,基于文档里的music room代码。
[RenPy] 纯文本查看 复制代码
init python:

    #  步骤1,创建一个MusicRoom实例。
    mr = MusicRoom(fadeout=1.0)

    # Step 2. 添加音乐文件。
    mr.add("audio/1.ogg", always_unlocked=True)
    mr.add("audio/2.ogg", always_unlocked=True)
    mr.add("audio/3.ogg", always_unlocked=True)

    class PlayerButton:
        def __init__(self, channel='music', icon_path='gui/', mr=mr):
            self.channel = channel
            self.icon_path = icon_path
            self.mr = mr

        def get_icon(self):
            if not renpy.music.is_playing() and not renpy.music.get_pause():
                return self.icon_path + "play_%s.png"
            if renpy.music.get_pause(self.channel):
                return self.icon_path + "play_%s.png"
            return self.icon_path + "pause_%s.png"

        def click(self):
            if not renpy.music.is_playing() and not renpy.music.get_pause():
                self.mr.play()
                return
            renpy.music.set_pause(not renpy.music.get_pause(self.channel),
                channel=self.channel)

    play_button = PlayerButton(mr=mr)

label start:
    show screen music_room
    pause

# Step 3. 创建音乐空间界面。
screen music_room:
    timer 1 action [Hide('music_room'), Show('music_room')]

    frame:
        has vbox

        # 每条音轨的播放按钮。
        textbutton "Track 1" action mr.Play("audio/1.ogg")
        textbutton "Track 2" action mr.Play("audio/2.ogg")
        textbutton "Track 3" action mr.Play("audio/3.ogg")

        null height 20

        # 切换音轨按钮。
        textbutton "Next" action mr.Next()
        textbutton "Previous" action mr.Previous()

        null height 20

        # 用户退出音乐空间的按钮。
        textbutton "Main Menu" action ShowMenu("main_menu")
        python:
            duration = str(int(renpy.music.get_duration()))
            music_pos = renpy.music.get_pos()
            if not music_pos:
                music_pos = 0
            music_pos = str(int(music_pos))
        text duration
        text music_pos
        bar:
            value AudioPositionValue(channel='music', update_interval=0.1)
            xalign 0.5
            yalign 0.5
            xsize 500
            xmaximum 500

        fixed:
            pos(0.5, 0.6)
            hbox:
                vbox:
                    text str(renpy.music.get_pause())
                    imagebutton:
                        auto play_button.get_icon()
                        focus_mask True
                        action Function(play_button.click)

    # 音乐空间的音乐播放入口。
    on "replace" action mr.Stop()

    # 离开时恢复主菜单的音乐。
    on "replaced" action Play("music", "track1.ogg")

评分

参与人数 1干货 +3 收起 理由
BuErShen + 3 版区有你更精彩(*^_^*)

查看全部评分

回复 支持 1 抱歉 0

使用道具 举报

发表于 2021-2-17 19:54:35 | 显示全部楼层
以后,山无棱、天地合,再在Q群里呼叫偶上线。。。
回复 支持 抱歉

使用道具 举报

发表于 2021-7-12 22:10:27 | 显示全部楼层
播放进度条要是能拖拽就好了
回复 支持 抱歉

使用道具 举报

发表于 2021-7-12 22:54:51 | 显示全部楼层
duration = get_audio_duration()
跟 music_pos = get_audio_position()
无法在点击音轨textbutton时获取音乐时长,显示0/0,只有暂停时显示进度/时长
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-7-13 12:01:53 | 显示全部楼层
天使的遗族 发表于 2021-7-12 22:54
duration = get_audio_duration()
跟 music_pos = get_audio_position()
无法在点击音轨textbutton时获取音 ...

能不能具体说下你碰到这个问题所需要的步骤?
比如我要重现这个问题,要如何操作。
回复 支持 抱歉

使用道具 举报

发表于 2021-7-13 19:01:35 | 显示全部楼层
blackpineapple 发表于 2021-7-13 12:01
能不能具体说下你碰到这个问题所需要的步骤?
比如我要重现这个问题,要如何操作。 ...

就你发的代码实现中出现的,按音轨按钮,依然显示0/0,按播放暂停键显示进度/时长
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-7-14 06:54:10 | 显示全部楼层
天使的遗族 发表于 2021-7-13 19:01
就你发的代码实现中出现的,按音轨按钮,依然显示0/0,按播放暂停键显示进度/时长 ...

那是因为音轨按钮没有写这方面的逻辑,你可以按照下面暂停开始改一改。
回复 支持 抱歉

使用道具 举报

发表于 2021-7-14 16:18:39 | 显示全部楼层
本帖最后由 天使的遗族 于 2021-7-14 17:06 编辑
blackpineapple 发表于 2021-7-14 06:54
那是因为音轨按钮没有写这方面的逻辑,你可以按照下面暂停开始改一改。 ...

按播放暂停、ctrl、调节音量就显示并更新,不动就静止,按住ctrl一直更新,怀疑screen 刷新率不足

回复 支持 抱歉

使用道具 举报

发表于 2021-7-14 17:24:28 | 显示全部楼层
让screen也每0.1秒刷新获取音频长度和播放位置:
[RenPy] 纯文本查看 复制代码
timer 0.1:
        action [SetVariable('duration',get_audio_duration()),SetVariable('music_pos',get_audio_position())]
        repeat True

另外修改了播放位置数字的显示,使之与歌曲长度格式0:00保持一致(最长9:59)
[RenPy] 纯文本查看 复制代码
def convert_format(second):
        minute = second // 60
        second = second % 60
        result = ""
        if minute:
            result = str(minute) + ":"
            if second < 10:
                result += '0'
        elif second>9:
            result +='0:'
        else:
            result +='0:0'
        result += str(second)
        return result
回复 支持 抱歉

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2024-7-27 17:55 , Processed in 0.128241 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表