raspiカメラをアクティブに録画/停止する方法はありますか?


8

Raspiカメラの起動はかなり簡単です。

raspivid -t 10000 -o test.h264

問題:

これを止める方法はありません。私の知る限りでは、小売用のカメラはありません。何秒実行するかをユーザーが指定し、停止するまでその秒数実行する必要があるため、これは私には本当に愚かです。

バックグラウンド:

これは監視に大きな問題を提起します。ユーザーが離れるとホームサーベイランスがオンになり、帰宅すると再びオフになるプログラムを作成しています。ユーザーが戻る直前にモーションが検出されると、カメラは所定の時間(つまり10分間)録画を開始しますが、raspividコマンドがブロックされているため、ユーザーが実際に家にいるという状況になりますが、プログラムであるsurveillance状態。これを回避するために、raspividコマンドを起動するためのスレッドを起動します。これで、ユーザーの出入りに基づいて状態が正しく更新されるようになりました。しかし、今では他の州は機能しません。たとえば、TVHD映像の録画とそれを同時に見ることができないため、状態に切り替えることができません。同様に、に切り替えることはできませんParty カメラが既に録画しているため、状態(パーティーの常時ビデオ録画)。

可能な解決策:

Webで見つけたコード(ただし、リンクが見つからない)を使用して、raspividコマンドを起動したスレッドを強制終了するハックを見つけました。残念ながら、これはSOによる冒涜と見なされますここここを参照)。これは、.h264ファイルを破損してメモリリークを引き起こす可能性があるだけでなく、コーディングするのが悪夢であることにも同意します(ロックとモーション検出のために他のスレッドも起動しているので、セマフォはどこにでもあります)

質問:

raspiカメラの録画を停止する方法はありますか?そうでない場合、なぜそうではないのですか?

回答:


7

ソースコードを調べてRaspivid、キャプチャを中断する方法が2つあることがわかります。

最初の方法は、キャプチャプロセスに任意の信号を送信することです。信号は次のコードで処理されますRaspivid

    /**
     * Handler for sigint signals
     *
     * @param signal_number ID of incoming signal.
     *
     */
    static void signal_handler(int signal_number)
    {
        // Going to abort on all signals
        vcos_log_error("Aborting program\n");

        // TODO : Need to close any open stuff...how?

       exit(255);
    }

これにより、キャプチャプロセスは平均100msで実行を終了します。

この回答のコメントに記載されているように、これはPythonで次のコードを使用して実行できます。

    popen = subprocess.Popen ( cmd )
    .
    .
    .
    popen.send_signal ( signal.SIGINT )

別の方法は、次のフィールドを持つユーザーデータコールバックを使用することです。

    callback_data.abort = 0;

このフィールドをゼロ以外に設定するとどうなるか推測できます=)

詳細な説明が必要な場合は、ソースコードを確認してください。


ありがとう。しかし、どちらが何であるかはわかりません。それはCですか?私のコードはPythonであると言っておくべきでした。popen = subprocess.Popen ( cmd )and を使用して、この問題を回避する方法を見つけることができましたpopen.send_signal ( signal.SIGINT )
2013年

まあ、信号を送ることは私が書いた最初のアプローチです、申し訳ありませんでした=)
lenik

1
通常、STOPおよびCONT信号はこれで問題なく動作します
John La Rooy

参考までraspividに、ビデオの録画を制御する信号を使用できるようにするためにコードが追加されました。信号を使用して、一時停止してから録音を再開できます。プログラムの終了を通知し、出力ファイルを正常に閉じる方法があるかどうかは不明です。参照してくださいgithub.com/raspberrypi/userland/pull/104に追加された新しいオプションの詳細についてはraspivid
HeatfanJohn 2013年

ノードjsでSIGTERMシグナルを送信して正常に終了しました。
Goofyahead 2014年

2

-k(keypress)オプションを使用してみてください:Cycle between capture and pause on ENTER

raspivid -t 10000 -o test.h264 -k

このコマンドを実行した後、「x」および「enter」を押してビデオを停止します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.