Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] получить длительность аудио (wav)-файла.

Ответить
Настройки темы
PowerShell - [решено] получить длительность аудио (wav)-файла.

Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


Изменения
Автор: 9119
Дата: 08-06-2021
Добрый.

Есть необходимость вывести длительность wav-файла в консоль.


Нашел для себя способ такой:

Код: Выделить весь код
 Get-MediaInfoSummary "C:\project\Book0001.wav" | Select-String -Pattern 'Duration'
на выходе получим:
Код: Выделить весь код
Duration                                 : 58 s 378 ms
Duration                                 : 58 s 378 ms
причем дважды, т.к так выводит модуль.
Скрытый текст
General
Complete name : C:\project\Book0001.wav
Format : Wave
File size : 19.6 MiB
Duration : 58 s 378 ms
Overall bit rate mode : Constant
Overall bit rate : 2 823 kb/s

Audio
Format : PCM
Format profile : Float
Codec ID : 3
Codec ID/Hint : IEEE
Duration : 58 s 378 ms
Bit rate mode : Constant
Bit rate : 2 822 kb/s
Channel(s) : 2 channels
Sampling rate : 44.1 kHz
Bit depth : 32 bits
Stream size : 19.6 MiB (100%)


Для использования в переменной
Код: Выделить весь код
 $duration = Get-MediaInfoSummary "C:\project\Book0001.wav" | Select-String -Pattern 'Duration'
мне нужно 5-ти значное число и только в единственном экземпляре.

Т.е. было
Код: Выделить весь код
Duration                                 : 58 s 378 ms
Duration                                 : 58 s 378 ms
а нужно:
первый вариант:
Код: Выделить весь код
58378
второй вариант:
Код: Выделить весь код
58,378

Помогите с кодом пожалуйста.

Отправлено: 21:39, 08-06-2021

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата greg zakharov:
Хм, а не проще ли тогда через проводник запросить длительность файла, нежели плодить обёртки? »
Да, проще...
Тут вот попался старый скрипт, без использования внешних модулей и прочих оберток:
script.ps1
Код: Выделить весь код
#requires -v 3.0
<#
.SYNOPSIS 
	Скрипт для получения строк детализированной информации из файлов.

.Description
	Получает дополнительные свойства из файлов, в зависимости от выбранных параметров.
	Для получения свойств одного файла, можно указать его с относительным или абсолютным
	путем. Для массового получения свойств - необходимо указать каталог с файлами. 
	Скрипт параметризированный. 

.Parameter Items
	Обязательный: Указываются файлы или каталоги (в случае каталога, будут выбраны
	файлы содержащиеся в нем по фильтру)

.Parameter Filter
	Необязательный: Фильтр для отбора файлов. Поддерживаются маски

.Parameter Propnum
	Необязательный: Единственный номер параметра или диапазон параметров, или набор
	параметров. См. примеры

.Parameter Recurse
	Переключатель: При наличии, будет осуществляться рекурсивная выборка файлов из
	каталогов. Для элементов-файлов, переключатель игнорируется. 

.Parameter Force
	Переключатель: При наличии, будут выбираться скрытые, системные и т.п. файлы.

.Parameter Outfiles
	Переключатель: Для осуществления вывода в отдельные файлы. Имя файла будет 
	составлено из имени и расширения обрабатываемого файла и нового расширения .txt
	Файлы складываются рядом со скриптом.

.Example
	.\script.ps1 -item 'd:\root1','d:\root2','d:\root3\file.mp4' -propnum 27 -recurse -force

	Это пример выборки файлов, указанных в перечислении -items, для дальнейшей обработки,
	Будет получено свойство с номером 27. Каталоги из перечисления будут обработаны рекурсивно
	для выборки всех файлов.
	
.Example
	.\script.ps1 -item 'd:\root1' -propnum (1..2048) -force

	Это пример выборки файлов из указанного каталога, для дальнейшей обработки.
	Будут получены свойства с номерами от 1 до 2048. Выбираются все файлы.
	
