树莓派Zero 2 W无头应用中Python-VLC获取视频时长报错
问题解决:MediaListPlayer无get_length()方法,正确获取视频时长
你遇到的问题核心很明确:MediaListPlayer类本身并没有get_length()方法,这个方法属于vlc.Media对象。要获取视频时长,你需要从媒体列表中取出对应的Media实例,解析元数据后再调用时长方法。
具体修改步骤
- 从
media_list中取出目标视频对应的Media对象 - 调用
parse()方法让VLC解析媒体元数据(裸H264流必须走这一步,否则大概率返回-1) - 通过
Media对象的get_length()获取时长(返回值为毫秒,可按需转换为秒)
修改后的代码
import vlc import time video_file = '/var/tmp/video.h264' instance = vlc.Instance("--verbose=0","--no-xlib","--vout=mmal_vout") media_list = instance.media_list_new([video_file]) list_player = instance.media_list_player_new() list_player.set_media_list(media_list) # 获取列表中第一个媒体对象(你的场景里只有一个视频) media = media_list.item_at_index(0) # 解析媒体元数据,确保能读取到时长信息 media.parse() # 获取时长(单位:毫秒),转换为秒方便后续使用 duration_ms = media.get_length() duration = duration_ms / 1000 if duration_ms != -1 else 0 list_player.play() # 用实际视频时长控制播放,替代固定定时器 if duration > 0: time.sleep(duration + 1) # 加1秒缓冲避免提前停止 else: # 解析失败时 fallback 到原定时器逻辑 time.sleep(TriggerOnTime.seconds + (TriggerOnTime.microseconds / 1000000) + 1) list_player.stop()
补充说明
- 裸H264流没有容器格式的元数据,VLC需要主动解析才能识别时长,
parse()是必不可少的步骤 - 如果
get_length()返回-1,说明解析失败,此时可以沿用你原来的定时器逻辑作为兜底 MediaListPlayer的定位是媒体列表播放控制,单个媒体的属性(时长、编码等)必须从对应的Media对象获取
内容的提问来源于stack exchange,提问作者user838358
相关产品推荐
相关产品推荐

