- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

Также должен быть установлен ffmpeg [3] и добавлен в переменную окружения 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!"

Вот здесь я положил небольшой видеофрагмент [4] для тестирования из бесплатного и свободно распространяемого мультфильма 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 можно почитать в официальной документации [5].

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

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

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

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

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

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

Автор: sledov

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/scripting/409494

Ссылки в тексте:

[1] пост: https://www.reddit.com/r/linux/comments/18xyzx9/comment/kgakryd/

[2] mpv-cut: https://github.com/familyfriendlymikey/mpv-cut

[3] ffmpeg: https://www.ffmpeg.org

[4] небольшой видеофрагмент: https://drive.google.com/file/d/1W25TUpyKt9xMsR9AmxOU692TswsoRL33/view?usp=sharing

[5] официальной документации: https://mpv.io/manual/master/#lua-scripting

[6] Git-репозитории mpv: https://github.com/mpv-player/mpv/tree/master/TOOLS/lua

[7] https://github.com/mpv-player/mpv/wiki/User-Scripts: https://github.com/mpv-player/mpv/wiki/User-Scripts

[8] Источник: https://habr.com/ru/articles/878772/?utm_source=habrahabr&utm_medium=rss&utm_campaign=878772