如何一條Mediainfo --Inform語句同時獲取視訊引數和音訊引數多個Parameters

東行不西遊發表於2018-11-13

mediainfo是一個能獲取多媒體檔案詳細資訊的軟體,包括內容資訊,視訊資訊,音訊資訊,文字資訊等,有了它我們可以檢視視訊的寬高,比例,播放時長,音軌,位元率等等資訊

準備工作

個人部落格地址為:dangbowen.com,歡迎加入收藏夾 參考php-mediainfo教程安裝mediainfo並實際操作栗子看能否正確呼叫mediainfo命令

命令詳解

先讓我們看下一個普通視訊檔案的資訊都包含哪些

$ mediainfo 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
General
Complete name                            : http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv
Format                                   : Flash Video
File size                                : 500 KiB
Duration                                 : 11 s 711 ms
Overall bit rate                         : 350 kb/s
Tagged date                              : UTC 2011-02-27 11:00:33
Tagging application                      : inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2

Video
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : Main@L2.1
Format settings                          : CABAC / 3 Ref Frames
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 3 frames
Codec ID                                 : 7
Duration                                 : 11 s 711 ms
Width                                    : 426 pixels
Height                                   : 240 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Constant
Frame rate                               : 30.000 FPS
Original frame rate                      : 29.970 (29970/1000) FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive

Audio
Format                                   : AAC
Format/Info                              : Advanced Audio Codec
Format profile                           : LC
Codec ID                                 : 10-2
Duration                                 : 11 s 702 ms
Channel(s)                               : 2 channels
Channel positions                        : Front: L R
Sampling rate                            : 22.05 kHz
Frame rate                               : 21.533 FPS (1024 SPF)
Compression mode                         : Lossy
複製程式碼

能看到格式,size大小,寬,高,duration等等常用資訊,讓我們一一用mediainfo命令來獲取

獲取檔案格式

$ mediainfo --Inform="General;%Format%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
Flash Video
複製程式碼

返回的是general下的format資訊,比如你要的是video下的format資訊呢

$ mediainfo --Inform="Video;%Format%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
AVC
複製程式碼

這會拿到的是Video資訊下的format,切記這裡獲取引數的大小寫是嚴格區分的.這2個栗子可以發現如果想獲取mediainfo各個引數的資訊是先找到 分類名(類似General,Video,Audio)->引數(Format,Width這種),格式就是 用mediainfo的Inform

mediainfo --Inform="分類名;%引數名%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'

這個格式記住可以獲取你想要的任何引數

讓我們來練習一下: 套用格式獲取duration資訊

$ mediainfo --Inform="Video;%Duration%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
11711
複製程式碼

我們可以看到取出來的播放時長單位是毫秒,而不是秒.

再來嘗試一下獲取檔案大小:

$ mediainfo --Inform="General;%File size%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'

複製程式碼

??? 為什麼返回值是空呢,格式沒有錯卻無法獲得檔案的大小. 因為在顯示的引數都是格式化後的,所以你會看到File size之間是有空格的,如果想獲得檔案大小應該替換成FileSize

$ mediainfo --Inform="General;%FileSize%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
512000
複製程式碼

此時就順利獲取到了檔案大小,那如何知道各個引數的真正引數名呢,用這個命令可以獲取所有的詳細引數的真實引數名

$ mediainfo --Info-Parameters
General
Count                     : Count of objects available in this stream
Status                    : bit field (0=IsAccepted, 1=IsFilled, 2=IsUpdated, 3=IsFinished)
StreamCount               : Count of streams of that kind available
StreamKind                : Stream type name
StreamKind/String         : Stream type name
....此處省略剩餘行資訊
複製程式碼

引數顯示的太多,不方便我們查詢,我們可以輸出到一個txt檔案裡

$ mediainfo --Info-Parameters > mediainfo_parameters.txt
複製程式碼

開啟mediainfo_parameters.txt可以搜尋FileSize
那行顯示 FileSize : File size in bytes,同理我們根據這個可以獲得你所需要的引數資訊

看到這裡你可能已經能熟練使用這個命令獲取單個引數值,但是實際場景中可能獲取的引數是多個的 例如:同時獲取視訊的寬,高,播放時長? 很簡單每個引數都用%%包裹起來然後每個引數用,分割即可,命令如下:

$ mediainfo --Inform="Video;%Width%,%Height%,%Duration%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
426,240,11711
複製程式碼

此時我們可以一條語句獲得視訊的寬,高,播放時長資訊,這裡的 逗號 可以替換別的字元,你可以用空格,|等可以自行嘗試一下,反正解析資料的時候對應好相應的字元就行.簡單例子:

$ mediainfo --Inform="Video;%Width%|%Height%|%Duration%" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
426|240|11711
複製程式碼

看到這裡,你已經會用一條命令獲取一個分類下的多個引數資訊了,那麼如果是要求同時獲取視訊的寬,高,播放時長,音訊的format多個引數資訊可以麼? 這個問題當初也困擾了我一陣,命令各種嘗試之下終無解,最後發現mediainfo的inform命令是支援檔案執行的.例子如下:

#編輯一個文字放 一行命令
vi 1.txt
Video;%Width%|%Height%|%Duration%
wq
#命令呼叫該文字
$ mediainfo --Inform="file://1.txt" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
426|240|11711

#修改文字命令如下
vi 1.txt
Video;%Width%,%Height%,%Duration%,
Audio;%Format%
wq
#重新執行命令
$ mediainfo --Inform="file://1.txt" 'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'
426,240,11711,AAC
複製程式碼

此時可以看到一條命令已經可以獲得視訊的寬高播放時長和音訊的format資訊

最後

有的人會想為什麼一定要一條命令這麼費勁巴拉的處理問題呢?多一條命令也不會多慢? 當你處理幾條,幾十條視訊資料的時候你用多條命令獲取這些引數可能影響不大,因為資料量太小.但是實際問題你可能一次要處理上十萬條資料,甚至上百萬,上千萬個資料時,那麼精簡的一條命令可以縮短指令碼的響應時間,提高任務的執行速度,儘量減小了系統開銷,這是在生產環境實際處理資料後的一點經驗.

本文作者: Bowen 本文連結: dangbowen.com/server/cdb3…
版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明出處!

相關文章