PowerQuery自动获取媒体文件信息

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

视频文件

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

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

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

下载安装后,打开:

Mediainfo界面

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

导出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设置列的筛选条件:

设置列筛选条件

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

添加列

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

设置列要显示的内容

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

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

复制粘贴文件属性

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,673评论 18 139
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,727评论 0 11
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,284评论 9 467
  • 这是我这段时间写的关于Mac Finder的一系列知识和操作技巧,现在整理出来,希望大家能够喜欢。我也将会继续奉献...
    Mac高级玩家阅读 115,438评论 11 236
  • 创业的哥们觉得要突破一步一步走的农民思维,要有超人的想法,才会在机遇到来之时有所突破。严谨的审计人员会觉得,上兵伐...
    新兴市场的小逻辑阅读 230评论 0 0