1

libvlcTUI で音楽を再生するために (go binding) を使用しています。media_list_playerメソッドを持つNextを使用する代わりに、この回答https://stackoverflow.com/a/44647523/4443226Previousのアドバイスに従って、通常のループとループを使用しました。media_player

import vlc
import time
my_list = ['vp1.mp3','happy.mp3']
instance = vlc.Instance()
player = instance.media_player_new()
playing = set([1,2,3,4])
for i in my_list:
    player.set_mrl(i)
    player.play()
    play=True
    while play == True:
        time.sleep(1)
        play_state = player.get_state()
        if play_state in playing:
            continue
        else:
            play = False

これには、現在の曲のインデックスを取得でき、現在再生中の曲の位置長さを取得できるという利点があります。

Goで実装しましたが、問題の1つは、(効果的に)実装できず、歌えないことNextですPrevious

問題の一部は、この再生ループがUI スレッドとは別のものでなければならないことです。goroutinechan曲を停止しgoroutineてスキップするための信号を送信するために使用します。

func playAlbum(p *vlc.Player, a Album, l *tui.List, s *tui.StatusBar, done, next, prev chan struct{}) (err error) {
    playlist := make([]*vlc.Media, 0)
    for _, path := range a.Paths {
        media, err := vlc.NewMediaFromPath(path)
        // check eturn err
        playlist = append(playlist, media)
    }

    for idx := range playlist {
        p.SetMedia(playlist[idx])
        err = p.Play()
        // check return err

        status, err := p.MediaState()
        // check return err

    PlaybackLoop:
        for status != vlc.MediaEnded {
            status, err = p.MediaState()
            // continue with err

            l.SetSelected(idx) // TUI list of songs

            song := songStatus(a, l.Selected())
            s.SetPermanentText(song) // TUI status bar

            select {
            case <-next:
                break PlaybackLoop
            case <-prev:
                continue // TODO: implement previous
            case <-done:
                return err
            default:
                time.Sleep(50 * time.Millisecond)
            }
        }
    }
    return err
}

Previousfor ループに戻ることができないため、を実装できません。

理想的には、 を使用したいと思いますlibvlc media_list_playerただし、曲の長さと長さ、およびの曲のインデックスを取得できない場合はmedia_list、むしろこの方法を使用します。

代わりにを使用する必要がある場合media_player、ネストされたループとチャンネルを使用するよりも再生を処理するためのより良い方法はありますか? 以前を使用できるものは?

4

1 に答える 1

1

OP とのコメントと議論に基づいて、リンクされたリストがおそらく、少し少ない労力で前後に移動する方法を制御しようとする最良のルートであると判断されました。Go が使用されており、使用されているモジュールにはゴルーチンが必要であるため、リンクされたリストもゴルーチン内で安全に使用できる必要があります。

于 2017-07-16T15:13:00.887 に答える