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

Компьютерный форум 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

 

Старожил


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

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


Изображения
Тип файла: png 1.png
(3.3 Kb, 3 просмотров)

DJ Mogarych, хороший вариант. Спасибо.

помогите с кодировкой пож...

Код: Выделить весь код
$path = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\tmp\1\Book0001.wav"
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $path
$file = Split-Path $path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)
$seconds = [TimeSpan]::Parse("$($shellfolder.GetDetailsOf($shellfile, 27);)").totalseconds
_________________________________________________________

$frames = $seconds * 30
$music_path = "E:\\!!Youtube\\АРХИВ\\!временное\\Ролики\\!в работе\\tmp\\1\\Book0001.wav"
$video_path = "E:\\!!Youtube\\АРХИВ\\!временное\\Ролики\\!в работе\\tmp\\1\\ProShow Slideshow 1.mp4"


Get-Content C:\project\kc\temp_1.tscproj | ForEach-Object {$_ -replace "music_path", $music_path} | Set-Content C:\project\kc\temp_2.tscproj
Get-Content C:\project\kc\temp_2.tscproj | ForEach-Object {$_ -replace "video_path", $video_path} | Set-Content C:\project\kc\temp_final.tscproj

при выполнении -replace, в конечном файле вместо (русских) значений из переменных - кракозябры!
(скрин кое как прикрепил)

Кодировка начального файла - utf-8. (без BOM). Так должно и остаться.

Помогите с кодом пож

Последний раз редактировалось 9119, 09-06-2021 в 13:22.


Отправлено: 12:35, 09-06-2021 | #11



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

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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Код: Выделить весь код
Get-Content C:\project\kc\temp_1.tscproj -Encoding UTF8 | ForEach-Object {$_ -replace "music_path", $music_path} | Set-Content C:\project\kc\temp_2.tscproj -Encoding utf8

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

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


Старожил


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

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


огромное спасибо, значение вставляется корректно.

но на выходе получаем utf-8 С BOM (если верить notepad++).
А софту, который использует этот файл - нужен обычный UTF-8, и с utf-8 С BOM он не работает (пишет мол файл поврежден)
Стоит в notepad++ выставить обычный UTF-8, сохранить и все ок, все работает.


Могу сразу после замены получить обычный UTF-8 (БЕЗ BOM)?



Код: Выделить весь код
-Encoding ASCII
дает желаемую кодировку, но все русские буквы внутри файла становятся "???"

Последний раз редактировалось 9119, 09-06-2021 в 14:51.


Отправлено: 14:24, 09-06-2021 | #13


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Потому что -Encoding ASCII - это 7-битная кодировка.

Судя по всему, проще всего поставить Powershell Core (https://github.com/PowerShell/powers...eleases/latest), там UTF8 without BOM - это кодировка по умолчанию.

https://stackoverflow.com/a/34969243

Либо воспользоваться решением оттуда же.
Есть вариант выключить BOM на уровне системы (в Windows 10), но лично я не стал бы так делать.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 09-06-2021 в 15:19.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:12, 09-06-2021 | #14


Старожил


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

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


DJ Mogarych, поставил core. Спасибо

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


Забанен


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

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


DJ Mogarych, уже дал ответ как решается задача, через системный шелл. Давайте до кучи рассмотрим как вычислить продолжительность математически (Iska вроде бы сетовал, что ему не шибко хочется заморачиваться с расчётами). Для примера возьмём RIFF Wave (это те самые WAV, что можно отыскать в %systemroot%\Media). Формат такого WAV беспрецедентно прост: первые 12 байт - т.н. RIFF описатель, следующий 24 байта - описатели формата, далее два блока по четыре байта - пролог данных, а там и сами данные.

Как видим всё просто, бутылка, дабы разобраться, нам не потребуется.
Обобщённый алгоритм вычисления длительности в миллисекундах:
Код: Выделить весь код
using namespace System.IO

$br = [BinaryReader]::new(($fs = [File]::OpenRead(<# наш wav файл #>))
$fs.Position = 0x1C
$byterate = $br.ReadUInt32() # см. в таблицу касательно последовательности байт
$ms = (($fs.Length - 0x2C) * 1000) / $byterate # искомое значение
$br.Dispose()
Перевести в секунды, минуты, часы (нужное подчеркнуть) полученное значение, полагаю, уже не составит труда.

Последний раз редактировалось greg zakharov, 09-06-2021 в 17:18.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:02, 09-06-2021 | #16


Старожил


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

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


@DJ Mogarych а не проще разве отрезать бом ?


Код: Выделить весь код
. .\strip_bom.ps1 test1.txt
Код: Выделить весь код
 Directory: C:\Users\Serguei


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        6/10/2021  12:01 AM             10 test1.txt.new
-a----        6/10/2021  12:00 AM             13 test1.txt

Код: Выделить весь код
od -x test1.txt ; od -x test1.txt.new
0000000 bbef d1bf d082 d0b5 d1ba d181 0082
0000015
0000000 82d1 b5d0 bad0 81d1 82d1
0000012
UTF-8
The UTF-8 representation of the BOM is the (hexadecimal) byte sequence 0xEF,0xBB,0xBF.

сам скрипт:

Код: Выделить весь код
param(
  [String]$source,
  [String]$dest = "${source}.new"
)
# https://stackoverflow.com/questions/288111/remove-byte-order-mark-from-a-file-readallbytes-byte

$text = [System.IO.File]::ReadAllText($source)
$writer = new-object System.IO.StreamWriter($dest, $false, (new-object System.Text.UTF8Encoding($false)))
$writer.Write($text)
$writer.Close()
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:15, 10-06-2021 | #17


Ветеран


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

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


Цитата Serguei Kouzmine:
@DJ Mogarych а не проще разве отрезать бом ? »
Не проще. Проще не писать BOM.
Код: Выделить весь код
[System.IO.File]::WriteAllLines('C:\Мои проекты\0309\Sample.txt', 'Мама мыла раму', [System.Text.UTF8Encoding]::new($false))
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:54, 10-06-2021 | #18


Старожил


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

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


не писать BOM можно в своих логах а в чужих его придется отрезать

Отправлено: 04:36, 11-06-2021 | #19


Ветеран


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

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


Serguei Kouzmine, в каком сообщении темы Вы видите «чужой лог»?

Отправлено: 19:23, 11-06-2021 | #20



Компьютерный форум 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




 
Переход