如何确保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
相关产品推荐
相关产品推荐

