Недавно у меня возникла необходимость непременно вырезать фрагмент из видео без перекодирования, и, разочаровавшись в очередной раз в 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)
zelenin
02.02.2025 13:21можно использовать скрипт mpv-cut
в итоге все свелось к ffmpeg -c copy, что логично
sledov Автор
02.02.2025 13:21Оно и начиналось с команды "ffmpeg -c copy". Просто до этого я сначала открывал видео в mpv, записывал время начала и время конца, чтобы затем использовать эти данные в команде для ffmpeg. А теперь и запись времени, и сама конверсия выполняются двумя нажатиями кнопки "c".
trak
02.02.2025 13:21Хотел спросить почему не gstreamer ? Тоже адская машина
sledov Автор
02.02.2025 13:21Если я правильно понимаю, gstreamer — это фреймворк, а mpv — мой основной видеоплеер. Я полагаю, что он широко используется в самых разных, в том числе неожиданных, проявлениях. Например, я видел несколько библиотек на Python, которые используют его для кроссплатформенного воспроизведения MP3.
trak
02.02.2025 13:21Понял, спасибо. Просто у меня видимо профессиональная девиация, мне не пришло бы в голову резать что-то в плеере :)
MonkeyWatchingYou
Простите, вопрос немного не по теме. Вы упомянули MPV Плеер, посмотрел сайт и возник вопрос о модели финансирования подобного. Разработка, хостинг и поддержка требуют денег. Про опенсорс вроде пусто. Скачивать это безопасно и можно снять шапку из фольги или ... 50/50?
evgeniy_kudinov
Если для вашей ОС нет готового пакета, устанавливаемого из официального репозитория, то можно собрать из исходников. Код проекта и как собрать в https://github.com/mpv-player/mpv