PowerQuery自动获取媒体文件信息

这个例子估计应用面比较窄。我需要批量获取某个文件夹下所有视频的基本信息,并按一定规则对这些基本信息进行计算、排列组合。

PowerQuery自动获取媒体文件信息_第1张图片
视频文件

我需要批量获取类似上图中的mp4文件的文件名(不要后缀)、编码(AVC/AAC)、码率(数字)、时长(分钟|秒显示方式)、文件体积(数字),将其填写到Excel中。

课程不归我管,是一个小姑娘在管,每次她都是手动一个一个点开这些视频,从详细信息中获取这几个字段的值,手工一个一个复制粘贴。后来她领导想了个聪明办法:凡是要提交课程的部门,自己把课程基本信息填写好。于是体力活儿转嫁到我们这些业务部门来了。作为懒人,我可不想这么干。

这个案例中,最难的是怎么批量提取视频文件的基本信息。我之前爬网,没找到直接用windows资源管理器搞定我需要的字段信息的办法,虽然我能在详细信息里看到。
后来找到了Mediainfo这个软件。

下载安装后,打开:

PowerQuery自动获取媒体文件信息_第2张图片
Mediainfo界面

在上面的红框处点击,定位包含视频的文件夹,然后选中,加载到Mediainfo中来。
然后在下面的红框处点击,进入导出meta信息的界面:

PowerQuery自动获取媒体文件信息_第3张图片
导出meta信息设置

选择csv,保持默认,注意最后大红框处选择输出文件的路径。我输出到桌面。

有了这个文件之后,剩下的就很简单了,在PowerQuery中,导入csv文件。操作也没有什么特别之处:

let
源 = Csv.Document(File.Contents("C:\Users\wanght\Desktop\test.csv"),[Delimiter=",", Columns=3, QuoteStyle=QuoteStyle.None]),
按分隔符拆分列 = Table.SplitColumn(源, "Column1", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv)),
删除的其他列 = Table.SelectColumns(按分隔符拆分列,{"Column1.5", "Column1.19", "Column1.20", "Column1.24", "Column1.27"}),
提升的标题 = Table.PromoteHeaders(删除的其他列, [PromoteAllScalars=true]),
筛选的行 = Table.SelectRows(提升的标题, each ([#"General Duration/String"] <> null and [#"General Duration/String"] <> "" and [#"General Duration/String"] <> "1" and [#"General Duration/String"] <> "Chinese (China)")),
删除的副本 = Table.Distinct(筛选的行),
按分隔符拆分列1 = Table.SplitColumn(删除的副本, "General Duration/String", Splitter.SplitTextByDelimiter("min", QuoteStyle.Csv), {"General Duration/String.1", "General Duration/String.2"}),
更改的类型2 = Table.TransformColumnTypes(按分隔符拆分列1,{{"General Duration/String.1", Int64.Type}, {"General Duration/String.2", type text}}),
替换的值 = Table.ReplaceValue(更改的类型2,"s","",Replacer.ReplaceText,{"General Duration/String.2"}),
重命名的列 = Table.RenameColumns(替换的值,{{"General Duration/String.1", "Minutes"}, {"General Duration/String.2", "Seconds"}}),
替换的值1 = Table.ReplaceValue(重命名的列,"MiB","",Replacer.ReplaceText,{"General FileSize/String"}),
更改的类型3 = Table.TransformColumnTypes(替换的值1,{{"General FileSize/String", type number}, {"Minutes", Int64.Type}, {"Seconds", Int64.Type}}),
自定义1 = Table.TransformColumns(更改的类型3,{"General CompleteName", each Text.BetweenDelimiters(_,"\",".",{0, RelativePosition.FromEnd},0)}),
删除的列 = Table.RemoveColumns(自定义1,{"General OverallBitRate_Maximum/String"}),
重命名的列1 = Table.RenameColumns(删除的列,{"General CompleteName", "课件名称"}),
分组的行 = Table.Group(重命名的列1, {"课件名称"},{{"课件名称1",each Text.Combine(_[课件名称],"|")},{"大小", each List.Sum([#"General FileSize/String"]), type number}, {"分钟", each List.Sum([Minutes]), type number}, {"秒", each List.Sum([Seconds]), type number}}),
重命名的列2 = Table.RenameColumns(分组的行,{{"大小", "文件大小(兆)"}})
in
重命名的列2

值得注意的是,Mediainfo导出来的视频文件meta信息中,有无数个分号(不知道这些分号是怎么回事,也没有仔细追究过,留待将来去弄清吧),这导致在PowerQuery中分列时,如果按默认设置,会分出无数个列来。所以我把按分隔符拆分列的那一行中的列参数直接干掉了,变成了:

  按分隔符拆分列 = Table.SplitColumn(源, "Column1", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv)),

另外一个值得一提的是,当我从文件路径中分离出课件名字时,用了Text.BetweenDelimiters()函数。很好很强大。在知道这个函数之前,我都是老老实实按“\”分隔符分列,然后删除不必要的行,再替换掉最末尾的“.mp4”。有了这个函数,一步就搞定了。算的上比较优雅的方式了。

这两天在折腾windows下的神器Total Commander,找到了用它来批量获取媒体文件信息的方法。首先还是要安装Mediainfo插件,安装好之后到TC设置列的筛选条件:

PowerQuery自动获取媒体文件信息_第4张图片
设置列筛选条件

定位到视频文件所在的文件夹,在TC左侧窗口列表标题栏(上图红色箭头)任意位置右键,弹出如图的窗口,勾选“Configure this custom columns view...

PowerQuery自动获取媒体文件信息_第5张图片
添加列

在弹出窗口中选择”Add column"。新增一列之后,点击该列右边的“+”号,为其设置具体的内容:

PowerQuery自动获取媒体文件信息_第6张图片
设置列要显示的内容

在弹出窗口中选择“mediainfo”,然后在右侧勾选想要添加的视频属性。每次只能添加一个。需添加其他视频属性,用同样的办法新增列即可。

当所有需要的列都设置完毕。回到TC窗口。全选所有视频文件,然后在菜单栏中找到“Mark"菜单,选择“Copy To Clipboard With All Details"。

PowerQuery自动获取媒体文件信息_第7张图片
复制粘贴文件属性

将文件属性复制到剪贴板后,打开一个文本文件,粘贴,保存文本文件。接下来就是用PowerQuery来处理了。

TC大法的好处是避免无数分号导致的默认分列会产生无数垃圾列和垃圾信息,除非像前文那样手动修改代码去除垃圾列,研究Mediainfo软件导出信息详情,剔除不需要的列以避免垃圾信息。

坏处是复制粘贴出来的没有列标题,需要自己手动添加。这在PowerQuery中也不是什么难事儿。

你可能感兴趣的:(PowerQuery自动获取媒体文件信息)