見出し画像

⑤クラウドレコーダを動かす(Python)

前回の記事はこちら


はじめに

それでは、クラウドレコーダ作成して、実際に動かしてみます。

本記事の後半は有料記事になっており、ソースコードの説明と全ソースコードの公開を行っています。

ソースコード概要説明

クラウドレコーダは下記の4つのPythonコードで構成されています。

  • __main__.py

  • m2ts_muxser.py

  • m2ts_uploader.py

  • s3_uploader.py

全ソースコードは、本章の最後に載せていますので、これら4つのPythonファイルを同じディレクトリに置いてください。

__main__.py

メイン関数を記述し、プログラムの開始点になります。
M2TSMuxser/M2TSUploaderを作成して処理を行います。

m2ts_muxer.py

カメラ映像をMPEG2-TSに多重化するM2TSMuxerクラスが定義されています。
FFmpegをサブプロセスとして起動し、処理結果のMPEG2-TSデータを標準出力(stdout)から取得します。

m2ts_uploader.py

MPEG2-TSストリームをAWS S3にアップロードするM2TSUploaderクラスが定義されています。
MPEG2-TSのTSパケットを受け取りながら、指定された秒数が経過したら、溜まったMPEG2-TSストリームをAWS S3にアップロードします。
実際のAWS S3へのアップロード処理は、S3Uploaderクラスが行います。

s3_uploader.py

AWS S3にデータをアップロードするS3Uploaderクラスが定義されています。
AWS SDK for Python Boto3を使用して、実際にデータをAWS S3にアップロードします。

__main__.pyに設定値を書き込む

まず、__main__.pyに定義されている下記の2つの外部変数に値を設定します。

  • FFMPEG_COMMAND

  • AWS_S3_BUCKETNAME

FFMPEG_COMMAND = ""
"""カメラに接続するffmpegのコマンド"""

AWS_S3_BUCKETNAME = "" 
"""アップロード先のAWS S3バケット名"""

AWS_S3_BUCKETNAMEの設定

MPEG2-TSを保存するAWS S3のバケット名を指定してください。

FFMPEG_COMMANDの設定

FFMPEG_COMMAND には、FFmpegに渡すコマンドを記載します。

ただし、出力はMPEG2-TSフォーマットで標準出力に出力するように、M2TSMuxerクラス内で設定([-f mpegts pipe:1]を追加)しますので、出力以外のコマンドを指定します。

以下で、RTSPカメラ、UVCカメラの場合の指定の仕方を説明します。

RTSPカメラの場合

RTSPカメラの場合は、カメラのRTSP接続先を設定した後に、映像/音声の圧縮方法を指示します。

下記は、映像はカメラから送られてきた圧縮形式のまま、音声はAACへの圧縮を行ってからMPEG2-TSに多重化する場合の設定値です。

FFMPEG_COMMAND = "-rtsp_transport tcp -i rtsp://[ユーザ]:[パスワード]@[カメラのIPアアドレス]/[RTSPのパス] -c:v copy -c:a aac -ar 48000 -ab 128k"

「rtsp://~」のRTSP接続パスの情報は、前章で調査したパスを設定します。

それ以外のコマンドの説明は以下になります。

  • -rtsp_transport tcp

    • RTSP映像/音声送信の接続(RTP)にTCP接続を使用するTCP-Interleaved RTP を使用して接続する

    • UDPでの受信がうまくいかない環境では、このフラグを付けることでTCP上でデータの受信ができるようになる

  • -c:v copy

    • 映像の圧縮形式

    • "copy"は何もせずそのまま多重化する

  • -c:a aac -ar 48000 -ab 128k

    • 音声の圧縮形式

    • AAC形式で、48000Hz 128kbpsで圧縮する

    • 音声も映像と同じく何もしない(カメラ側の圧縮データをそのまま使う)場合は、"copy"を指定する

UVCカメラの場合

UVCカメラの場合は、RTSPカメラと異なり、UVCカメラからは圧縮されていない映像/音声データが流れてきますので、FFmpegで圧縮を行います。

ビデオの圧縮は非常に処理負荷が高い処理になります。
もし、CPU使用率が100%近くに張り付くような場合は、ビデオからの入力映像サイズや入力フレームレートをを小さくしたりすることで、処理負荷を下げることができます。
また、本書では使用するエンコーダとして、libx264を指定していますので、ソフトウェアによるエンコードになります。
FFmpegに詳しい方は、実行環境に合わせたハードウェアエンコードの環境を作成してください。

下記は、映像をH.264形式、音声をAACで圧縮してMPEG2-TSに多重化する場合の設定値です。

FFMPEG_COMMAND = "[入力デバイスの指定] -c:v libx264 -c:a aac -ar 48000 -ab 128k"
  • -c:v libx264

    • 映像の圧縮形式

    • libx264は、H.264形式に圧縮するソフトウェアエンコーダ

  • -c:a aac -ar 48000 -ab 128k

    • 音声の圧縮形式

    • AAC形式で、48000Hz 128kbpsで圧縮する

[入力デバイスの指定] の箇所に、前章で調査した入力デバイスの指定コマンドを記述します。

