Ещё способ генерации спектрограмм через foo_run

Список разделов foobar2000 Секреты foobar2000

Описание: Кнопочки, конфиги, секреты, советы.

Сообщение #1 Azaza » 31.10.2022, 00:13

Используются ffmpeg и SoX. Поддерживает юникод. Поддерживает генерацию спектрограмм для отдельных треков из image+cue, в т.ч. image со встроенным cue. Не создаёт временных wav файлов. Работает для всех файлов, которые может декодировать ffmpeg. Не работает для файлов в архивах. Для файлов, продолжительность которых в фубаре не определяется, показывает только первые 30 секунд. На картинке пишет имя аудиофайла, для которого сгенерирована спектрограма (для одиночных файлов) или же "имя файла-образа-номер трека. название трека" (для трека из image+cue).
Благодаря тому, что здесь для разрезания по cue используется ffmpeg, а не престарелый shntool, а также ffmpeg используется для создания конечного файла вместо SoX, поддерживаются пути с юникодовскими символами.
К слову, способ с конвертером, описанный в https://foobar2000.ru/forum/viewtopic.php?t=6909 не работает в фубаре v2, т.к. в фубаре v2 по неизвестным пока причинам вообще не работают батники в конвертере.

Содержимое Path для Run services
Код: Выделить всё
$puts(font,ArialUnicodeMS)$puts(Bat-Path-1,"C:\Create and open spectrogram cue.bat")$puts(Bat-Path-2,"C:\Create and open spectrogram.bat")$if($stricmp($ext(%path%),cue),$get(Bat-Path-1) $add($mul($ifequal($strchr(%__referenced_offset%,:),3,$cut(%__referenced_offset%,2),$cut(%__referenced_offset%,3)),60),$cut($right(%__referenced_offset%,5),2)).$pad_right($muldiv($muldiv($right(%__referenced_offset%,2),%samplerate%,75),1000000,%samplerate%),6,0) %length_ex% %length_samples% "$directory_path(%path%)\%__referenced_file%" "drawtext=''text=$replace(%__referenced_file%-%tracknumber%. %title%,'',’):font=$get(font):fontcolor=white:fontsize=$ifgreater($len(%__referenced_file%-%tracknumber%. %title%),170,16,20):x=5:y=10''" "$directory_path(%path%)\$ifgreater($len($directory_path(%path%)\%__referenced_file%-%tracknumber%. %title%),255,$cut(%__referenced_file%-%tracknumber%. %title%,$sub(255,$sub($len($directory_path(%path%)\%__referenced_file%-%tracknumber%. %title%),$len(%__referenced_file%-%tracknumber%. %title%)))),%__referenced_file%-%tracknumber%. %title%).png",$if($stricmp(%__cue_embedded%,yes),$get(Bat-Path-1) $add($mul($ifequal($strchr(%__referenced_offset%,:),3,$cut(%__referenced_offset%,2),$cut(%__referenced_offset%,3)),60),$cut($right(%__referenced_offset%,5),2)).$pad_right($muldiv($muldiv($right(%__referenced_offset%,2),%samplerate%,75),1000000,%samplerate%),6,0) %length_ex% %length_samples% "%path%" "drawtext=''text=$replace(%filename_ext%-%tracknumber%. %title%,'',’):font=$get(font):fontcolor=white:fontsize=$ifgreater($len(%filename_ext%-%tracknumber%. %title%),170,16,20):x=5:y=10''" "$directory_path(%path%)\$ifgreater($len($directory_path(%path%)\%filename_ext%-%tracknumber%. %title%),255,$cut(%filename_ext%-%tracknumber%. %title%,$sub(255,$sub($len($directory_path(%path%)\%filename_ext%-%tracknumber%. %title%),$len(%filename_ext%-%tracknumber%. %title%)))),%filename_ext%-%tracknumber%. %title%).png",$get(Bat-Path-2) "%path%" $if(%length_samples%,%length_samples%s,30) "$directory_path(%path%)\%filename%.png" "drawtext=''text=$replace(%filename_ext%,'',$char(8217)):font=$get(font):fontcolor=white:fontsize=$ifgreater($len(%filename_ext%),170,16,20):x=5:y=10''"))

Как видите, используются два разных батника. В примере батники находятся прямо на диске C:\. В путях к батникам нежелательно использовать скобки.
Содержимое самих батников:
Create and open spectrogram cue.bat
Код: Выделить всё
cmd.exe /d /c "D:\0__CODECS\FFmpeg\ffmpeg.exe" -v 0 -drc_scale 0 -ss %1 -i %4 -t %2 -map_metadata -1 -f sox -|"C:\Program Files\SoX\sox.exe" -p -n spectrogram -d %3s -x 1600 -Y 1200 -t " " -o -|"D:\0__CODECS\FFmpeg\ffmpeg.exe" -v 16 -y -i - -vf %5 %6
mspaint.exe %6
del %6

