視聴を終えたビデオにデフォルトのエンブレムを追加したいです。ビデオの再生が終了したかどうかを正確に判断してスクリプトを実行する、簡単で手動ではない方法はありますか? Linux (mint/ubuntu) のビデオ プレーヤーならどれでも使用できます。
答え1
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
2 つのファイルが再生されるとすぐにシステムがシャットダウンすることを意味します。
あなたがしたい場合はアクションを実行するそれぞれ再生されたファイル、このシェル スクリプト ( と呼びます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'
適切な場合は必ずファイルを引用符で囲んでください (特に&
、、*
などの特殊文字や空白の場合)。
フラグ--play-and-exit
は にも使用できますcvlc
。
答え2
質問されたので、それを実現する簡単なラッパーベースのハックを思いついたので、共有しようと思いました。次の vlc ラッパーを作成し、ビデオ ファイルを vlc で直接開くのではなく、その中で開くように設定しました。一度にサポートされるのは 1 つのファイルだけです。ファイルを再生するときに 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
美しいコードというよりは機能していますが、煩わしさを一時的に解決するだけのものにすぎません。
依存関係:
bash、ruby、+ をtag watched
実際のタグ付けコマンドに置き換えます。