gpt4 book ai didi

python - 使用 python-vlc 获取基于 URL 的媒体对象的持续时间 - 无法解析

转载 作者:行者123 更新时间:2023-12-01 08:05:57 27 4
gpt4 key购买 nike

我正在尝试使用 python 2.7 python-vlc 来解析然后从 URL 获取音乐轨道的持续时间。解析不起作用,播放然后暂停媒体偶尔会返回 -1。

我知道有两种解析媒体的方法,必须在使用 media.get_duration() 之前完成。我可以解析它,或者我可以播放它。

无论如何,我都无法解析媒体。使用 parse_with_options() 为我提供解析状态 MediaParsedStatus.skipped 除了 parse_with_option(1,0) 之外的所有内容,它为我提供解析状态 MediaParsedStatus.FIXME_(0L)

        p = vlc.MediaPlayer(songurl)
media = p.get_media()
media.parse_with_options(1, 0)
print media.get_parsed_status()
print media.get_duration()

字符串“songurl”是来自 Youtube 或 Google Play Music 的歌曲的实际流媒体 URL,它与 MediaPlayer 完美配合。

我还尝试过播放短暂的 0.01 到 0.5 秒的媒体时间,然后尝试获取时间,这在大多数情况下都有效,但随机返回 -1 的持续时间,大约十分之一。再次使用 media.get_duration() 返回相同的结果。

我宁愿只解析这首歌而不是担心播放它,但我想不出任何方法来解析它。我已经向 python-vlc github 提交了一份错误报告,因为我认为 MediaParsedStatus.FIXME_(0L) 是某种错误。

更新:我明白了!这可能是我整个编程生涯中最大的痛苦(这并不多)。以下是用于获取 URL 跟踪时间的代码:

        instance = vlc.Instance()
media = instance.media_new(songurl)
player = instance.media_player_new()
player.set_media(media)
#Start the parser
media.parse_with_options(1,0)
while True:
if str(media.get_parsed_status()) == 'MediaParsedStatus.done':
break #Might be a good idea to add a failsafe in here.
print media.get_duration()

最佳答案

media.parse_with_options 是异步的。因此,您的代码不会等待 URL 的响应,而是立即继续。与所有异步方法一样,您需要收到数据已收到的通知,然后才能继续。在本例中,它看起来像是 MediaParsedChanged 事件。

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media.html#ga55f5a33e22aa32e17a9bb75decd1497b

或者,您应该能够使用 parse() 方法,该方法是同步的,并且会阻塞直到收到元数据。不建议这样做(并且已弃用),因为它可能会无限期地阻塞并锁定。但这是一个选项,具体取决于您使用代码的目的。

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media.html#ga4b71084fb35b3dd8cc6457a4d27baf0c

编辑:

如果您需要使用事件管理器与 python 绑定(bind)的示例,这里是一个很好的示例: VLC Python EventManager callback type?

特别是,看看 Rolf 的答案,因为他使用它的方式可能对您来说是一个很好的起点。

import vlc
parseReady = 0

def ParseReceived(event):
global parseReady
#set a flag that your data is ready
parseReady = 1
...
events = player.event_manager()
events.event_attach(vlc.EventType.MediaParsedChanged, ParseReceived)
...
parseReady = 0
media.parse_with_options(1, 0)
while parseReady == 0:
#TODO: spin something to waste time

#Once the flag is set, your data is ready
print media.get_parsed_status()
print media.get_duration()

毫无疑问有更好的方法可以做到这一点,但这只是一个基本的例子。请注意,根据文档,您不能从事件回调中调用 vlc 方法。因此使用一个简单的标志而不是直接在回调中调用媒体方法。

关于python - 使用 python-vlc 获取基于 URL 的媒体对象的持续时间 - 无法解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55530219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com