Create and open spectrogram.bat
Код: Выделить всё
cmd.exe /d /c "D:\0__CODECS\FFmpeg\ffmpeg.exe" -v 0 -drc_scale 0 -i %1 -map_metadata -1 -f sox -|"C:\Program Files\SoX\sox.exe" -p -n spectrogram -d %2 -x 1600 -Y 1200 -t " " -o -|"D:\0__CODECS\FFmpeg\ffmpeg.exe" -v 16 -y -i - -vf %4 %3
mspaint.exe %3
del %3

Пути к ffmpeg.exe и sox.exe замените на свои. Не забывайте про кавычки, если в путях есть пробелы, например
Код: Выделить всё
"C:\Program Files\sox\sox.exe"

Параметр
Код: Выделить всё
-f sox
не имеет отношения к путям и его НЕ нужно менять.
Файл со спектрограммой генерируется в папке с исходным файлом и автоматически открывается в Paint. Для одиночных файлов име спектрограммы - имя аудиофайла с расширением png, для трека из image+cue - "имя файла-образа-номер трека. название трека". После закрытия Paint файл со спектрограммой автоматически удаляется. Программу для просмотра можно заменить на свою, прописав нужный путь вместо mspaint.exe. Автоматическое удаление можно отключить, удалив строку
Код: Выделить всё
del %3
Если из батника убрать строки
Код: Выделить всё
mspaint.exe %3
del %3
и выставить Simultaneous runs настройках Run services для сервиса в Unlimited, то удобно использовать для массовой генерации спектрограмм.

phpBB [media]


32-битную сборку ffmpeg можно скачать здесь - https://github.com/sudo-nautilus/FFmpeg-Builds-Win32/releases
64-битную сборку ffmpeg можно скачать здесь - https://www.gyan.dev/ffmpeg/builds/ или здесь - https://github.com/BtbN/FFmpeg-Builds/releases
SoX - https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download

Шрифт задаётся в одном месте в самом начале команды - $puts(font,ArialUnicodeMS), где ArialUnicodeMS и есть имя шрифта.

Если указанный в команде ffmpeg шрифт отсутствует в системе, ffmpeg автоматически переключится на другой. Но, если в используемом шрифте отсутствуют какие-то символы, ffmpeg не может взять их из других шрифтов (или я не знаю, как настроить,чтобы он это делал) и заменит их на квадратики. Чтобы это случалось как можно реже, стоит использовать такой шрифт, в котором есть большинство символов, например ArialUnicodeMS. Шрифт ArialUnicodeMS - https://www.dropbox.com/s/578p7fpqvaq20g6/ARIALUNI.TTF?dl=1 Шрифт нужно установить в систему, чтобы ffmpeg мог его найти.
Последний раз редактировалось Azaza 02.06.2023, 21:16, всего редактировалось 17 раз(а).
Azaza M
Автор темы
Аватара
Репутация: 392
С нами: 7 лет 6 месяцев

Сообщение #2 Azaza » 02.11.2022, 00:57

Поправил, чтобы работало и для встроенных cue и зменил шрифт, указываемый в команде ffmpeg, на ArialUnicodeMS.
Azaza M
Автор темы
Аватара
Репутация: 392
С нами: 7 лет 6 месяцев

Сообщение #3 imfam » 12.11.2022, 12:33

Azaza, что-то не получается, нужна помощь.

Работа Create and open spectrogram.bat
Create and open spectrogram.png


Create and open spectrogram cue.bat не оставляет на дисплее окна cmd, и результата нет.

path
Код: Выделить всё
$if($stricmp($ext(%path%),cue),"C:\TMP\Create and open spectrogram cue.bat" $add($mul($ifequal($strchr(%__referenced_offset%,:),3,$cut(%__referenced_offset%,2),$cut(%__referenced_offset%,3)),60),$cut($right(%__referenced_offset%,5),2)).$pad_right($muldiv($muldiv($right(%__referenced_offset%,2),%samplerate%,75),1000000,%samplerate%),6,0) %length_ex% %length_samples% "$directory_path(%path%)\%__referenced_file%" "drawtext=''text=$replace(%__referenced_file%-%tracknumber%. %title%,'',’):font=ArialUnicodeMS:fontcolor=white:fontsize=$ifgreater($len(%__referenced_file%-%tracknumber%. %title%),170,16,20):x=5:y=10''" "$directory_path(%path%)\$ifgreater($len($directory_path(%path%)\%__referenced_file%-%tracknumber%. %title%),255,$cut(%__referenced_file%-%tracknumber%. %title%,$sub(255,$sub($len($directory_path(%path%)\%__referenced_file%-%tracknumber%. %title%),$len(%__referenced_file%-%tracknumber%. %title%)))),%__referenced_file%-%tracknumber%. %title%).png",$if($stricmp(%__cue_embedded%,yes),"C:\TMP\Create and open spectrogram cue.bat" $add($mul($ifequal($strchr(%__referenced_offset%,:),3,$cut(%__referenced_offset%,2),$cut(%__referenced_offset%,3)),60),$cut($right(%__referenced_offset%,5),2)).$pad_right($muldiv($muldiv($right(%__referenced_offset%,2),%samplerate%,75),1000000,%samplerate%),6,0) %length_ex% %length_samples% "%path%" "drawtext=''text=$replace(%filename_ext%-%tracknumber%. %title%,'',’):font=ArialUnicodeMS:fontcolor=white:fontsize=$ifgreater($len(%filename_ext%-%tracknumber%. %title%),170,16,20):x=5:y=10''" "$directory_path(%path%)\$ifgreater($len($directory_path(%path%)\%filename_ext%-%tracknumber%. %title%),255,$cut(%filename_ext%-%tracknumber%. %title%,$sub(255,$sub($len($directory_path(%path%)\%filename_ext%-%tracknumber%. %title%),$len(%filename_ext%-%tracknumber%. %title%)))),%filename_ext%-%tracknumber%. %title%).png","C:\TMP\Create and open spectrogram.bat" "%path%" $if(%length_samples%,%length_samples%s,30) "$directory_path(%path%)\%filename%.png" "drawtext=''text=$replace(%filename_ext%,'',$char(8217)):font=ArialUnicodeMS:fontcolor=white:fontsize=$ifgreater($len(%filename_ext%),170,16,20):x=5:y=10''"))

