2020年11月27日金曜日

カササギ

 


ffmpeg の進捗率を awkで表示

[ 概要]
・例外処理やエラー対応なしの骨格のみ。gawk以外では動かんかも。
・ffmpegで、sample.tsを sample.mp4に変換する。
・ffmpeg の出力ストリームを awkで加工。再生時間 Durationと処理中 timeを秒換算して、進捗率(time/Duration*100)を表示。
・ffmpegは標準エラーにメッセージを流す。
・awkのレコードセパレータ RS(普通は改行)が \n \rと限らない。"frame="をRSとしてみる。
・リダイレクトで標準エラーを標準出力にし、パイプで awkに送る。

[ 用意するもの]
ffmpeg, gawk, awkスクリプトを書くテキストエディタ。テスト用の動画ファイル(ここでは ts→mp4)。

[ 使用例]
$ ffmpeg -i sample.ts -codec copy sample.mp4 2>&1 | awk -f ex01.awk
(出力例)
47 %
95 %
100 %
$

小さなtsファイルだと表示の間もない。大きなファイルだと少数切り捨てなので、1% 1% 1%...繰り返しのように見える。

[ ex01.awk スクリプト]
BEGIN{RS="frame="}
/Duration: /{
    match($0, /[0-2][0-3]:[0-5][0-9]:[0-5][0-9]/)
    TIME=substr($0, RSTART, RLENGTH)
    split(TIME, array, ":")
    Dura=array[1]*3600+array[2]*60+array[3]
}
/time=/{
    match($0, /[0-2][0-3]:[0-5][0-9]:[0-5][0-9]/)
    Now=substr($0, RSTART, RLENGTH)
    split(Now, array1, ":")
    Prog=array1[1]*3600+array1[2]*60+array1[3]
    Ratio=int(Prog/Dura*100)
    print Ratio " %"
}

この後、KDEのKdialogを使って、マウスだけでやるようにするつもり...以上。素人遊び。

[ 環境]
・Debian
$ uname -a
Linux debian 5.8.0-0.bpo.2-amd64 #1 SMP Debian 5.8.10-1~bpo10+1 (2020-09-26) x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
・KDE
$ kf5-config --version
Qt: 5.11.3
KDE Frameworks: 5.54.0
kf5-config: 1.0
$ plasmashell --version
plasmashell 5.14.5
・awk
$ which awk
/usr/bin/awk
$ ls -l /usr/bin/awk
...略... /usr/bin/awk -> /etc/alternatives/awk
$ file /etc/alternatives/awk
/etc/alternatives/awk: symbolic link to /usr/bin/gawk
$ gawk -V
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)

2020年11月16日月曜日

カササギ


この付近では、珍しいカチガラス。
鳴き声は聞こえて、姿も何度か目にしてるけれど、なかなか写せず、この程度。

2020年11月2日月曜日

VLCがメモリに残る

(Debian GNU/Linux 10 (Buster) + KDE plasma にて)
VLC media player 終ったように見えて、メモリ内に残っている。
 
[探す方法]
 
・Ksysguard プロセステーブルよりvlc検索


・KDEパネルの[Status & Notifications]
 終了したはずなのに残ってる

・KDEパネルの[Audio Volume] Applications
 消したはずのvlcが残っていくのがわかる
 
・ps と grep
$ ps aux | grep vlc

または、STAT表示を残してgrepコマンド自体を表示させない体裁
$ ps aux | grep -E 'STAT|vlc' | grep -v grep
 
・pgrep (procpsパッケージ要)
$ pgrep -a vlc
4271 /usr/bin/vlc --started-from-file /home/user/.....
5467 /usr/bin/vlc --started-from-file /home/user/.....
 
・ps と grep と watch
15秒毎にvlcが残っていないか見張る
$ watch -n15 "ps aux | grep -E 'STAT|vlc' | grep -v grep" 


[消す方法]

・Ksysguard プロセステーブル 検索して該当vlcを右クリック→シグナルを送る→割り込み(INT)

・kill 一つずつなので面倒
$ kill -s INT プロセス番号

・killall 一気に消せて一番便利
$ killall -s INT vlc

・pkill (
procpsパッケージ要) (-e:echoはなくてもいい)
$ pkill -INT -e vlc


備考
STAT
S    割り込み可能なスリープ状態 (イベントの完了を待っている)
l    マルチスレッド化されている (NPTL pthreads が行うように、CLONE_THREADが使われている)

SIGNAL
1     HUP     制御している端末/プロセスがハングアップした
2     INT     キーボードからの割り込み命令([Ctrl]+[C]キー)
3     QUIT     キーボードからの中止命令([Ctrl]+[\]キー)
9     KILL     プロセスの強制終了命令
15     TERM     プロセスの終了命令(デフォルト)
18     CONT     プロセスの再開命令
19     STOP     プロセスの停止命令([Ctrl]+[Z]キー)