.Example
	.\script.ps1 -item 'd:\root1' -filter ('*.mpg','*.avi','*.mkv','*.mp4','*.3gp','*.vob') `
	-propnum 27 |ft

	Это пример выборки файлов из указанного каталога, для дальнейшей обработки.
	Будет получено свойство с номером 27. Выбираются только доступные файлы и только с
	указанными расширениями в фильтре.

.Notes
	Created By YuS

	Version: 1.00
	Date: 2/04/2018
	Purpose/Change:	Первая версия
	Version: 2.00
	Date: 17/09/2019
	Purpose/Change:	Изменена логика скрипта, добавлена возможность выборки набора свойств.
		Добавлена возможность вывода в консоль. Добавлен подсчет общей продолжительности 
		медиафайлов, если выбрано единственное свойство 27. Расширена возможность 
		группировки по параметрам.
		Поправлены старые баги, добавлены новые. :)

.Link
	ссылки удалены, ибо первично публиковался не здесь.
	
#>


[CmdletBinding()]
Param (
	[parameter(mandatory=$true)]
	[string[]]$items,
	[string[]]$filter = '*.*',
	[ValidateRange(0,2048)]
	[int[]]$propnum = 27, 
	[switch]$recurse,
	[switch]$force,
	[switch]$outfiles
)

function testpth($x){
	$pars = @{}
	$pars.path = [management.automation.wildcardpattern]::escape($x)
	if ($force){$pars.force = $true}
	if ($filter){$pars.include = $filter}
	if(test-path $x -pathtype container){
		$pars.path += '\*'
		if ($recurse){$pars.recurse = $true}
		dir @pars|?{!$_.psiscontainer}
	} elseif (test-path $x -pathtype leaf){
		gi @pars
	} else {
		write-host Path no correct
		sleep -s 5
		break
	}
}
function info($var,$k){
	process{
		$a = new-object -com 'shell.application'
		$b = $a.namespace($var.directoryname)
		[int]$i=0
		foreach($i in $propnum){
			$rslt = $b.getdetailsof($b.parsename($var.name),$i)
			if($rslt){
				[pscustomobject]@{
					IDFile = $k
					IDProp = $i
					Name = $var.name
					FullName = $var.fullname
					DirectoryName = $var.directoryname
					Type = $b.getdetailsof($null,$i)
					Context = $rslt
				}
			}
		}
	}
}

$arr = $items|%{testpth $_}|%{$n=1}{info $_ $n;$n++}

if ($outfiles){
	# Подготовка хэш-таблиц с последующей группировкой
	$p = $arr|group idfile -ashash -asstr
	# Вывод в отдельные файлы
	1..$p.count|%{
		if($p."$_".idprop.length -eq 1){
			$name = [string]$p."$_".name + '.txt'
		}else{
			$name = [string]$p."$_".name[0] + '.txt'
		}
		$p."$_"|ft idfile,idprop,fullname,type,context -auto|out-file -lit $name -app -enc utf8 
	}
} else {
	$arr
}

<#
# При необходимости вывода в консоль единственного свойства 27 (общая продолжительность медиафайлов),
# этот блок надо раскомментировать
if ($propnum.length -eq 1 -and $propnum -eq 27){
	try{
		$total = [timespan]::new(0,0,(([timespan[]]$arr.context).totalseconds|
		measure -sum).sum)
		write-host "Общая продолжительность: $total" -for cyan
	}catch{
		write-host 'Context' не является продолжительностью медиафайла: "`n" $_ -for red
	}
}
#>

Цитата 9119:
мне нужно 5-ти значное число и только в единственном экземпляре. »
Для такого варианта, использовать так:
Код: Выделить весь код
([timespan[]](.\script.ps1 -item 'file.mp3' -prop 27).context).totalmilliseconds
в -item можно указать набор файлов или даже каталог с файлами, а также можно использовать фильтры... в описании скрипта есть примеры.

-------
scio me nihil scire. Ѫ


Отправлено: 08:56, 26-06-2021 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


YuS_2, там точность до секунд, посему нет смысла переводить в миллисекунды.

Отправлено: 09:05, 26-06-2021 | #22


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Iska:
нет смысла переводить в миллисекунды. »
где-то тут прочитал, что требуются миллисекунды... но если достаточно секунд, то просто заменить .totalmilliseconds на .totalseconds

-------
scio me nihil scire. Ѫ


Отправлено: 09:46, 26-06-2021 | #23


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


YuS_2, у автора сначала фигурировали миллисекунды, потом он написал, что ему достаточно и секунд.

Я про то, что Shell.Application даёт точность до секунд. Насколько я понимаю.

Отправлено: 10:35, 26-06-2021 | #24


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Iska:
Я про то, что Shell.Application даёт точность до секунд. »
Собственно, да, но если есть желание, то можно и так:
Код: Выделить весь код
([timespan]'00:20:33').TotalDays

-------
scio me nihil scire. Ѫ


Отправлено: 12:39, 26-06-2021 | #25



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] получить длительность аудио (wav)-файла.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Посоветуйте программу для накладывания аудио .wav на видео .wmv dr.iw Видео и аудио: обработка и кодирование 2 05-03-2012 00:23
Разное - Утечка ресурсов из-за файла .wav Peutrov Microsoft Windows 7 12 24-12-2011 15:49
[решено] Как получить такие атрибуты видео-файла, как длительность, частота кадров и др? evg64 AutoIt 5 12-12-2009 15:43
Мультимедиа - [addon] LameDropXPd (программа для конвертации wav/mp3/wav) Fraerok Наборы обновлений для Windows XP/2003/Windows 7 7 27-08-2009 20:00
[решено] создание .wav файла с кодированием u-law 32Khz Maxik_BG Видео и аудио: обработка и кодирование 12 21-11-2006 12:31




 
Переход