как перечислить битовую глубину и битрейт всех файлов в наборе вложенных папок? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть большая коллекция c музыки, и я хотел бы узнать скорость передачи и разрядность отдельных файлов.

Я использую Windows 10, и он не показывает свойства всех файлы в папках (при детальном просмотре нет возможности «развернуть» папку, как на ma c). Я знаю, как добавить метку битовой глубины и метку битрейта в окно, когда я открываю папку для просмотра файлов в ней. Но мне нужно найти все файлы, например, с разрядностью 24 бита в наборе вложенных папок, которые содержат много файлов musi c: некоторые 16-битные и некоторые 24-битные. Цель этого упражнения - разделить все файлы размером> 16 бит в другой каталог.

Я пробовал использовать тег mp3, приложение, которое перечисляет эти свойства для всех файлов в каталоге (даже тех, которые глубоко вложены), но это мучительно медленный на моем ноутбуке (30000 файлов можно было бы просто перечислить за 5 часов). Я пробовал использовать mediainfo (из mediaarea. net), но он работает только с отдельными файлами. Я попытался сопоставить сетевую папку (в которой существуют файлы) и использовать команду «tree», но она тоже не работает. Поиск в Google по запросу «рекурсивно перечислить битрейт всех файлов в windows» дал несколько ссылок, одной из которых 11 лет здесь . Я изменил его для fla c вот так

function Get-FLACs( [string]$directory = "$pwd", [int]$minimumBitrate = 32 ) {
  $shellObject = New-Object -ComObject Shell.Application
  $bitrateAttribute = 0

  # Find all flac files under the given directory
  $flacFiles = Get-ChildItem $directory -recurse -filter '*.flac'
  foreach( $file in $flacFiles ) {
    # Get a shell object to retrieve file metadata.
    $directoryObject = $shellObject.NameSpace( $file.Directory.FullName )
    $fileObject = $directoryObject.ParseName( $file.Name )
    Write-Output ("filename",$fileObject)

      # Find the index of the bit depth attribute, if necessary.
      for( $index = 5; -not $bitdepthAttribute; ++$index ) {
        $name = $directoryObject.GetDetailsOf( $directoryObject.Items, $index )
        if( $name -eq 'Bit depth' ) { 
          $bitdepthAttribute = $index 
          Write-Output ("bit depth index",$bitdepthAttribute)
          $bitdepthString = $directoryObject.GetDetailsOf( $fileObject, $bitdepthAttribute )
          Write-Output ("bit depth",$bitdepthString)
          }
      }
    }

Я попытался протестировать приведенный выше сценарий в папке с 2 файлами fla c, оба из которых имеют глубину 24 бита и частоту дискретизации 96 кГц.

Результатом приведенного выше сценария было

 PS C:\Users\Stefan\Downloads\Compare formats> Get-FLACs
filename


Application  : System.__ComObject
Parent       : System.__ComObject
Name         : BATIK - The Old Man FLAC
Path         : C:\Users\Stefan\Downloads\Compare formats\BATIK - The Old Man FLAC.flac
GetLink      :
GetFolder    :
IsLink       : False
IsFolder     : False
IsFileSystem : True
IsBrowsable  : False
ModifyDate   : 6/15/2014 11:27:46 PM
Size         : 66131611
Type         : FLAC File

bit depth index
174
bit depth

filename
Application  : System.__ComObject
Parent       : System.__ComObject
Name         : Carmen Gomes Inc - A 1000 Shades of Blue FLAC
Path         : C:\Users\Stefan\Downloads\Compare formats\Carmen Gomes Inc - A 1000 Shades of Blue FLAC.flac
GetLink      :
GetFolder    :
IsLink       : False
IsFolder     : False
IsFileSystem : True
IsBrowsable  : False
ModifyDate   : 4/26/2014 8:41:08 PM
Size         : 34188974
Type         : FLAC File

Для первого файла он нашел атрибут 'bit-depth' и его индекс (174), но не нашел атрибут для второго файла. . Ни в том, ни в другом случае скрипт не нашел правильную битовую глубину, а просто оставил значение пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...