![]() |
получить длительность аудио (wav)-файла.
Добрый.
Есть необходимость вывести длительность wav-файла в консоль. Нашел для себя способ такой: Код:
Get-MediaInfoSummary "C:\project\Book0001.wav" | Select-String -Pattern 'Duration' Код:
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' Т.е. было Код:
Duration : 58 s 378 ms первый вариант: Код:
58378 Код:
58,378 Помогите с кодом пожалуйста. |
Код:
$oMatchInfo = Get-MediaInfoSummary "C:\project\Book0001.wav" | Select-String -Pattern '^Duration : (\d+) s (\d+) ms$' |
Цитата:
Код:
mediainfo --Output="Audio;%Duration/String3%" file.wav # HH:MM:ss.mmm |
Цитата:
|
Хм, а не проще ли тогда через проводник запросить длительность файла, нежели плодить обёртки?
|
greg zakharov, если я правильно понял — его миллисекунды интересуют.
|
Iska, ежели так, можно и вовсе отказаться от каких-либо библиотек и, приложив к мозгу немного знаний математики, вычислить продолжительность аудио самостоятельно. В противном случае, что-то было в WPF относительно базовых данных по аудио файлам. К слову, можно использовать DirectX.
|
greg zakharov, возможно. Лень искать, когда не интересно и самому не надо.
|
Цитата:
просто не нашел другого способа. как это сделать через проводник? в идеале нужно чтобы результат выводился только в секундах. т.е, например аудио - 2м43сек... на выходе должно быть - 163 |
Код:
$path = 'C:\project\Book0001.wav' https://stackoverflow.com/questions/...s-fff/21894303 |
Вложений: 1
DJ Mogarych, хороший вариант. Спасибо.
помогите с кодировкой пож... Код:
$path = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\tmp\1\Book0001.wav" при выполнении -replace, в конечном файле вместо (русских) значений из переменных - кракозябры! (скрин кое как прикрепил) Кодировка начального файла - utf-8. (без BOM). Так должно и остаться. Помогите с кодом пож |
Код:
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 |
огромное спасибо, значение вставляется корректно.
но на выходе получаем utf-8 С BOM (если верить notepad++). А софту, который использует этот файл - нужен обычный UTF-8, и с utf-8 С BOM он не работает (пишет мол файл поврежден) Стоит в notepad++ выставить обычный UTF-8, сохранить и все ок, все работает. Могу сразу после замены получить обычный UTF-8 (БЕЗ BOM)? Код:
-Encoding ASCII |
Потому что -Encoding ASCII - это 7-битная кодировка.
Судя по всему, проще всего поставить Powershell Core (https://github.com/PowerShell/powers...eleases/latest), там UTF8 without BOM - это кодировка по умолчанию. https://stackoverflow.com/a/34969243 Либо воспользоваться решением оттуда же. Есть вариант выключить BOM на уровне системы (в Windows 10), но лично я не стал бы так делать. |
DJ Mogarych, поставил core. Спасибо
|
DJ Mogarych, уже дал ответ как решается задача, через системный шелл. Давайте до кучи рассмотрим как вычислить продолжительность математически (Iska вроде бы сетовал, что ему не шибко хочется заморачиваться с расчётами). Для примера возьмём RIFF Wave (это те самые WAV, что можно отыскать в %systemroot%\Media). Формат такого WAV беспрецедентно прост: первые 12 байт - т.н. RIFF описатель, следующий 24 байта - описатели формата, далее два блока по четыре байта - пролог данных, а там и сами данные.
![]() Как видим всё просто, бутылка, дабы разобраться, нам не потребуется. Обобщённый алгоритм вычисления длительности в миллисекундах: Код:
using namespace System.IO |
@DJ Mogarych а не проще разве отрезать бом ?
Код:
. .\strip_bom.ps1 test1.txt Код:
Directory: C:\Users\Serguei Код:
od -x test1.txt ; od -x test1.txt.new The UTF-8 representation of the BOM is the (hexadecimal) byte sequence 0xEF,0xBB,0xBF. сам скрипт: Код:
param( |
Цитата:
Код:
[System.IO.File]::WriteAllLines('C:\Мои проекты\0309\Sample.txt', 'Мама мыла раму', [System.Text.UTF8Encoding]::new($false)) |
не писать BOM можно в своих логах а в чужих его придется отрезать
|
Serguei Kouzmine, в каком сообщении темы Вы видите «чужой лог»?
|
Цитата:
Тут вот попался старый скрипт, без использования внешних модулей и прочих оберток: script.ps1
Код:
#requires -v 3.0 Цитата:
Код:
([timespan[]](.\script.ps1 -item 'file.mp3' -prop 27).context).totalmilliseconds |
YuS_2, там точность до секунд, посему нет смысла переводить в миллисекунды.
|
Цитата:
|
YuS_2, у автора сначала фигурировали миллисекунды, потом он написал, что ему достаточно и секунд.
Я про то, что Shell.Application даёт точность до секунд. Насколько я понимаю. |
Цитата:
Код:
([timespan]'00:20:33').TotalDays |
Время: 12:40. |
Время: 12:40.
© OSzone.net 2001-