2022年10月30日日曜日

スコープ

 

関数呼び出し元の参照
(thisは省略可能)
戻り値用途
applythis呼び出し元のインスタンスプロパティ設定
alsoit呼び出し元のインスタンスプロパティ設定
letitラムダの結果メソッドの実行 nullチェック
runthisラムダの結果メソッドの実行
withthisラムダの結果メソッドの実行

[Kotlin]スコープ関数 apply,also,let,run,withの使い分け https://pouhon.net/kotlin-sfunction/1392/

2022年10月3日月曜日

プロパティーの初期化

初期化タイミングを変数を初めて使用する時に初期化する

lateinit、by lazy

プリミティブ型には使用できない。

varで宣言する必要がある。

必ずnon-nullとなる。

class MainActivity : AppCompatActivity() {

private lateinit var textView: TextView

override fun onCreate(saveInstanceState: Bundle?) {

super.onCreate(saveInstanceState)

textView = findViewById(R.id.text_view) // ここで初めて初期化される

}

// …

}

varで宣言するので、再代入には注意すること。

by lazy

型の制限はない。

valで宣言する必要がある。

nullable / nun-nullどちらでも可能

対象のプロパティが初めて呼び出されたときに初期化される。

初期化されたら必ず同じ値を返す。

class MainActivity : AppCompatActivity() {

private val userData: User? by lazy { fetchUserData() }

override fun onCreate(saveInstanceState: Bundle?) {

super.onCreate(saveInstanceState)

userData?.let { showUserData(it) } // ここで初めて初期化される

}

// …

}

ビューをlazyで初期化した場合、変更を加えても反映されない。

プロパティーにnullが入る可能性がある場合はlazyを使う必要がある。

by lazyは初期化処理を記述する必要があるので、記述上各メソッドの処理はスッキリさせることができる。


Qiita 【Android】lateinitとby lazyの使い分け【Kotlin】 https://qiita.com/u-dai/items/a31c5c2a7d5c7ed2cc47

2022年4月2日土曜日

motion いつの間にか落ちてる ffmpeg_put_frame: Error while writing video frame / event_ffmpeg_put: Error encoding image

トリガー条件不明。

motionはカメラから画像が指定したFPS以下の場合、不足したフレームを複製させてパディングするようなパラメータがあるが、実際のところ不足しているフレームは単純に抜け落ちるだけで保管もされない。

そのために落ちているのかもしれないが、よくわからない。

が、実際にこのエラーが表示されている状態でもファイル出力がされていたので、無視していいのかもしれない。

なお、部屋を暗くしたらこれが発生して落ちていた。

状況としては動作検知後、録画し始めて19時17分22秒あと、1分程度経ってからエラーが出始め、落ちていた。 

[1:ml1:F] [NTC] [EVT] [Apr 02 19:17:22] event_newfile: File of type 8 saved to: /tmp/motion/C270_2/20220402191722F-10.mp4
[1:ml1:F] [NTC] [ALL] [Apr 02 19:17:22] create_path: creating directory /tmp/motion/C270_2
[1:ml1:F] [NTC] [EVT] [Apr 02 19:17:22] event_create_extpipe: pipe: ffmpeg
[1:ml1:F] [NTC] [EVT] [Apr 02 19:17:22] event_create_extpipe: cnt->moviefps: 10
[1:ml1:F] [NTC] [EVT] [Apr 02 19:17:22] event_newfile: File of type 8 saved to: /tmp/motion/C270_2/20220402191722F-10
[1:ml1:F] [NTC] [ALL] [Apr 02 19:17:22] motion_detected: Motion detected - starting event 10
[1:ml1:F] [ERR] [ENC] [Apr 02 19:18:52] ffmpeg_put_frame: Error while writing video frame
[1:ml1:F] [ERR] [EVT] [Apr 02 19:18:52] event_ffmpeg_put: Error encoding image
[1:ml1:F] [ERR] [ENC] [Apr 02 19:18:52] ffmpeg_put_frame: Error while writing video frame
[1:ml1:F] [ERR] [EVT] [Apr 02 19:18:52] event_ffmpeg_put: Error encoding image
[1:ml1:F] [ERR] [ENC] [Apr 02 19:18:52] ffmpeg_put_frame: Error while writing video frame

