python - 有没有办法在 gstreamer 中从中间播放歌曲?

标签 python gstreamer

我一直在寻找在 python gstreamer 中不是从头开始播放歌曲的方法,考虑一下:

import threading
import gst
import gobject

class GobInit(threading.Thread):
   ...

class BasicPlayer(threading.Thread):

    def __init__(self, musiclist):
        threading.Thread.__init__(self)
        self.musiclist = musiclist
        self.song_num = 0
        self.construct_pipeline()
        self.set_property_file()

    def construct_pipeline(self):
        self.player = gst.element_factory_make("playbin")
        self.is_playing = False
        self.connect_signals()

    def connect_signals(self):
        ...

    def play(self):
        self.is_playing = True
        self.player.set_state(gst.STATE_PLAYING)

    def set_property_file(self):
        self.player.set_property(
        "uri", "file://"+"/home/user/work/mp3/"+self.musiclist[
            self.song_num])

def main():
    gob = GobInit()
    gob.start()
    print('start')
    player = BasicPlayer(['test1.mp3', 'test2.mp3', 'test3.mp3'])
    print('player created')
    player.play()
    print('start play')

main()

所以我只有这个函数可以启动:

self.player.set_state(gst.STATE_PLAYING)

但我打赌有一种方法可以从歌曲的中间开始播放,就像这样:

self.player.play_from_middle(gst.STATE_PLAYING, <sec_after_begin>)

或者我能否以某种方式倒带歌曲以使其从中间开始播放?

最佳答案

是的,我想应该有几种方法,但我立即想到的一种(对于非直播)是:

  • 将管道设置为暂停而不是播放
  • 等待 GST_MESSSAGE_ASYNC_DONE 消息出现在总线处理程序中。
  • 查询管道(gst_element_query())持续时间,然后查找管道(gst_element_seek())到持续时间/2时间
  • 将管道设置为 PLAYING。

关于python - 有没有办法在 gstreamer 中从中间播放歌曲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454407/

相关文章:

linux - 你如何构建 gstreamer 的 gst-launch 管道?

python - 使用 Python 和 Gstreamer 进行音频转换

python - 如何将此 JSON 加载到数据框中?

python - 不使用类/对象递归创建树层次结构

python - 从巨大的 CSV 文件中读取随机行

c - 如何使用GStreamer的电平插件获取特定音频文件的峰值和均方根值

python - 在 Numpy 中计算特征值不起作用 : Each element is a float

python - 如何在 odoo 10 中添加、更新和删除 Many2many 字段记录?

gstreamer - Linux 设备上的 WebRTC 和 gstreamer

python - Gstreamer、Python 和 Appsink