Linuxの入力デバイス指定の例

-f v4l2 -video_size 640x320 -framerate 15 -i /dev/video0 -f alsa -i plughw:1,0

Windowsの入力デバイス指定の例

 -f dshow -video_size 800x600 -framerate 30 -i video='HD Webcam eMeet C960':audio='マイク (HD Webcam eMeet C960)'

Macの入力デバイス指定の例

 -f avfoundation -video_size 800x600 -framerate 30 -i 0:0

AWS認証情報の設定

クラウドレコーダを実行するには、AWSで作成したクラウドレコーダ用のIAMユーザの認証情報(アクセスキー/シークレットキー)をクラウドレコーダ内部で使用しているAWS SDK for PythonのBoto3に渡す必要があります。

認証情報の渡し方にはいくつか方法がありますが、ここでは環境変数に設定する方法を説明します。

ダウンロードしたAWS IAMユーザの認証情報(csvファイル)に、アクセスキーとシークレットキーの記載がありますので、それぞれをクラウドレコーダ実行するターミナル(コンソール)に環境変数として設定します。

  • AWS_ACCESS_KEY_ID

    • アクセスキー

  • AWS_SECRET_ACCESS_KEY

    • シークレットキー

Linux/Macの場合の環境変数の設定

# 設定
export AWS_ACCESS_KEY_ID=XXXXXX
export AWS_SECRET_ACCESS_KEY=YYYYYY

# 設定されたかを確認
env | grep AWS_*

Windowsのコマンドプロンプトでの環境変数の設定

# 設定
set AWS_ACCESS_KEY_ID=XXXXXX
set AWS_SECRET_ACCESS_KEY=YYYYYY

# 設定されたかを確認
set

この方法で設定した場合、環境変数を設定したターミナルでのみ、クラウドレコーダを起動できます。

クラウドレコーダの実行

__main__.pyで定義されているAWS_S3_BUCKETNAMEとFFMPEG_COMMANDの設定と、AWS認証情報の設定ができたら、クラウドレコーダが動くはずです。

ソースコードを保存したディレクトリに移動して、__main__.pyを実行してください。

python3 __main__.py

起動すると、カメラとの接続を行います。
カメラ接続が成功すると、[M2TSMuxer] Success to connect to camera! と出力され、その後、30秒ごとに、MPEG2-TSのアップロード成功が出力されます。

python3 __main__.py
[M2TSMuxer] Success to connect to camera!
[S3Uploader] Success to upload  [sample/movie/20230629_153407.ts]
[S3Uploader] Success to upload  [sample/movie/20230629_153437.ts]
[S3Uploader] Success to upload  [sample/movie/20230629_153507.ts]
[S3Uploader] Success to upload  [sample/movie/20230629_153538.ts]

停止させるときは、Ctrl+Cで停止します。

起動が成功したら、実際にAWS S3上にMPEG2-TSが保存されているか、AWSコンソールにログインして確認してみてください。

S3画面で、作成したバケットを選択すると、/movie というフォルダが作成されていると思います。

その中に、日付をファイル名としたTSファイルが保存されていれば、アップロードは成功です。

S3 オブジェクト一覧

ちなみにファイル名に使用されている日時は協定世界時(UTC)です。
日本の時間は+9時間なので、ファイル名の時間に9時間プラスした時間が、日本での録画開始時間になります。
このように、クラウドサーバー上に日時情報を保存する場合は、UTC時間で統一しておき、UI等に表示する際に、UIが実行されているローカル時間に変換する方が間違いがなくなります。
今回のシステムでも、クラウドサーバ上の日時はUTCに統一して進めます。

アップロードされたMPEG2-TSファイルが、正しく再生できるかを確認してみます。

保存されているMPEG2-TSファイルを一つ選択すると、ファイルの詳細画面になります。

この画面上の「ダウンロード」ボタンを押すと、ファイルがPCにダウンロードされますので、それを動画再生プレイヤーで再生してみてください。

S3オブジェクト詳細画面

プレイヤーによっては、MPEG2-TSファイルを再生することができない場合がありますので、その場合は、下記のVLC Media Playerを試してみてください。

後半で作成するHLS(HTTP Live Streaming)の動作確認にも、VLC Media Playerを使用して説明します。

正しく再生できれば、24時間録画クラウドレコーダの完成です!

このクラウドレコーダは、ラズパイなどのSingle Board Computerなどでも動きますので、BOX型のレコーダなども作れると思います。

ちなみに私はNanoPIという中国製のSingle Board Computerに、Ubuntuと今回のプログラムをベースにしたクラウドレコーダを入れて動かしています。

NanoPI

このクラウドレコーダの動作環境は、PythonとFFmpegが動けば、基本はOKなので、色々と試してみてください!

次の記事

クラウドレコーダの処理の流れ

以降の章では、クラウドレコーダの処理の流れの説明と、全ソースコードを公開します。

下記は、クラウドレコーダの処理の流れを図にしたものです。

ここから先は

17,101字 / 4画像

¥ 1,800

この記事が気に入ったらサポートをしてみませんか?