Create and open spectrogram.bat
Код: Выделить всё
C:\WINDOWS\system32\cmd.exe /d /c "c:\TMP\ffmpeg\bin\ffmpeg" -v 0 -drc_scale 0 -i %1 -map_metadata -1 -f "c:\TMP\SOX\sox" -|"c:\TMP\SOX\sox" -p -n spectrogram -d %2 -x 1600 -Y 1200 -t " " -o -|"c:\TMP\ffmpeg\bin\ffmpeg" -v 16 -y -i - -vf %4 %3
d:\Utilities\XnViewMP\xnviewmp.exe %3
del %3

Create and open spectrogram cue.bat
Код: Выделить всё
C:\WINDOWS\system32\cmd.exe /d /c "c:\TMP\ffmpeg\bin\ffmpeg" -v 0 -drc_scale 0 -ss %1 -i %4 -t %2 -map_metadata -1 -f "c:\TMP\SOX\sox" -|"c:\TMP\SOX\sox" -p -n spectrogram -d %3s -x 1600 -Y 1200 -t " " -o -|"c:\TMP\ffmpeg\bin\ffmpeg" -v 16 -y -i - -vf %5 %6

"d:\Utilities\XnViewMP\xnviewmp.exe %6
del %6
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #4 Azaza » 12.11.2022, 16:01

imfam, у Вас в батниках
-f "c:\TMP\SOX\sox"
. Эту часть НЕ нужно менять. Здесь всегда должно быть
Код: Выделить всё
-f sox
. Этот параметр задаёт выходной формат для ffmpeg и никак не связан с путями.
Добавил эту информацию в первое сообщение.
Azaza M
Автор темы
Аватара
Репутация: 392
С нами: 7 лет 6 месяцев

Сообщение #5 imfam » 12.11.2022, 16:25

Azaza:-f sox
Так я тоже пробовал: результат тот же.
2022-11-12_132109.png
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #6 Azaza » 12.11.2022, 16:45

Кстати, у Вас в Create and open spectrogram cue.bat не закрыты кавычки после xnviewmp.exe, но сейчас проблема не в этом, конечно.
Sox скачан по ссылке https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download или из другого места? Если отсюда, то все файлы что там есть в архиве, должны быть в папке вместе с sox.exe, ну, кроме pdf и txt, которые можно удалить.
Azaza M
Автор темы
Аватара
Репутация: 392
С нами: 7 лет 6 месяцев

Сообщение #7 imfam » 12.11.2022, 16:56

Скачал sox по вашей ссылке и заменил им свой. Результат тот же, увы.
Кавычки закрыл, стало появляться окошко cmd и для Create and open spectrogram cue.bat
2022-11-12_140335.png
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #8 Azaza » 12.11.2022, 17:09

Если просто зайти в папку и запустить ffmpeg.exe двойным кликом, никаких сообщений об ошибке не появляется?
Если никаких сообщений об ошибке, то следующим этапом диагностики:
Удалите
Код: Выделить всё
-v 0
из батника и покажите, что тогда пишется в консоли.
Azaza M
Автор темы
Аватара
Репутация: 392
С нами: 7 лет 6 месяцев

Сообщение #9 imfam » 12.11.2022, 17:21

Не помогло
2022-11-12_141910.png
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #10 Azaza » 12.11.2022, 17:55

imfam, попробуйте в точности воспроизвести действия из видео, в конце демонстрация, что всё работает - https://youtu.be/HNQyiqJ5qew
Azaza M
Автор темы
Аватара
Репутация: 392
С нами: 7 лет 6 месяцев

Сообщение #11 imfam » 12.11.2022, 21:28

Спасибо, теперь всё отлично работает, как на видео. Полагаю, было бы полезно, чтобы не было путаницы с путями, добавить .exe в нужныъ местах в образцовых скриптах.
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #12 Azaza » 12.11.2022, 21:38

imfam:Полагаю, было бы полезно, чтобы не было путаницы с путями, добавить .exe в нужныъ местах в образцовых скриптах.
Сделал.
Azaza M
Автор темы
Аватара
Репутация: 392
С нами: 7 лет 6 месяцев


Вернуться в Секреты foobar2000