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

如何确保pymediainfo/mediainfo轨道排序一致?能否依赖列表索引?

能否依赖pymediainfo的tracks列表索引作为稳定轨道排序序号?

结论:不建议直接依赖media_info.tracks的列表索引作为稳定排序序号,应基于libmediainfo提供的官方排序属性实现自定义排序。

原因分析

  • 底层libmediainfo的轨道输出逻辑并非完全固定:
    你提到的旧规则(同类型轨道按ID升序)已不适用于部分容器(如Matroska),实际排序会根据容器特性采用不同依据(比如你观察到的StreamOrder)。tracks列表的索引只是libmediainfo处理后输出的顺序,这个内部处理逻辑可能随容器类型、库版本迭代发生变化,哪怕同一版本,不同容器的排序逻辑也可能存在差异,直接依赖索引会导致排序一致性不可靠。
  • 索引并非官方定义的排序标识:
    libmediainfo在XML输出中的typeorder(JSON输出为@typeorder)、pymediainfo提供的stream_identifier才是官方用来定义轨道排序规则的属性:
    • typeorder:定义全局轨道类型的优先级(视频>音频>文本>其他)
    • stream_identifier:定义同类型轨道内部的排序顺序

可靠的稳定排序实现

基于官方提供的属性自定义排序逻辑,能保证同一文件在任意机器、甚至跨libmediainfo版本下的排序一致性:

from pymediainfo import MediaInfo

def get_stable_sorted_tracks(file_path):
    media_info = MediaInfo.parse(file_path)
    # 按轨道类型优先级+同类型内部排序键排序
    return sorted(
        media_info.tracks,
        key=lambda track: (int(track.typeorder), int(track.stream_identifier))
    )

# 使用示例
sorted_tracks = get_stable_sorted_tracks("your_media_file.mkv")
for idx, track in enumerate(sorted_tracks):
    print(f"排序序号{idx+1}: 轨道类型{track.track_type}, ID{track.track_id}")

补充说明

如果仅在同一libmediainfo版本、同一容器类型的场景下使用,依赖tracks列表索引大概率能保持一致,但这种一致性是未被官方承诺的“隐性行为”,一旦库版本更新或处理不同容器,排序就可能出现偏差。因此,基于官方属性的自定义排序是更稳妥的方案。

内容的提问来源于stack exchange,提问作者ejm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:23:16