DUICUO

MJPG-Streamer を Ubuntu に移植するためのステップバイステップガイド

録画されたコース「総合IoTプロジェクト実践」では、Peng先生がWebページにリアルタイムカメラ監視機能を追加し、誰もが学習できるようにビデオストリーミングサーバーの移植方法に関する記事を特別にまとめました。

I. 埋め込みビデオおよび画像オープンソースライブラリ

組み込みシステムでは、一般的に使用されるオープンソースのビデオおよび画像処理システムには、luvcview、cheese、motion、mjpg-streamer、ffmpeg などがあります。

  • luvcview: V4L2 と SDL に基づいたプログラムで、写真やビデオの録画、パラメータの調整、簡潔で実用的なコードをサポートしており、V4L2 プログラミングの学習に適しています。
  • cheese: 写真やビデオの撮影、特殊なビデオ効果をサポートする、V4L2 と GTK に基づいたプログラム。
  • motion: モーション検出および写真撮影プログラム。
  • mjpg-streamer: ウェブカメラストリーミングプログラム。

II. mjpg-streamerの紹介

MJPG-streamer は、HTTP 経由で Linux 上の互換性のあるカメラにアクセスし、リモート ビデオ伝送を実現できる優れたオープン ソース プロジェクトです。

MJPG ストリーマーは、Web カメラから画像をキャプチャし、IP ベースのネットワーク経由で Firehox、Cambozola、VLC プレーヤー、Windows モバイル デバイス、またはブラウザーを搭載したその他のモバイル デバイスなどのブラウザーにストリーミングします。

特定のウェブカメラのハードウェア圧縮機能を利用して、サーバーの CPU オーバーヘッドを削減できます。

ビデオ フレームの圧縮で多くの計算効率を無駄にすることを避けるため、組み込みデバイスや一部の通常のサーバーに軽量で CPU 負荷の少ないソリューションを提供します。

III. カメラのテスト

(1)上図のようにロジクールカメラを仮想マシンに接続します。

(2)Cheeseをダウンロードしてインストールし、カメラが正常に動作するか確認します。

 $ sudo apt - アップデートを取得
$ sudo apt - チーズインストール

このプログラムはすでに Ubuntu 16.04 に含まれています。

(3)テスト

カメラを接続すると次のデバイス ファイルが生成されます。

 ルート@ubuntu : / home / peng / work # ls / dev / video0 -l
crw - rw ----+ 1 ルートビデオ81 , 0 3月25 07:18 / dev / video0

走る:

 ルート@ubuntu : / home / peng / work #cheese 

IV. 移植

インストールの準備:

1. インストール前の準備

 sudo apt - get install libsdl1.2 - dev subversion
sudo apt - get install libjpeg62 - dev
sudo apt - imagemagick をインストールします

2. mjpeg-streamerをダウンロードする

 gitクローン https://github.com/shrkey/mjpg-streamer

git がインストールされていない場合は、次のコマンドを実行します。

 sudo apt-get でgitをインストール

3. コンパイルしてインストールする

 cd mjpg-streamer/mjpg-streamer 

 root@ubuntu:/home/peng/work/camera/mjpg-streamer # ツリー -L 1 ./
./
├── ドク
├── mjpeg-client # Linux と Windows の両方のクライアントを提供します。
├── mjpg-streamer #ディレクトリ内に提供される実行可能プログラムと各種入出力デバイスコンポーネント
├── mjpg-ストリーマー-実験的
├── mjpg-streamer.tar.gz
├── README.md
├── udp_client
└── uvc-streamer #このディレクトリは、uvc-streamer の実行可能ディレクトリを提供します。

6つのディレクトリ、 2つのファイル

P.S.: 再コンパイルする前にこれを実行する必要があります。

 作る
sudo インストール
 root@ubuntu:/home/peng/work/camera/mjpg-streamer/mjpg-streamer # インストールする
