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”,然后在右側勾選想要添加的視頻屬性。每次只能添加一個。需添加其他視頻屬性,用同樣的辦法新增列即可。

當所有需要的列都設置完畢?;氐絋C窗口。全選所有視頻文件,然后在菜單欄中找到“Mark"菜單,選擇“Copy To Clipboard With All Details"。

復制粘貼文件屬性

將文件屬性復制到剪貼板后,打開一個文本文件,粘貼,保存文本文件。接下來就是用PowerQuery來處理了。

TC大法的好處是避免無數分號導致的默認分列會產生無數垃圾列和垃圾信息,除非像前文那樣手動修改代碼去除垃圾列,研究Mediainfo軟件導出信息詳情,剔除不需要的列以避免垃圾信息。

壞處是復制粘貼出來的沒有列標題,需要自己手動添加。這在PowerQuery中也不是什么難事兒。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,753評論 0 11
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,430評論 9 467
  • 這是我這段時間寫的關于Mac Finder的一系列知識和操作技巧,現在整理出來,希望大家能夠喜歡。我也將會繼續奉獻...
    Mac高級玩家閱讀 115,711評論 11 236
  • 創業的哥們覺得要突破一步一步走的農民思維,要有超人的想法,才會在機遇到來之時有所突破。嚴謹的審計人員會覺得,上兵伐...
    新興市場的小邏輯閱讀 236評論 0 0