You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:25:11