Linux - Как запустить скрипт после завершения воспроизведения видео?
Я хочу добавить эмблему по умолчанию к видео, которые я просмотрел. Какой-нибудь простой, не ручной способ запуска сценария, если и точно, если видео закончилось воспроизведение? Может быть для любого видеоплеера Linux (Mint/ Ubuntu).
2 ответа
vlc --play-and-exit video.mp4 && echo "Terminated"
Заменятьecho "Terminated"
с фактической командой, которую вы хотите запустить. &&
означает, что если vlc завершит работу с кодом ошибки, команда не будет выполнена. Если вы хотите, чтобы команда выполнялась даже в случае возникновения ошибки,
vlc --play-and-exit video.mp4; echo "Terminated"
Если вы предоставите vlc больше файлов, команда будет выполнена только после воспроизведения всех медиафайлов. Например,
vlc --play-and-exit s0.mp3 s1.mp4 && shutdown now
означает, что система выключится сразу после воспроизведения двух файлов.
Если вы хотите выполнить действие для каждого воспроизводимого файла, вы можете использовать этот сценарий оболочки (назовем егоplay.sh
):
#!/bin/sh
for file in "$@"; do
vlc --play-and-exit "$file"
echo "File $file has been played."
done
Затем выполните его для различных файлов:
sh play.sh file1.mp3 'Me & You.mp4' 'file 3.wav'
Не забывайте заключать файлы в кавычки, когда это необходимо (особенно пробелы и специальные символы, такие как&
,*
, и т. д.).
The --play-and-exit
флаг также доступен дляcvlc
.
С тех пор, как я спросил, я подумал, что поделюсь быстрым хакером на основе обертки, который я придумал, который делает это. Я создал следующую обёртку vlc и настроил видео файлы, чтобы открывать в ней, а не напрямую vlc. Он поддерживает только один файл за раз. Если вещь, которая перемещается в vlc во время воспроизведения файла, доходит до конца, она запускает tag watched
Команда в конце, если около 60% видео было просмотрено.
#!/bin/bash
#This depends on the cli interface having been activated in the preferences
# This while loop feeds the `get_length` vlc cli command to cli every 0.1 s
(while :; do echo get_length; sleep 0.1 ; done) |
#Pass all arguments to vlc and set it up to be fed from the `get_length` while loop
/usr/bin/vlc "$@" |
ruby -n -e '
BEGIN {
cons_empty=0
nlines_read=0
}
#Strip vlc cli noise
$_=$_.sub(/^[> ]*/,"")
#Watch consecutive (cons) empty lines
if $_.match(/^\s*$/)
cons_empty += 1
else
#Assume each nonempty stdin line is the duration
duration = $_.chomp.to_i
cons_empty = 0
nlines_read += 1
end
#On 10 consecutive empty lines, assume the file has finished playing
if cons_empty == 10
time_watched = nlines_read * 0.1
p time_watched: time_watched, duration: duration
ret = (time_watched > 0.6 * duration) ? 1 : 0
exit ret
end
' ||
tag watched "$@" #1 exit means finished watching
Это работает, а не красивый код, но это только быстрое решение для раздражения.
зависимости:
Баш, Рубин + заменить tag watched
с вашей фактической командой пометки.