[1:ml1:F] [ERR] [ENC] [Apr 02 19:20:02] ffmpeg_put_frame: Error while writing video frame
[1:ml1:F] [ERR] [EVT] [Apr 02 19:20:02] event_ffmpeg_put: Error encoding image
[1:ml1:F] [NTC] [ALL] [Apr 02 19:20:22] preview_save: different filename or picture only!

ログの抜粋はこんな感じ

作られたファイルとログは矛盾点はなかった。

もしかすると、pipeで渡しているフォーマットがまずいのかもしれないが、出力され始めるタイミングがずれているのと、フレームレートは10FPSと低めにしているのでそれなりなはずなのだが…

motion ファイル名の拡張子

use_extpipe on

でpipeで外部エンコーダを利用するとon_movie_endイベントでファイル名をパラメータとして渡したときに、拡張子がついていたりついてなかったりする。

トリガー条件が不明。

ログ(/var/log/motion/motion.log)を見てみると event_newfile: でファイル名が出力されているので見てみると、extpipeを使い始めたタイミングで2回ファイル名が出力されているように見える。extpipeがonでも拡張子があったりなかったりする。

問題がなさそうな時

[1:ml1:F] [NTC] [EVT] [Apr 01 19:58:26] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401195826F-01.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 19:59:08] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401195829F-01-05.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 20:02:28] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401200228F-02.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 20:02:58] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401200228F-02-04.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 20:11:02] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401201102F-03.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 20:14:02] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401201112F-03-02.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 20:14:26] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401201425F-04.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 20:15:06] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401201426F-04-02.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 20:15:28] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401201528F-05.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 20:16:54] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401201531F-05-01.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 20:16:56] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401201656F-06.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 20:17:57] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401201712F-06-07.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 20:21:46] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401202145F-07.mp4

問題が発生している前後では拡張子がないファイルが作成されている感じになっている。

[1:ml1:F] [NTC] [EVT] [Apr 01 22:26:47] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401222647F-02
[1:ml1:F] [NTC] [EVT] [Apr 01 22:27:31] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401222649F-02-05.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 22:38:21] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401223821F-01.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 22:38:21] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401223821F-01
[1:ml1:F] [NTC] [EVT] [Apr 01 22:38:58] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401223822F-01-07.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 22:42:45] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401224245F-02.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 22:42:45] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401224245F-02
[1:ml1:F] [NTC] [EVT] [Apr 01 22:45:45] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401224251F-02-05.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 22:45:45] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401224545F-03.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 22:45:45] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401224545F-03
[1:ml1:F] [NTC] [EVT] [Apr 01 22:47:29] event_newfile: File of type 1 saved to: /tmp/motion/C270/20220401224646F-03-02.jpg
[1:ml1:F] [NTC] [EVT] [Apr 01 22:47:30] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401224730F-04.mp4
[1:ml1:F] [NTC] [EVT] [Apr 01 22:47:30] event_newfile: File of type 8 saved to: /tmp/motion/C270/20220401224730F-04
 

動作させてるバージョン。

pi@rasp3b:~ $ motion -help
motion Version 4.1.1, Copyright 2000-2017 Jeroen Vreeken/Folkert van Heusden/Kenneth Lavrsen/Motion-Project maintainers
 

解決策としてはイベント中の処理スクリプトで拡張子を付加して対応したが、少々気持ち悪い動作というか多分バグ。仕様としては拡張パイプを使用した場合の拡張子がついてしまっているのがおかしいかな。

bash 文字列 ファイルの拡張子の扱い

pi@rasp3b:~ $ FILENAME=ABCDEF.GHI
pi@rasp3b:~ $ echo ${FILENAME##*.}
GHI
pi@rasp3b:~ $ FILENAME=ABCDEF.
pi@rasp3b:~ $ echo ${FILENAME##*.}

ファイル名に拡張子がない場合は同じ文字列になる。

pi@rasp3b:~ $ FILENAME=ABCDEF
pi@rasp3b:~ $ echo ${FILENAME##*.}
ABCDEF

拡張子しかない場合も同じものとなる。

pi@rasp3b:~ $ FILENAME=.XYZ
pi@rasp3b:~ $ echo ${FILENAME##*.}
XYZ