インストール--mode = 755 mjpg_streamer /usr/local/bin
インストール--mode = 644 input_uvc.so output_file.so output_udp.so output_http.so input_testpicture.so input_file.so /usr/local/lib/
インストール--mode = 755 -d /usr/local/www
インストール--mode = 644 -D www/* /usr/local/www

コンパイルされたライブラリ ファイルの機能は次のとおりです。

 (1) input_testpicture.so。これは、あらかじめ設定された画像をヘッダーファイルにコンパイルする画像テストプラグインです。カメラがなくても画像を送信できるため、プログラムのデバッグが容易になります。
(2)input_uvc.so。このファイルはUSBカメラドライバV4L2を呼び出してカメラからビデオデータを読み取ります。
(3)input_control.so。このファイルはカメラの回転を制御するインターフェースを実装しています。
(4) output_http.so。これは、単一のフォルダ内のファイルを処理できるだけでなく、特定のコマンドを実行できるフル機能のWebサーバーです。入力プラグインからの画像を処理したり、入力プラグインからのビデオファイルを既存のM-JPEG標準に準拠したHTTPビデオデータサービスストリームとして出力したりすることもできます。
(5) output_file.so。このプラグインは、プラグインに入力されたJPEG画像を特定のフォルダに保存し、画像のキャプチャに使用できます。

4. スクリプトを修正する

スクリプト ファイルを変更します。

 /home/peng/work/camera/mjpg-streamer/mjpg-streamer/start.sh 
 ./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 15000" 

 "./input_uvc.so -y" : カメラがYUVであることを指定します。デフォルトはJPEGです。私が使用しているLogitechのカメラはYUVです。
「./output_http.so -w ./www」:Webサーバーのルートディレクトリ(./www)を指定します。ブラウザ経由でカメラをテストできます。
「./output_file.so -f /www/pice -d 15000」 : 写真を保存するディレクトリ (/www/pice) を指定し、15 秒ごとに写真を保存します。

解像度を指定することもできます。

 ./mjpg_streamer -i "input_uvc.so -d /dev/video0 -n -y -r 640x480 -f 30" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 15000" 

市販のカメラの中には、YUV、MJPEG、H264 などの形式をサポートするものがありますが、mjpg-stream は MJPEG と YUV の両方の形式をサポートしています。

5. テスト

走る:

 ./start.sh

(1)ウェブページのテスト

(2)ウェブページのビデオストリームテスト

(3)写真撮影機能を実装しました。

ブラウザのアドレスバーに次のように入力します。

 http://127.0.0.1:8080/?action=スナップショット

または:

 http://127.0.0.1:8080/?action=stream

スナップショットは一度に 1 つの画像をキャプチャして Web ページに表示することを意味しますが、ストリームは連続した画像のストリームであるビデオ ストリームを意味します。

6. 補足

また、Z-Star カメラも使用しましたが、これには -y オプションは追加されていません。

 ./mjpg_streamer -i "./input_uvc.so -d /dev/video0" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 150000"

カメラによって生成されたデバイス ファイルが /dev/video0 ではない場合があります。

対応するパラメータが必要です:

 -d /dev/video1

V. コードフロー

VI. シングルショットと連続撮影をサポートします。

`mjpg_stream` の `output-file.so` は連続撮影のみ可能で、シングルショットやバーストショット機能はサポートしていないため、`output_file` のソースコードを修正する必要があります。ファイルディレクトリを変更します。

 peng@ubuntu:~/work/camera/mjpg-streamer/mjpg-streamer/plugins/output_file/output_file.c
  1. 196行目の関数void worker_thread(void arg)の本体に次のコードを追加します。
 char buf[10]; // パイプから読み取ったコマンドを格納するために使われる
int flags = 0 ; // 写真フラグ、1: 11 枚の写真を表す、2: 1 枚の写真を表す
int fd_com = 0 ; // パイプのファイル記述子を開く
int stop_num = 0 ; // 写真の枚数
if (access( "/tmp/webcom" , F_OK) < 0 ) // 写真キャプチャコマンドを受信するための名前付きパイプを作成する
{
mkfifo( "/tmp/webcom" ,0666 ) < 0 の場合
{
printf( "写真FIFOの作成に失敗しました\n" );
}
}
fd_com =オープン ( "/tmp/webcom" 、O_RDONLY、0666);
(fd_com < 0 ) の場合
{
perror ( "ファイルwebcomエラーを開く" );
}
  1. 229 行目の `while( ok >= 0 && !pglobal->stop){` の後に次のコードを追加します。
 if (フラグ== 0 )
{
一方(1)
{
読み取り(fd_com、バッファ、バッファのサイズ(バッファ))。
if (strncmp(buf, "danger" , 6) == 0 ) // 11枚の写真を撮る
{
フラグ= 1 ;
bzero(バッファ、sizeof(バッファ));
壊す
}
if (strncmp(buf, "one" , 3) == 0 ) // 写真を1枚撮る
{
フラグ= 2 ;
bzero(バッファ、sizeof(バッファ));
壊す
}
}
}
  1. 355行目。
 355 /* 指定されている場合はすぐに待機します */
356 if (遅延 > 0 ) {
357スリープ(1000 * 遅延);
358 }

後から追加:

停止番号+ + ;
if (flags == 1 ) // 撮影した写真枚数を決定する
{
(停止番号 > 9の場合
{
停止番号= 0 ;
フラグ= 0 ;
}
}
そうでない場合( flags == 2 )
{
停止番号= 0 ;
フラグ= 0 ;
}