見出し画像

④カメラとの接続情報調査(FFmpeg)

前回の記事はこちら


はじめに

本章では、クラウドレコーダを動かすための環境構築と、RTSPカメラ/UVCカメラを調査して、FFmpeg の入力情報を取得します。

クラウドレコーダ

クラウドレコーダでは下記の処理を行います。

  1. RTSP対応カメラと接続し、映像/音声データを受信する。もしくは、PCにUSBで接続されたUVCカメラ(USB Video Classカメラ)から、映像/音声データを取得し、H.264/AACに圧縮(Encode)する

  2. 受信した映像/音声データをMPEG2-TSに多重化(Multiplex/Mux)する

  3. 指定した秒数に多重化された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に対応しており、カメラの設定画面上にその情報が表示されます。

IO-DATA QWatch カメラ情報画面
IO-DATA QWatch ビデオ情報画面

以上から、以下の情報が分かります。

  • カメラの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パケットキャプチャーの開始

Wiresharkをキャプチャー実行状態にしたまま、専用アプリを起動してカメラに接続してライブビューを表示させます。

この時の専用アプリとカメラとのRTSP通信が、Wiresharkでキャプチャーされますので、一旦、Wiresharkのキャプチャーを停止させます。

Wiresharkパケットキャプチャーの停止

次は、キャプチャーしたパケットの中からRTSPのパケットを探します。

RTSPでは”DESCRIBE”というコマンドで情報を取得しますので、Wiresharkでキャプチャーしたパケットの中から”DESCRIBE”という文字列を検索します。

Wireshark ”DESCRIBE”文字列の検索

“DESCRIBE”が見つかったら、その列を選択して右クリックで「追跡」-「TCPストリーム」を選択します。

これにより、RTSPのやり取りが文字列で表示され、見やすくなります。

Wireshark RTSP通信のみを抜き出して表示

ここで表示される「DESCRIBE」の行に記載されたRTSP URLが、カメラとの接続パスになります。

このパスをメモしておき、後程クラウドレコーダに設定します。

次の記事


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