h264_v4l2_rtspserverを使ってカメラモジュールの映像をH.264で圧縮してRTSPプロトコルによりストリーミング配信できることが確かめられたが、オリジナルのh264_v4l2_rtspserverでは認証のためのユーザとパスワードが指定できない。実用上は、認証があった方がいいだろう。
そこで、ソースを変更して認証ができるようにしてみた。変更するのは、srcディレクトリにあるmain.cppのみ。まず、52行目あたりにあるcreateRTSPServerという関数。
RTSPServer* createRTSPServer(UsageEnvironment& env, unsigned short rtspPort, unsigned short rtspOverHTTPPort, int timeout, const std::string & user, const std::string & passwd){ UserAuthenticationDatabase* authDB = NULL; authDB->addUserRecord(user.c_str(), passwd.c_str()); RTSPServer* rtspServer = RTSPServerSupportingHTTPStreaming::createNew(env, rtspPort, authDB, timeout); if (rtspServer != NULL) { // set http tunneling if (rtspOverHTTPPort) { rtspServer->setUpTunnelingOverHTTP(rtspOverHTTPPort); } } return rtspServer;}125行目あたりに2つの変数(ユーザID/パスワード)を追加。デフォルトでpi/raspberryとした。
std::string url = "unicast"; std::string user = "pi";
std::string passwd = "raspberry";
std::string murl = "multicast";
137行目あたり。aとwの2つのコマンド行オプションを追加。
while ((c = getopt (argc, argv, "v::Q:O:" "I:P:p:m:u:a:w:M:ct:T" "rsfF:W:H:" "h")) != -1) (中略) case 'a': user = optarg; break; case 'w': passwd = optarg; break; (中略) std::cout << "\t -a user : user id (default " << user << ")" << std::endl; std::cout << "\t -w paswd : password (default " << passwd << ")" << std::endl;237行目あたり。最初に変更した関数createRTSPServerに合わせて引数を追加。
// create RTSP server RTSPServer* rtspServer = createRTSPServer(*env, rtspPort, rtspOverHTTPPort, timeout, user, passwd); if (rtspServer == NULL) { LOG(ERROR) << "Failed to create RTSP server: " << env->getResultMsg(); }最後に、もう一度ビルドしなおすだけ。
$ sudo make clear$ sudo make$ sudo make installヘルプを表示すると次のように表示されるはず。
$ sudo h264_v4l2_rtspserver -help./h264_v4l2_rtspserver [-v[v]] [-Q queueSize] [-O file] \ [-I interface] [-P RTSP port] [-T RTSP/HTTP port] [-m multicast url] [-u unicast url] [-M multicast addr] [-c] [-t timeout] \ [-r] [-s] [-W width] [-H height] [-F fps] [device1] [device2] -v : verbose -vv : very verbose -Q length: Number of frame queue (default 10) -O output: Copy captured frame to a file or a V4L2 device RTSP options : -I addr : RTSP interface (default autodetect) -P port : RTSP port (default 8554) -T port : RTSP over HTTP port (default 0) -u url : unicast url (default unicast) -a user : user id (default pi) -w paswd : password (default raspberry) -m url : multicast url (default multicast) -M addr : multicast group:port (default is random_address:20000) -c : don't repeat config (default repeat config before IDR frame) -t secs : RTCP expiration timeout (default 65) V4L2 options : -r : V4L2 capture using read interface (default use memory mapped buffers) -s : V4L2 capture using live555 mainloop (default use a separated reading thread) -f : V4L2 capture using current format (-W,-H,-F are ignored) -W width : V4L2 capture width (default 640) -H height: V4L2 capture height (default 480) -F fps : V4L2 capture framerate (default 25) device : V4L2 capture device (default /dev/video0)例えばユーザーIDをadmin、パスワードを123456としたい場合は次のように指定すればよい。
$ sudo h264_v4l2_rtspserver -F 25 -W 1280 -H 720 -P 8554 -a admin -w 123456 /dev/video0以上、改良したmain.cppをここに置いておく。