Lua-скриптинг в mpv-плеере

от автора

Недавно у меня возникла необходимость непременно вырезать фрагмент из видео без перекодирования, и, разочаровавшись в очередной раз в LosslessCut, я отправился искать альтернативы.

На Reddit-е я наткнулся на пост, где утверждалось, что для этого можно использовать скрипт mpv-cut, который работает без внешнего графического интерфейса и дополнительных программ.

При ближайшем рассмотрении mpv-cut оказался скириптом на lua, который позволял вырезать кусок из видео прямо в процессе просмотра в плеере mpv. Я как-то не предполагал, что mpv-плеер при всей своей минималистичности поддерживает скрипты, которые позволяют расширять его функциональность. И решил это дело тщательно разъяснить.

Использование mpv-cut

Начнём с самого скрипта: как его установить и как им пользоваться.

У mpv есть конфигурационная папка. На Linux она находится здесь: ~/.config/mpv, а на Windows здесь: %AppData%\Roaming\mpv. Нужно создать в этой папке директорию scripts (если её там нет) и клонировать туда Git-репозиторий:

git clone -b release --single-branch "https://github.com/familyfriendlymikey/mpv-cut.git" ~/.config/mpv/scripts/mpv-cut

Также должен быть установлен ffmpeg и добавлен в переменную окружения PATH.

Если после этого начать просматривать файл в mpv-плеере, то скрипт автоматически запустится. Когда вы дойдёте до нужного фрагмента, чтобы начать копировать видео, нужно нажать «c» (на английской клавиатуре). Для завершения копирования нажмите «c» ещё раз. После этого видео сохраняется в ту же директорию, что и исходный файл, с примерно таким названием: COPY_1_video_FROM_00-00-07-457_TO_00-00-21-332.mkv.

Вы можете проиграть его и убедиться, что все потоки (stream-ы), которые присутствовали в исходном файле, также присутствуют в том же формате — мы просто отрезали кусок. Shift-I (I от Info) выводит информацию о дорожках на экран.

В этот момент вы можете посмотреть на файл «main.lua» в папке «mpv-cut», но, наверное, он слишком сложен для первого скрипта. Поэтому давайте сначала напишем простой скрипт для mpv на Lua, который выводит ‘Hello, world!’ в терминал.

Hello, world для mpv-плеера.

Откройте в вашем любимом текстовом редакторе файл hello.lua в папке scripts, и напишите туда следующий код:

function hello_world()     print("Hello, World!") end  mp.add_key_binding("h", "hello_world", hello_world)

Для работы скриптов в mpv, Lua локально устанавливать не нужно. Интерпретатор Lua встроен в сам плеер.

Графического меню у mpv нет, поэтому мы привязываем функции к событиям нажатия клавиш. В данном случае, если нажать клавишу «h», в терминале выведется сообщение «Hello, World!»

Вот здесь я положил небольшой видеофрагмент для тестирования из бесплатного и свободно распространяемого мультфильма Sintel от blender.org. Позже на его примере я покажу, как вывести в терминал список субтитров. А пока запустите воспроизведение любого этого или любого другого файла, понажимайте клавишу «h» и убедитесь, что сообщение «Hello, World!» действительно печатается в терминал.

Список субтитров

Теперь сделаем пример, чтобы показать, как доставать информацию из видео, которое проигрывается. Вместо «Hello, World!» выведем в терминал список субтитров.

function show_subtitles()     print("Список субтитров:")     print("ID Язык Формат")      local track_list = mp.get_property_native("track-list")      for _, track in ipairs(track_list) do         if track.type == "sub" then             print(track.id, track.lang, track.codec)         end     end end  mp.add_key_binding("h", "show-subtitles", show_subtitles)

Функция mp.get_property_native(«track-list») в mpv возвращает список всех дорожек в текущем видеофайле. Этот список включает видео, аудио и субтитры с их метаданными, такими как ID, язык, тип кодека и другие свойства.

В этот раз привяжем функцию «show_subtitles» к нажатию кнопку «h»

Наш скрипт выводит субтитры выводятся следующим образом:

[hello] Список субтитров:  [hello] ID Язык Формат  [hello] 1 ger subrip  [hello] 2 eng subrip  [hello] 3 spa subrip  [hello] 4 fre subrip  ...

В mpv-плеере есть собственный шорткат «j» (это соседняя с «h» клавиша), который переключает выбранную дорожку субтитров и выводит в терминал информацию о текущих субтитрах. Понажимав на «h» и «j» и сравнив результаты, вы можете убедиться, что наш скрипт работает правильно.

Где искать информацию

Я, собственно, хотел показать, что в mpv есть поддержка скриптов на Lua и привести пару примеров. Поэтому я просто расскажу, где можно найти дополнительные материалы и документацию.

Про Lua-скриптинг в mpv можно почитать в официальной документации.

Примеры Lua-скриптов, которые устанавливаются с пакетом mpv, на линуксе находятся здесь: /usr/share/doc/mpv/examples/lua/ Эти же скрипты доступны в Git-репозитории mpv.

Большая коллекция пользовательских скриптов доступна по адресу: https://github.com/mpv-player/mpv/wiki/User-Scripts

О конфигурируемости mpv

Вся эта настраиваемость и конфигурируемость в mpv видео-плеере mpv просто поражает и открывает множество возможностей для пользователей.

При изучении языков удобно одновременно выводить субтитры на двух языках (честно говоря, mpv поддерживает это и без скриптов). Со скриптами можно делать гораздо больше: например, создавать Anki-карточки прямо из видео, выполнять лёгкое редактирование, например, кроппинг видео, и многое другое. И мой первый пример — возможность прямо во время воспроизведения видео (или музыки) вырезать и сохранить фрагмент — на мой взгляд, тоже весьма показателен.

Посмотрите ещё раз на коллекцию пользовательских скриптов — возможно, там уже есть решение для того, что вам нужно, или подсказка, как это можно сделать.


ссылка на оригинал статьи https://habr.com/ru/articles/878772/