④カメラとの接続情報調査(FFmpeg)
前回の記事はこちら
はじめに
本章では、クラウドレコーダを動かすための環境構築と、RTSPカメラ/UVCカメラを調査して、FFmpeg の入力情報を取得します。
クラウドレコーダでは下記の処理を行います。
RTSP対応カメラと接続し、映像/音声データを受信する。もしくは、PCにUSBで接続されたUVCカメラ(USB Video Classカメラ)から、映像/音声データを取得し、H.264/AACに圧縮(Encode)する
受信した映像/音声データをMPEG2-TSに多重化(Multiplex/Mux)する
指定した秒数に多重化されたMPEG2-TSを分割して、AWS S3にアップロードする
これらの処理のうち、動画処理に関する処理はFFmpeg を使用して行います。
FFmpegとは、画像や動画を扱うコマンド型式のフリーソフトウェアです。
クロスプラットフォーム対応なので、Linuxだけでなく、WindowsやMacでも同様に使用することができます。
また入力や出力に標準入出力(stdin/stdout)を使うことができるので、Pythonなどの外部プログラムとの連携が容易にできるようになっています。
クラウドレコーダでは、このFFmpegを、Pythonプログラムから使用して、UVCカメラの映像/音声の圧縮処理(Encode)や、多重化処理(Multiplex/Mux)を行います。
また、出力されるMPEG2-TSストリームは、FFmpegの標準出力から取得し、プログラム内部で分割し、AWS S3にアップロードします。
動作環境構築
まずは、クラウドレコーダを動かすために、環境を準備します。
必要な環境は以下になります。
python3.9以上の実行環境の準備
AWS SDK for Python Boto3のインストール
FFmpegのインストール
具体的な環境構築手順はOSによっても異なりますし、有用な情報がインターネット上にはたくさんありますので、そちらを参照してください。
ポイントとしては以下になります。
Pythonの実行環境は、バージョンは3.9以上で構築してください
AWS SDK for PythonのBoto3は、pipなどのPythonパッケージ管理ツールでインストールしてください。
pip install boto3
FFmpegは、プログラム内部でffmpegモジュールまでのフルパスを指定できるようになっているので、パスが通っていなくても大丈夫です。(ffmpegモジュールがコピーされていればOK)
カメラの準備
カメラは、RTSP対応のネットワークカメラか、USB接続のUVCカメラのどちらかを用意してください。
UVCカメラの場合、音声も取得する場合はマイク付きのUVCカメラか、PCに別途音声入力デバイスを接続してください。
RTSPカメラの場合、カメラの設定で映像の圧縮形式を選べる場合は、H.264形式 を選択してください。
最近はH.265 形式のカメラも増えてきていますが、ブラウザでの動画再生ができない場合がありますので、H.264形式での圧縮を選択してください。
ちなみに、RTSPカメラもUVCカメラも、音声入力がなくても、音声のない映像のみの動画としてクラウドレコーダを動かすことができます。
カメラの準備ができたら、カメラとの接続情報を調べます。
RTSPカメラの場合とUVCカメラの場合で、調べ方が異なりますし、また、UVCカメラの場合はOSによっても調べ方が異なります。
以後は、それぞれのカメラの接続情報の取得方法を説明していきます。
カメラ接続情報の調査(UVCカメラ)
Linuxの場合
Linuxの場合の調査方法は、Ubuntu22.04をベースに説明します。
Linuxでは、UVCカメラとの接続に、映像はV4L2(Video for Linux2) を、音声はALSA(Advanced Linux Sound Architecture) を使用します。
まずは、V4L2とALSAをインストールします。
sudo apt update
sudo apt install v4l2-utils
sudo apt install alsa-utils
インストール後、PCにUVCカメラを接続し、その接続情報を表示させます。
Videoデバイスの情報は、「v4l2-ctl --list-devices」で、Audioデバイスの情報は「arecord -l」で表示させます。
videoデバイスの列挙
v4l2-ctl --list-devices
Microsoft® LifeCam HD-3000: Mi (usb-0000:00:0b.0-1):
/dev/video0
/dev/video1
audioデバイスの列挙
arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: I82801AAICH [Intel 82801AA-ICH], デバイス 0: Intel ICH [Intel 82801AA-ICH]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 0: I82801AAICH [Intel 82801AA-ICH], デバイス 1: Intel ICH - MIC ADC [Intel 82801AA-ICH - MIC ADC]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 1: HD3000 [Microsoft® LifeCam HD-3000], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
上記は、Microsoft製のLifeCam HD-3000というマイク付きWebカメラを接続した場合の情報です。
これらの一覧情報から以下の情報をメモしておきます。
videoデバイスのパス(/dev/video0) ※とりあえず若い番号の方
audioデバイスのカード番号とサブデバイス番号(カード番号1、サブデバイス番号0)
次にvideoデバイスがサポートしているビデオのサイズとフレームレートの一覧を「v4l2-ctl -d /dev/video0 --list-formats-ext」で表示させます。
v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUYV 4:2:2
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Size: Discrete 640x360
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Size: Discrete 1280x800
Interval: Discrete 0.100s (10.000 fps)
上記のフォーマット情報から、ビデオの入力サイズとフレームレートを選択します。
UVCカメラの場合、FFmpegで圧縮処理(Encode)を行いますので、ビデオサイズが大きく、またフレームレートが高いほうがエンコードの処理負荷が高くなります。
これらの情報から、FFmpegの入力コマンドは以下のようになります。
-f v4l2 -video_size 640x320 -framerate 15 -i /dev/video0 -f alsa -i plughw:1,0
引数説明
-f v4l2
入力フォーマットとしてv4l2を指定
-video_size 640x320
ビデオの入力サイズ
-framerate 15
ビデオの入力フレームレート
-i /dev/video0
ビデオ入力デバイスの指定
-f alsa
入力フォーマットとしてALSAを指定
-i plughw:1,0
オーディオ入力デバイスの指定
plughw:[カード番号],[サブデバイス番号]
このパスをメモしておき、後程クラウドレコーダに設定します。
Windowsの場合
Windowsの場合、カメラとの接続にはDirectShow を使います。
DirectShow とは、Windows上でメディアを扱う際の共通APIです。
最初からWindowsに入っていますので、FFmpegを使って、コマンドプロンプトで「ffmpeg -list_devices true -f dshow -i dummy」を入力すると、ビデオや音声の情報を表示させることができます。
ffmpeg -list_devices true -f dshow -i dummy
[dshow @ 000002d291eebb80] "HD Webcam eMeet C960" (video)
[dshow @ 000002d291eebb80] Alternative name "@device_pnp_\\?\usb#vid_328f&pid_2013&mi_00#7&39fbeec7&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 000002d291eebb80] "マイク (4- USB PnP Audio Device)" (audio)
[dshow @ 000002d291eebb80] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{8C2D500B-1450-43FA-8404-5A2B25817267}"
[dshow @ 000002d291eebb80] "マイク (HD Webcam eMeet C960)" (audio)
[dshow @ 000002d291eebb80] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{44545183-13C6-4A8E-A80C-20BD4E517837}"
上記は中国製のHD Webcam eMeet C960を接続したときの情報です。
これらの一覧情報からvideoデバイスとaudioデバイスの名前をメモしておきます。
videoデバイスは"HD Webcam eMeet C960"
audioデバイスは"マイク (HD Webcam eMeet C960)"
次にvideoデバイスがサポートしているビデオのサイズとフレームレートの一覧を、コマンドプロンプトに「ffmpeg -f dshow -list_options true -i video="HD Webcam eMeet C960"」と入力して表示させます。
ffmpeg -f dshow -list_options true -i video="HD Webcam eMeet C960"
[dshow @ 000001c5f2b2bb80] DirectShow video device options (from video devices)
[dshow @ 000001c5f2b2bb80] Pin "キャプチャ" (alternative pin name "0")
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=640x480 fps=30 max s=640x480 fps=30
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=640x480 fps=30 max s=640x480 fps=30 (pc, bt470bg/bt709/unknown, center)
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=640x360 fps=30 max s=640x360 fps=30
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=640x360 fps=30 max s=640x360 fps=30 (pc, bt470bg/bt709/unknown, center)
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=800x600 fps=30 max s=800x600 fps=30
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=800x600 fps=30 max s=800x600 fps=30 (pc, bt470bg/bt709/unknown, center)
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=1920x1080 fps=30 max s=1920x1080 fps=30
[dshow @ 000001c5f2b2bb80] vcodec=mjpeg min s=1920x1080 fps=30 max s=1920x1080 fps=30 (pc, bt470bg/bt709/unknown, center)
[dshow @ 000001c5f2b2bb80] pixel_format=yuyv422 min s=640x480 fps=30 max s=640x480 fps=30
[dshow @ 000001c5f2b2bb80] pixel_format=yuyv422 min s=640x480 fps=30 max s=640x480 fps=30 (tv, bt470bg/bt709/unknown, topleft)
[dshow @ 000001c5f2b2bb80] pixel_format=yuyv422 min s=1920x1080 fps=5.00001 max s=1920x1080 fps=5.00001
[dshow @ 000001c5f2b2bb80] pixel_format=yuyv422 min s=1920x1080 fps=5.00001 max s=1920x1080 fps=5.00001 (tv, bt470bg/bt709/unknown, topleft)
上記のフォーマット情報から、ビデオの入力サイズとフレームレートを選択します。
UVCカメラの場合、FFmpegで圧縮処理(Encode)を行いますので、ビデオサイズが大きく、またフレームレートが高いほうがエンコードの処理負荷が高くなります。
これらの情報から、FFmpegの入力コマンドは以下のようになります。
-f dshow -video_size 800x600 -framerate 30 -i video='HD Webcam eMeet C960':audio='マイク (HD Webcam eMeet C960)'
引数説明
-f dshow
入力フォーマットとしてDirectShowを指定
-video_size 640x320
ビデオの入力サイズ
-framerate 30
ビデオの入力フレームレート
-i video='HD Webcam eMeet C960':audio='マイク (HD Webcam eMeet C960)'
使用するデバイス名
video=[ビデオデバイスの名前]:audio=[オーディオデバイスの名前]
このパスをメモしておき、後程クラウドレコーダに設定します。
Macの場合
Macの場合、カメラとの接続にはAVFoundation を使います。
AVFoundation とは、Mac上でメディアを扱う際の共通APIです。
最初からMacに入っていますので、FFmpegを使って、ターミナルで「ffmpeg -list_devices true -f avfoundation -i dummy」を入力すると、ビデオや音声の情報を表示させることができます。
ffmpeg -list_devices true -f avfoundation -i dummy
[AVFoundation indev @ 0x7f8b4af05000] AVFoundation video devices:
[AVFoundation indev @ 0x7f8b4af05000] [0] Microsoft® LifeCam HD-3000
[AVFoundation indev @ 0x7f8b4af05000] [1] Capture screen 0
[AVFoundation indev @ 0x7f8b4af05000] AVFoundation audio devices:
[AVFoundation indev @ 0x7f8b4af05000] [0] Microsoft® LifeCam HD-3000
上記は、Microsoft製のLifeCam HD-3000というマイク付きWebカメラを接続した場合の情報です。
これらの一覧情報からvideoデバイスとaudioデバイスの番号をメモしておきます。
videoデバイスは"[0] Microsoft® LifeCam HD-3000"の0
audioデバイスは"[0] Microsoft® LifeCam HD-3000"の0
もし、以下のようなエラーが表示された場合は、ターミナルからカメラやマイクへのアクセスが許可されていません。
[avfoundation @ 0x7fe2b0a04200] Failed to create AV capture input device: Cannot use Microsoft® LifeCam HD-3000
0:: Input/output error
その場合は、システム環境設定のセキュリティとプライバシーを開き、プライバシータブのカメラとマイクで、ターミナルのアクセスを許可してください。
次にvideoデバイスがサポートしているビデオのサイズとフレームレートの一覧を、ターミナルに「ffmpeg -f avfoundation -i 0:"」と入力して表示させます。
ffmpeg -f avfoundation -i 0:
[avfoundation @ 0x7f8315021880] Selected framerate (29.970030) is not supported by the device.
[avfoundation @ 0x7f8315021880] Supported modes:
[avfoundation @ 0x7f8315021880] 160x120@[7.500002 30.000030]fps
Last message repeated 1 times
[avfoundation @ 0x7f8315021880] 640x480@[7.500002 30.000030]fps
Last message repeated 1 times
[avfoundation @ 0x7f8315021880] 800x600@[7.500002 30.000030]fps
[avfoundation @ 0x7f8315021880] 800x600@[7.500002 15.000015]fps
[avfoundation @ 0x7f8315021880] 1280x720@[7.500002 30.000030]fps
[avfoundation @ 0x7f8315021880] 1280x800@[10.000000 10.000000]fps
上記のフォーマット情報から、ビデオの入力サイズとフレームレートを選択します。
UVCカメラの場合、FFmpegで圧縮処理(Encode)を行いますので、ビデオサイズが大きく、またフレームレートが高いほうがエンコードの処理負荷が高くなります。
これらの情報から、FFmpegの入力コマンドは以下のようになります。
-f avfoundation -video_size 800x600 -framerate 30 -i 0:0
引数説明
-f avfoundation
入力フォーマットとしてAVFoundationを指定
-video_size 800x600
ビデオの入力サイズ
-framerate 30
ビデオの入力フレームレート
-i 0:0
使用するデバイス名
[ビデオデバイスの番号]:[オーディオデバイスの番号]
このパスをメモしておき、後程クラウドレコーダに設定します。
カメラ接続情報の調査(RTSPカメラ)
設定画面等にRTSP情報の記載がある場合
RTSPカメラの接続情報は、カメラの設定画面に表示があったり、別途メーカーのFAQなどに記載があったりします。
接続に必要な情報は以下です。
カメラのIPアドレス
RTSP配信ポート番号
RTSPのアクセスパス(SDPの配信パス)
ログインユーザ/パスワード
上記の情報をまとめて、RTSPの接続パスは以下のように表現できます。
rtsp://[ユーザ]:[パスワード]@[カメラのIPアドレス]:[RTSP配信ポート]/[RTSPのアクセスパス]
例としてIO-DATA QWatchの場合の情報を確認してみます。
このQWatchカメラはRTSPに対応しており、カメラの設定画面上にその情報が表示されます。
以上から、以下の情報が分かります。
カメラのIPアドレスは、192.168.1.55
RTSP配信ポート番号は、16090
RTSPのアクセスパス(SDPの配信パス)は、ipcam_h264.sdp
ログインユーザ/パスワードは、xxxx/ppppとします
この情報をまとめると、RTSP接続パスは以下のようになります。
RTSP接続パス(IO-DATA QWatchの例)
rtsp://xxxx:pppp@192.168.1.55:16090/ipcam_h264.sdp
このパスをメモしておき、後程クラウドレコーダに設定します。
RTSP通信をキャプチャーして調べる場合
RTSP接続情報が設定画面やメーカーから提供されていない場合は、ネットワークパケットをキャプチャーして調査することもできます。
ネットワーク上を流れる通信パケットをキャプチャーするには、Wireshark というツールを使用します。
Wiresharkは、多くのプロトコルに対応した高機能なパケット取得・プロトコル解析ソフトで、ネットワークに流れるパケット情報をリアルタイムに調査することができます。
クロスプラットフォーム対応なので、Linuxだけでなく、WindowsやMacでも同様に使用することができます。
ここでは、アマゾンで購入した中国製の小型RTSPカメラの情報を、Wiresharkを使用して調べてみます。
ほとんどのカメラが、カメラのRTSP映像を見るための専用ビューワーアプリがありますので、そのアプリをWiresharkをインストールしたPCと同じPCにインストールします。
Wiresharkと専用アプリをインストールしたら、まず最初にWiresharkを起動して、ネットワークパケットのキャプチャーを開始させます。
Wiresharkをキャプチャー実行状態にしたまま、専用アプリを起動してカメラに接続してライブビューを表示させます。
この時の専用アプリとカメラとのRTSP通信が、Wiresharkでキャプチャーされますので、一旦、Wiresharkのキャプチャーを停止させます。
次は、キャプチャーしたパケットの中からRTSPのパケットを探します。
RTSPでは”DESCRIBE”というコマンドで情報を取得しますので、Wiresharkでキャプチャーしたパケットの中から”DESCRIBE”という文字列を検索します。
“DESCRIBE”が見つかったら、その列を選択して右クリックで「追跡」-「TCPストリーム」を選択します。
これにより、RTSPのやり取りが文字列で表示され、見やすくなります。
ここで表示される「DESCRIBE」の行に記載されたRTSP URLが、カメラとの接続パスになります。
このパスをメモしておき、後程クラウドレコーダに設定します。
次の記事
この記事が気に入ったらサポートをしてみませんか?