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をここに置いておく。