⑤クラウドレコーダを動かす(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で圧縮を行います。
下記は、映像を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ファイルが保存されていれば、アップロードは成功です。
アップロードされたMPEG2-TSファイルが、正しく再生できるかを確認してみます。
保存されているMPEG2-TSファイルを一つ選択すると、ファイルの詳細画面になります。
この画面上の「ダウンロード」ボタンを押すと、ファイルがPCにダウンロードされますので、それを動画再生プレイヤーで再生してみてください。
プレイヤーによっては、MPEG2-TSファイルを再生することができない場合がありますので、その場合は、下記のVLC Media Playerを試してみてください。
正しく再生できれば、24時間録画クラウドレコーダの完成です!
このクラウドレコーダは、ラズパイなどのSingle Board Computerなどでも動きますので、BOX型のレコーダなども作れると思います。
ちなみに私はNanoPIという中国製のSingle Board Computerに、Ubuntuと今回のプログラムをベースにしたクラウドレコーダを入れて動かしています。
このクラウドレコーダの動作環境は、PythonとFFmpegが動けば、基本はOKなので、色々と試してみてください!
次の記事
クラウドレコーダの処理の流れ
以降の章では、クラウドレコーダの処理の流れの説明と、全ソースコードを公開します。
下記は、クラウドレコーダの処理の流れを図にしたものです。
ここから先は
¥ 1,800
この記事が気に入ったらサポートをしてみませんか?