[[20230916143121]] 『メディアファイルの情報を取得して一覧表にするマ』(動画ファン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『メディアファイルの情報を取得して一覧表にするマクロ』(動画ファン)

以下の続編となります。

『動画ファイルのビットレート』
https://www.excel.studio-kazu.jp/kw/20230914134434.html

『動画ファイルのビットレート』でどうも解決しそうにないので
何かNETで情報を拾えないかと思って探したら以下に行き当たりました。

『動画や写真などのメディアファイルの情報を取得して一覧表にするマクロ Excel VBA』
https://ameblo.jp/hiromi-0505/entry-12570644470.html

コマンドライン版のMediaInfoは以下から入手
入手先:以下のV23.09(Winoes11 64bit CLI)
https://mediaarea.net/en/MediaInfo/Download/Windows

インストール(ZIP解凍先)
C:\Program Files\MediaInfo\MediaInfo_CLI_23.09_Windows_x64
C:\Program Files\MediaInfo\MediaInfo_CLI_23.09_Windows_x64\MediaInfo.exe

GUI版のMediaInfoを操作できているようでDOS窓は、一瞬表示されるので起動しているように思えます。
(思ってるだけかも?)

実情は、LISTシートの1行目にDictionaryの項目が書き出されるだけで
必要なそれぞれの情報が表示されずにエラー無く正常終了してしまいます。
(Dictionary ---> 取得したい項目は ttl = Array(........)で定義)

以下が現在のコードですがどこか間違いがあるのでしょうか?

その他、不足事項等あればアドバイスお願いします。

Option Explicit

 Sub showMediaInfo()

      Dim Itm As Variant
      Dim mDic As Dictionary
      Dim fd As FileDialog
      Const sht = "List"

      'ファイルの複数選択をする
      Set fd = Application.FileDialog(msoFileDialogFilePicker)
      With fd
            If .Show = -1 Then 'ダイアログ表示
                  Sheets(sht).Cells.ClearContents
                  For Each Itm In .SelectedItems
                        Set mDic = getMediaInfo(Itm)
                        Call writeShtMediaInfo(sht, mDic)
                  Next Itm
            Else 'キャンセルした時
                  '何もしない
            End If
      End With

      Set fd = Nothing
      Set mDic = Nothing
 End Sub

 Function writeShtMediaInfo(sht As String, mDic As Dictionary)

      Dim ttl As Variant
      Dim cl As Range, i As Long

      ttl = Array("Folder name:General", _
      "File name extension:General", _
      "File size:General", _
      "Duration:General", _
      "Overall bit rate:General", _
      "Frame rate:General", _
      "DataSize:General", _
      "Encoded date:General", _
      "File creation date:General", _
      "Bit rate:Video", _
      "Width:Video", _
      "Height:Video", _
      "Display aspect ratio:Video", _
      "Frame rate:Video", _
      "Bit depth:Video", _
      "Bit rate:Audio", _
      "Maximum bit rate:Audio", _
      "Channel layout:Audio", _
      "Samples per frame:Audio", _
      "Sampling rate:Audio", _
      "Stream size:Audio")

      With Sheets(sht)
            Set cl = .Cells(1, 1)
            For i = LBound(ttl) To UBound(ttl)
                  cl.Offset(0, i) = ttl(i)
            Next
            Set cl = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            For i = LBound(ttl) To UBound(ttl)
                  cl.Offset(0, i) = mDic.Item(ttl(i))
            Next
      End With

 End Function

 Function getMediaInfo(filepath As Variant) As Dictionary
      'WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択済み。
      Dim Wsh As WshShell, wExec As Object
      Dim exePath As String, exeOpt As String, exeCom As String
      Dim StdO As Object, buf As Variant, kubun As String, j As Long
      Dim mDic As Dictionary
      Set mDic = New Dictionary
      Set Wsh = New WshShell

      '    exePath = "cmd /c c:\aaaa\mediainfo -f "
      '    exeCom = exePath & """" & targetFile & """"
      '    Set wExec = WSH.exec(exeCom)
      exePath = "C:\Program Files\MediaInfo\MediaInfo_CLI_23.09_Windows_x64\mediainfo.exe"
      'exePath = "C:\Applications\MediaInfo_CLI_19.09_Windows_x64\mediainfo"
      exeOpt = " -f "
      exeCom = "cmd /c " & exePath & exeOpt & """" & filepath & """"

      Set wExec = Wsh.Exec(exeCom)
      Set StdO = wExec.StdOut

      Do While Not StdO.AtEndOfStream
            buf = StdO.ReadLine()
            If buf = "" Then '区分が変わる。
                  kubun = ""
            ElseIf InStr(1, buf, " : ") > 0 Then '項目と情報
                  buf = Split(buf, " : ")
                  For j = 0 To UBound(buf)
                        buf(j) = Trim(buf(j))
                  Next j
                  mDic.Item(buf(0) & ":" & kubun) = buf(1)

            Else '" : "がない時は区分名
                  kubun = Trim(buf)
            End If
      Loop

      Set getMediaInfo = mDic

      Set mDic = Nothing
      Set StdO = Nothing
      Set wExec = Nothing
      Set Wsh = Nothing
 End Function

< 使用 Excel:Excel2021、使用 OS:Windows11 >


>以下が現在のコードですがどこか間違いがあるのでしょうか?
そのサイトに問い合わせてみてはどうですか。
(?) 2023/09/16(土) 16:59:02

(移動したようなので)
ところでWMPでは取得出来ませんか?

 Sub getAttribute()
    Dim wmp As Object
    Dim media As Object
    sFile = Application.GetOpenFilename("音楽ファイル,*.mp*")   '要変更
    If sFile = False Then Exit Sub
    Set wmp = CreateObject("new:{6BF52A52-394A-11d3-B153-00C04F79FAA6}")    'WMP7
    Set media = wmp.newMedia(sFile)
    With ActiveSheet
        .Range("A:B").ClearContents
        For i = 0 To media.attributeCount - 1
            .Cells(i + 1, 1).Value = media.getAttributeName(i)
            .Cells(i + 1, 2).Value = media.getItemInfo(media.getAttributeName(i))
        Next i
    End With
 End Sub

(kazuo) 2023/09/16(土) 17:48:38


kazuoさん、ありがとうございます。

>(移動したようなので)

『動画ファイルのビットレート』の方は、停滞したままで
有益なアドバイスが無くなっています。

新しくMediaInfoを利用する方法を摸索する為に新しく質問を作成しました。

明日になっても『動画ファイルのビットレート』の方に進展しない場合は
閉じるさせていただきます。

頂いたコードでmp4のファイル名は書き出されました。
(getAttributeNameがファイル名相当だと思います。)

WMPを利用できるか試したいので
『動画ファイルのビットレート』の方で問題のファイルで求める事が出来なかった
Mp4の再生時間と総ビットレートを求めるgetAttributeに続く名前を教えてください。

(動画ファン) 2023/09/16(土) 18:55:39


>>そのサイトに問い合わせてみてはどうですか。

記事には、質問する場所は提供されていないようですが
どのように問い合わせするか教えてもらえますか ?

(動画ファン) 2023/09/16(土) 19:03:17


>頂いたコードでmp4のファイル名は書き出されました。
>(getAttributeNameがファイル名相当だと思います。)
ん!Mediaオブジェクトの82ヶ程の属性が出力されるはずですが、
まずは、以前のコードでも普通に出力されるファイルで試して下さい

>Mp4の再生時間と総ビットレートを求めるgetAttributeに続く名前を教えてください。
意味不明ですが、以下のこと?
media.getItemInfo "Duration"
media.getItemInfo "Bitrate"

(kazuo) 2023/09/16(土) 19:30:56


もしかしたら,win11のWMPは違うのかも。
私のはVer 12.0.19041.3208です。
最新版についてお分かりになる方フォロー願います。

https://learn.microsoft.com/ja-jp/windows/win32/wmp/duration-attribute

(kazuo) 2023/09/16(土) 22:18:20


kazuoさん、追加のアドバイス感謝します。

>>ん!Mediaオブジェクトの82ヶ程の属性が出力されるはずですが、
>>まずは、以前のコードでも普通に出力されるファイルで試して下さい

普通に問題なく出力されるファイルでテストしています。
82程の属性が出力されるとの事ですが、私のPCでは以下のようにファイル名だけしか出力されません。

SourceURL E:\test_ok\Ep01 AAA.mp4

私自身、普段はWMPを全く使用しないのでチェックしてら
「Windows Media Player Legacy」はインストールされているようですが
「Windows Media Player」の名前は見つからないので
こちらはインストールされていないようです。

調べてみたら、windows11では現在「Windows Media Player」ではなく
「Windows Media Player Legacy」に変更されているようですが?

ちなみにテストファイルの「Ep01 AAA.mp4」は「Windows Media Player Legacy」で問題なく再生されました。

今回のコードは、「Windows Media Player Legacy」でも利用できるコードですか?

>>私のはVer 12.0.19041.3208です。

私の「Windows Media Player Legacy」のVerの表示方法が良くわかりません。
Windows Media Player Legacy」プロパティを見ても記載が有りませんでした。

(検索しても「Windows Media Player」の方はヒットしますが
「Windows Media Player Legacy」については情報が拾えませんでした。)
(動画ファン) 2023/09/17(日) 05:44:38


『動画や写真などのメディアファイルの情報を取得して一覧表にするマクロ Excel VBA』のコードで
私のPCに合わせて変更したのは、

以下の部分だけです。
exePath = "C:\Program Files\MediaInfo\MediaInfo_CLI_23.09_Windows_x64\mediainfo"

(以下にも変更してみましたが結果は同じでした。
exePath = "C:\Program Files\MediaInfo\MediaInfo_CLI_23.09_Windows_x64\mediainfo.exe")

インストール(ZIPの解凍先)が「C:\Program Files¥-----」では問題があるのでしょうか?

(動画ファン) 2023/09/17(日) 06:01:11


 exeファイルのパス中に spaceが入っているので、その対応が必要では?
 # そんな話じゃなければ失礼。全体を読んでいる訳じゃないので。
(xyz) 2023/09/17(日) 06:23:29

xyzさん、アドバイス感謝します。

>>パス中に spaceが入っているので、その対応が必要では?

調査の結果、
ご指摘のとうりフルパス中にスペースがある事が原因でした。
ZIP解凍先を変更して、項目(属性)が表示されるようになりました。

色々試していますが、どうも動画のコーデックの違いなどで動画によっては
上手く表示できる項目と出来ない項目があるようです。
(CLI版ではない普通のインストール版でも表示される項目と表示されない項目が
動画で違っている場合があります。)

CLI版のバージョンアップで表示されるようになるかも知れません。

おかげさまで解決できました。
お礼申し上げます。

(動画ファン) 2023/09/17(日) 07:33:37


解決と思いましたが、
"File name extension:General"で表示されるファイル名が日本語の場合
文字化けしてしまします。

例えば、
「Ep01 心の歌.mp」4 の場合
「ep1 蠢・・豁・mp4」のように表示されます。

これを文字化けしないようにコードを編集できる場合は教えてください。
(動画ファン) 2023/09/17(日) 08:32:04


>今回のコードは、「Windows Media Player Legacy」でも利用できるコードですか?
あくまでも9シリーズまでのコードです。
クラスIDがLegacyと同じなんて無知で板汚し済みませんでした。
退散いたします。

>私の「Windows Media Player Legacy」のVerの表示方法が良くわかりません。
先のコードでEnd Subにブレークポイントを置いて、
?wmp.versioninfo
して表示された値でした。wmpの画面表示とは異なるようです。

(kazuo) 2023/09/17(日) 10:56:30


kazuoさん、ありがとうございます。

現在のWMPでは利用できないと思われるのでこれ以上のサーチは止めておきます。

教えてもらった方法で私の「Windows Media Player Legacy」のVerの表示すると
「12.0.22621.2070」と表示されました。

お世話になりました。

'---------------------------------------------------------------------------
文字化けしないようにコードを編集できないので

VBAの達人さんは、もっと他のアプローチがあると思われるのでが、
苦肉の策でファイル名の所だけ正常に書き出されるように上書きするコードを追加しました。

以下現在のコードですが変更すべき事項などアドバイスあればお願いします。

Option Explicit

 Sub showMediaInfo()  'コマンドライン版のMediaInfoを利用

      'コマンドライン版のMediaInfo(64Bit CLI版)は、別途下記からZIPファイルを入手してください。
      'https://mediaarea.net/en/MediaInfo/Download/Windows

      'MediaInfo は、WshShell の.execメソッドでファイルごとに呼び出していますので、
      '選択ファイルの数だけDOS窓が一瞬起動しては消えていきます。
      '初めて動かしたときは驚かれるかもしれませんが正常な状況で暴走しているわけではありません。

      Dim Itm As Variant
      Dim mDic As Dictionary
      Dim fd As FileDialog

      Const sht = "List"   '書き出すシート名はListに固定してあります。

      Sheets(sht).Cells.ClearContents

      Application.ScreenUpdating = False

      'ファイルの複数選択をする
      Set fd = Application.FileDialog(msoFileDialogFilePicker)

      fd.Title = "調査する動画ファイルを選択してください。(同一フォルダーなら複数可)"
      With fd
            If .Show = -1 Then 'ダイアログ表示
                  For Each Itm In .SelectedItems
                        Set mDic = getMediaInfo(Itm)
                        Call writeShtMediaInfo(sht, mDic)
                  Next Itm
            Else 'キャンセルした時終了
                  MsgBox "処理は、キャンセルされました。", vbInformation
                  Exit Sub
            End If
      End With

      With Sheets(sht)
            .Cells(1, 1) = ""
            .Cells(1, 2) = "ファイル名"
            .Cells(1, 3) = "ファイルサイズ(GB)"
            .Cells(1, 4) = "再生時間"
            .Cells(1, 5) = "総ビットレート(kbps)"
            .Cells(1, 6) = "動画ビットレート(kbps)"
            .Cells(1, 7) = "動画(幅)"
            .Cells(1, 8) = "動画(高さ)"
            .Cells(1, 9) = "音声ビットレート(kbps)"
      End With

      Dim lcn As Long
      Dim i As Long

      lcn = Sheets(sht).Cells(Rows.Count, 2).End(xlUp).row

      For i = 2 To lcn '再生時間をhh:mm:ssで表示
            With Sheets(sht)
                  .Cells(i, 4) = Left(.Cells(i, 4), 8)
            End With
      Next

      'A列のパスは必要ないので削除
      Columns(1).Delete

      '-----以下は、ファイル名が文字化けするので改めてファイル名だけ上書きする処理
      Dim folderPath As Variant
      folderPath = fd.InitialFileName

      Dim fso As Object
      Dim folder As Object
      Dim file As Object
      Dim shell As Object

      Set fso = CreateObject("Scripting.FileSystemObject")
      Set folder = fso.GetFolder(folderPath)
      Set shell = CreateObject("Shell.Application")

      Dim varFolPath As Variant
      Dim objFld As Variant
      Dim bitrate As Long
      Dim row As Long

      varFolPath = folderPath

      Set objFld = shell.Namespace(varFolPath)

      row = 2

      For Each file In folder.Files
            If LCase(fso.GetExtensionName(file.path)) = "mp4" Then

                  Sheets(sht).Cells(row, 1) = file.Name  'ファイル名
                  row = row + 1
            End If
      Next file

      '列幅自動調整
      Sheets(sht).Columns("A:I").AutoFit

      Application.ScreenUpdating = True

      Set fd = Nothing
      Set mDic = Nothing
 End Sub

 Function writeShtMediaInfo(sht As String, mDic As Dictionary)

      Dim ttl As Variant
      Dim cl As Range, i As Long

      ' 取得したい項目は、ttl = Array(........) で定義しています。
      ttl = Array("Folder name:General", _
      "File name extension:General", _
      "File size:General", _
      "Duration:General", _
      "Overall bit rate:General", _
      "Bit rate:Video", _
      "Width:Video", _
      "Height:Video", _
      "Bit rate:Audio")

      With Sheets(sht)
            Set cl = .Cells(1, 1)
            For i = LBound(ttl) To UBound(ttl)
                  cl.Offset(0, i) = ttl(i)
            Next
            Set cl = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            For i = LBound(ttl) To UBound(ttl)
                  cl.Offset(0, i) = mDic.Item(ttl(i))
            Next
      End With

 End Function

 Function getMediaInfo(filepath As Variant) As Dictionary
      'WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
      Dim Wsh As WshShell, wExec As Object
      Dim exePath As String, exeOpt As String, exeCom As String
      Dim StdO As Object, buf As Variant, kubun As String, j As Long
      Dim mDic As Dictionary
      Set mDic = New Dictionary
      Set Wsh = New WshShell

      'exePathファイルのフルパス中に spaceが入っていると起動しないので注意 !!
      exePath = "C:\Applications\MediaInfo_CLI_23.09_Windows_x64\MediaInfo"

      exeOpt = " -f "
      exeCom = "cmd /c " & exePath & exeOpt & """" & filepath & """"

      Set wExec = Wsh.Exec(exeCom)
      Set StdO = wExec.StdOut

      Do While Not StdO.AtEndOfStream
            buf = StdO.ReadLine()
            If buf = "" Then '区分が変わる。
                  kubun = ""
            ElseIf InStr(1, buf, " : ") > 0 Then '項目と情報
                  buf = Split(buf, " : ")
                  For j = 0 To UBound(buf)
                        buf(j) = Trim(buf(j))
                  Next j
                  mDic.Item(buf(0) & ":" & kubun) = buf(1)

            Else '" : "がない時は区分名
                  kubun = Trim(buf)
            End If
      Loop

      Set getMediaInfo = mDic

      Set mDic = Nothing
      Set StdO = Nothing
      Set wExec = Nothing
      Set Wsh = Nothing

 End Function

(動画ファン) 2023/09/17(日) 12:01:24


>「Ep01 心の歌.mp」4 の場合
このファイル名はどうやって付けたのですか。
拡張子「.mp」は存在しません。
たたしくは「.mp4」ではないのですか。
(わからん) 2023/09/17(日) 12:08:17

>>「Ep01 心の歌.mp」4

すいません。
「Ep01 心の歌.mp4」の間違いです。

「たたしく」 ----> ただしく(正しく)ですよね。

>>拡張子「.mp」は存在しません。

今回は、私の記載ミスですが調べてもらえれば判ると思いますが
拡張子「.mp」は存在します。

(動画ファン) 2023/09/17(日) 12:23:23


>「たたしく」 ----> ただしく(正しく)ですよね。
指摘ありがとう。その通りです。
>拡張子「.mp」は存在します。
「.mp3」、「.mp4」ばかりを使用していたので
存在しているのを忘れていました。
失礼しました。
(わからん) 2023/09/17(日) 14:28:14

 解決されたので余談ということになります。

 文字化けとのことですが、ADODBなどを使って変換する方法もあると思います。
 ただ、なぜEp01がep1になるんだろうかとか、なぜその項目だけそうなるのか、
 単にそのファイルだけのデータの誤りかもしれないし、
 副作用が別途発生するかもしれない、などと漠然と思って時が過ぎました(単なる感想です)。
 ベストの対応をされたように思います。

 あと、スペース対応ですが、(既に対応されていた)対象ファイルを""で囲むのと同じ方法を、
 exeファイルのパスにも同様に適用すれば、特にインストール先を変更しなくてもよかったかもしれません。
 先刻ご承知の方法かと思っていました。言葉足らずでしたね。
(xyz) 2023/09/17(日) 14:46:36

>>なぜEp01がep1になるんだろうかとか、

あ!、失礼しました。

ファイル名だけを取り出して文字列の文字化けを修正しようとして
EXCELで試行錯誤して変換中に
Ep01がep01になってしまっていたのをそのままに記載してしまいました。

>>特にインストール先を変更しなくてもよかったかもしれません。
インストールの件は、アドバイスで
Zipの解凍先を変更するだけなのでそれほどの手間がかからずに
問題が修正できたので気になさらないでください。

>>文字化けとのことですが、ADODBなどを使って変換する方法もあると思います。

ADODBが何なのか?
さっぱり理解できていません。

今回は文字化けを「上書き」と言う強引な方法で処理しましたが
勉強のためお聞きしますが、
文字化けしたファイル名のセルをターゲットとしてADOBを利用して
文字化けしない文字列に変換すると言う手法でしょうか?

何か素人にも判りそうな参考になるURLがあれば紹介ください。
(動画ファン) 2023/09/17(日) 16:10:44


 素人ではないようにお見受けします。
 こちらのサイトで「全文検索」していただくと参考記事が多くあると思います。

(xyz) 2023/09/17(日) 20:05:30


>>素人ではないようにお見受けします。

いえいえ素人の域はでいません。
掲載したコードは、
ほぼ最初の『動画や写真などのメディアファイルの情報を取得して一覧表にするマクロ Excel VBA』
のコードで私が変更したのは簡単な数コードです。

>>こちらのサイトで「全文検索」していただくと参考記事が多くあると思います。

参考になりそうな記事を見つけました。

『日本語Shift_jisに変換』
https://www.excel.studio-kazu.jp/kw/20230619100018.html

思うに現在のコードではファイル名を拾ってきているのは
Function getMediaInfo(filepath As Variant)の部分ですが
MediaInfoと言う海外産のサードパーティのアプリでファイル名を読み込んでいます。

この場合でも、上記の記事は利用できますか?

(動画ファン) 2023/09/18(月) 04:45:07


 一般的な文字コード変換の手法を紹介したまでです。
 どのようにencodeされたものかも不明なので、私にはわかりません。
 また、私はそれの解明に時間を割くつもりはありません。
 他の方からのコメントをお待ちください。
 既に書きましたとおり、別の手法で文字化けしないファイル名があるのですから、
 それをそのまま使用することをお薦めします。

(xyz) 2023/09/18(月) 10:04:04


一般的なアドバイスで私のコードに対する直接のアドバイスではないとの事
及び既に上書きで事足りているのでこれ以上の探索は止めます。

(動画ファン) 2023/09/18(月) 10:34:42


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.