Утверждалось, что Audacity не умеет делать звуковые файлы с главами (chapters). Оказалось, это возможно, хотя и с бубнами. Более того, этот подход можно использовать для своих целей.
Делаю авторское переизложение англоязычной заметки. А также, привожу свое решение на том же подходе.
Счастье состоит из 3-х фаз:
- Установки на Audacity plug-in (однократно)
- Выгрузки с помощью plug-in текстового файла с разметкой глав
- Скрещивания исходного звукового файла с файлом разметки в командной строке ffmpeg
Я не стал реализовывать этот алгоритм полностью, но, из уважения к первоисточнику, в конце текста командная строка с ffmpeg честно описана. Зато идея с plug-in получила авторское развитие. ffmpeg я поленился устанавливать, а по умолчанию он на Мак не устанавливается.
Хронологически, сначала я поставил описанный в статье plug-in и с его помощью выгрузил метаданные – полет нормальный. Потом переделал plug-in для вывода метаданных в формате, который может импортировать mChapters — я его использую для разметки глав звукового файла. Исходный формат выгрузки из Audacity можно переделать вручную под mChapters, но удобнее свой plug-in.
Здесь описание не только исходного варианта, но и моего для импорта в mChapters — он приведен ниже.
Установка plug-in
Plug-in представляет собой текстовый файл с расширением «.ny». Содержимое приведено в конце этого текста. Его достаточно сохранить в простом текстовом редакторе, например BBEdit, а потом подсунуть Audacity.
Описание процедуры установки plug-in:
- Открыть Audacity
- Выбрать в меню "Tools" -> "Nyquist Plug-in Installer..."
- В окне выбора файла указать на тот, который сделали «.ny»
- В меню "Tools" -> "Add / Remove Plug-ins..." найти его в списке plug-in и сделать «enable»
В результате в меню Tools появится пункт «Labels to Chapters» (мой называется «Labels for mChapters»).
Использование plug-in
Если теперь средствами Audacity разметить звуковой файл метками (Labels), то при запуске этого plug-in появится окно с полями метаданных и возможностью сохранить файл с ними. Дальше предполагается, что итоговый файл с метаданными назвали «metadata.txt».
Стоит обратить внимание на то, что этот plug-in русские буквы в названии глав (в файле метаданных) заменяет знаком подчеркивания.
Командная строка для ffmpeg
Остается его скрестить со звуковым файлом. На Маке это делается в командной строке приложения Terminal:
ffmpeg -i audio.mp3 -i metadata.txt -map_metadata 1 -codec copy -id3v2_version 3 -write_id3v1 1 audio-with-chapters.mp3
Только надо не забыть правильно указать имена файлов и пути к ним:
- исходного звукового «audio.mp3»,
- итогового «audio-with-chapters.mp3»
- с метаданными «metadata.txt»
Plug-in для ffmpeg
;nyquist plug-in ;version 4 ;type tool ;codetype lisp ;name "Labels to Chapters" ;author "Steve Daulton" ;release 2.3.2 ;copyright "Released under terms of the GNU General Public License version 2" ;control timebase "Time base" int "" 1000 100 2000 ;control title "Title" string "" "" ;control encodedby "Encoded by" string "" "" ;control artist "Artist" string "" "" ;control date "Date" string "" "2020" ;control filename "Save file as" file "" "*default*/metadata.txt" "Text file|*.txt;*.TXT|All files|*.*;*" "save,overwrite" (setf metadata (format nil ";FFMETADATA1~%~ title=~a~%~ encoded_by=~a~%~ artist=~a~%~ date=~a~%~ encoder=Lavf58.27.103~%" title encodedby artist date)) ;; Get label data from first label track (setf labels (second (first (aud-get-info "Labels")))) (dolist (label labels) (setf chapter (format nil "[CHAPTER]~%~ TIMEBASE=1/~a~%~ START=~a~%~ END=~a~%~ title=~a~%" timebase (round (* timebase (first label))) (round (* timebase (second label))) (third label))) (string-append metadata chapter)) (setf fp (open filename :direction :output)) (format fp metadata) (close fp) (format nil "File written to~%~a" filename)
Plug-in для mChapters
;nyquist plug-in ;version 4 ;type tool ;codetype lisp ;name "Labels for mChapters" ;author "Michael Kushnir from Steve Daulton" ;release 2.3.2 ;copyright "Released under terms of the GNU General Public License version 2" ;control filename "Save file as" file "" "*default*/metadata.txt" "Text file|*.txt;*.TXT|All files|*.*;*" "save,overwrite" (defun timeing (sss) (setf mss (truncate sss)) (setf ms (truncate (* (- sss mss) 1000))) (setf ss (rem mss 60)) (setf hmm (truncate (/ mss 60))) (setf mm (rem hmm 60)) (setf hh (truncate (/ hmm 60))) (format nil "~a:~a:~a.~a" hh mm ss ms) ) (setf metadata (format nil "~ <@TimeScale:44100>~%~ <@Start>~%" ) ) ;; Get label data from first label track (setf labels (second (first (aud-get-info "Labels")))) (dolist (label labels) (setf chapter (format nil "[~a] ~a~%" (timeing (first label)) (third label) ) ) (string-append metadata chapter) ) ;; Finish label track (string-append metadata (format nil"<@End>~%")) (setf fp (open filename :direction :output)) (format fp metadata) (close fp) (format nil "File written to~%~a" filename)
Plug-in в разметке QuickTime
;nyquist plug-in ;version 4 ;type tool ;codetype lisp ;name "Labels for QuickTime" ;author "Michael Kushnir from Steve Daulton" ;release 2.3.2 ;copyright "Released under terms of the GNU General Public License version 2" ;control filename "Save file as" file "" "*default*/metadata.txt" "Text file|*.txt;*.TXT|All files|*.*;*" "save,overwrite" (defun timeing (sss) (setf mss (truncate sss)) (setf ms (truncate (* (- sss mss) 100000))) (setf ss (rem mss 60)) (setf hmm (truncate (/ mss 60))) (setf mm (rem hmm 60)) (setf hh (truncate (/ hmm 60))) (format nil "~a:~a:~a.~a" hh mm ss ms) ) (setf metadata (format nil "{QTtext}{timeScale:44100}~%") ) ;; Get label data from first label track (setf labels (second (first (aud-get-info "Labels")))) (dolist (label labels) (setf chapter (format nil "[~a]~%~a~%" (timeing (first label)) (third label) ) ) (string-append metadata chapter) ) (setf fp (open filename :direction :output)) (format fp metadata) (close fp) (format nil "File written to~%~a" filename)
Комментариев нет:
Отправить комментарий