h264_v4l2_rtspserverを認証できるようにする

h264_v4l2_rtspserverを使ってカメラモジュールの映像をH.264で圧縮してRTSPプロトコルによりストリーミング配信できることが確かめられたが、オリジナルのh264_v4l2_rtspserverでは認証のためのユーザとパスワードが指定できない。実用上は、認証があった方がいいだろう。

そこで、ソースを変更して認証ができるようにしてみた。変更するのは、srcディレクトリにあるmain.cppのみ。まず、52行目あたりにあるcreateRTSPServerという関数。

  1. RTSPServer* createRTSPServer(UsageEnvironment& env, unsigned short rtspPort, unsigned short rtspOverHTTPPort, int timeout, const std::string & user, const std::string & passwd)
  2. {
  3.  UserAuthenticationDatabase* authDB = NULL;
  4.  authDB->addUserRecord(user.c_str(), passwd.c_str());
  5.  RTSPServer* rtspServer = RTSPServerSupportingHTTPStreaming::createNew(env, rtspPort, authDB, timeout);
  6.  if (rtspServer != NULL)
  7.  {
  8.   // set http tunneling
  9.   if (rtspOverHTTPPort)
  10.   {
  11.    rtspServer->setUpTunnelingOverHTTP(rtspOverHTTPPort);
  12.   }
  13.  }
  14.  return rtspServer;
  15. }

125行目あたりに2つの変数(ユーザID/パスワード)を追加。デフォルトでpi/raspberryとした。

  1.  std::string url = "unicast";
  2.  std::string user = "pi";
  3.  std::string passwd = "raspberry";
  4.  std::string murl = "multicast";

137行目あたり。aとwの2つのコマンド行オプションを追加。

  1.  while ((c = getopt (argc, argv, "v::Q:O:" "I:P:p:m:u:a:w:M:ct:T" "rsfF:W:H:" "h")) != -1)
  2.          (中略)
  3.   case 'a': user = optarg; break;
  4.   case 'w': passwd = optarg; break;
  5.          (中略)
  6.   std::cout << "\t -a user : user id (default " << user << ")" << std::endl;
  7.   std::cout << "\t -w paswd : password (default " << passwd << ")" << std::endl;

237行目あたり。最初に変更した関数createRTSPServerに合わせて引数を追加。

  1.  // create RTSP server
  2.  RTSPServer* rtspServer = createRTSPServer(*env, rtspPort, rtspOverHTTPPort, timeout, user, passwd);
  3.  if (rtspServer == NULL)
  4.  {
  5.   LOG(ERROR) << "Failed to create RTSP server: " << env->getResultMsg();
  6.  }

最後に、もう一度ビルドしなおすだけ。

  1. $ sudo make clear
  2. $ sudo make
  3. $ sudo make install

ヘルプを表示すると次のように表示されるはず。

  1. $ sudo h264_v4l2_rtspserver -help
  2. ./h264_v4l2_rtspserver [-v[v]] [-Q queueSize] [-O file] \
  3.    [-I interface] [-P RTSP port] [-T RTSP/HTTP port] [-m multicast url] [-u unicast url] [-M multicast addr] [-c] [-t timeout] \
  4.    [-r] [-s] [-W width] [-H height] [-F fps] [device1] [device2]
  5.  -v : verbose
  6.  -vv : very verbose
  7.  -Q length: Number of frame queue (default 10)
  8.  -O output: Copy captured frame to a file or a V4L2 device
  9.  RTSP options :
  10.  -I addr : RTSP interface (default autodetect)
  11.  -P port : RTSP port (default 8554)
  12.  -T port : RTSP over HTTP port (default 0)
  13.  -u url : unicast url (default unicast)
  14.  -a user : user id (default pi)
  15.  -w paswd : password (default raspberry)
  16.  -m url : multicast url (default multicast)
  17.  -M addr : multicast group:port (default is random_address:20000)
  18.  -c : don't repeat config (default repeat config before IDR frame)
  19.  -t secs : RTCP expiration timeout (default 65)
  20.  V4L2 options :
  21.  -r : V4L2 capture using read interface (default use memory mapped buffers)
  22.  -s : V4L2 capture using live555 mainloop (default use a separated reading thread)
  23.  -f : V4L2 capture using current format (-W,-H,-F are ignored)
  24.  -W width : V4L2 capture width (default 640)
  25.  -H height: V4L2 capture height (default 480)
  26.  -F fps : V4L2 capture framerate (default 25)
  27.  device : V4L2 capture device (default /dev/video0)

例えばユーザーIDをadmin、パスワードを123456としたい場合は次のように指定すればよい。

  1. $ sudo h264_v4l2_rtspserver -F 25 -W 1280 -H 720 -P 8554 -a admin -w 123456 /dev/video0

以上、改良したmain.cppをここに置いておく。

2016年02月29日