Недавно у меня возникла необходимость непременно вырезать фрагмент из видео без перекодирования, и, разочаровавшись в очередной раз в 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-карточки прямо из видео, выполнять лёгкое редактирование, например, кроппинг видео, и многое другое. И мой первый пример — возможность прямо во время воспроизведения видео (или музыки) вырезать и сохранить фрагмент - на мой взгляд, тоже весьма показателен.

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

Комментарии (8)


  1. MonkeyWatchingYou
    02.02.2025 13:21

    Простите, вопрос немного не по теме. Вы упомянули MPV Плеер, посмотрел сайт и возник вопрос о модели финансирования подобного. Разработка, хостинг и поддержка требуют денег. Про опенсорс вроде пусто. Скачивать это безопасно и можно снять шапку из фольги или ... 50/50?


    1. evgeniy_kudinov
      02.02.2025 13:21

      Если для вашей ОС нет готового пакета, устанавливаемого из официального репозитория, то можно собрать из исходников. Код проекта и как собрать в https://github.com/mpv-player/mpv


  1. nikolz
    02.02.2025 13:21

    mpv Player – бесплатный медиапроигрыватель


  1. zelenin
    02.02.2025 13:21

    можно использовать скрипт mpv-cut

    в итоге все свелось к ffmpeg -c copy, что логично


    1. sledov Автор
      02.02.2025 13:21

      Оно и начиналось с команды "ffmpeg -c copy". Просто до этого я сначала открывал видео в mpv, записывал время начала и время конца, чтобы затем использовать эти данные в команде для ffmpeg. А теперь и запись времени, и сама конверсия выполняются двумя нажатиями кнопки "c".


  1. trak
    02.02.2025 13:21

    Хотел спросить почему не gstreamer ? Тоже адская машина


    1. sledov Автор
      02.02.2025 13:21

      Если я правильно понимаю, gstreamer — это фреймворк, а mpv — мой основной видеоплеер. Я полагаю, что он широко используется в самых разных, в том числе неожиданных, проявлениях. Например, я видел несколько библиотек на Python, которые используют его для кроссплатформенного воспроизведения MP3.


      1. trak
        02.02.2025 13:21

        Понял, спасибо. Просто у меня видимо профессиональная девиация, мне не пришло бы в голову резать что-то в плеере :)