ラズパイに、ラズパイにWebカメラ C270n HD 720Pを接続して、RTSPカメラを作ろうとしました。
以下のソースコードをコンパイルしました。
/*
dummy_usbcam_0.2.c
■環境設定を行います。
sudo apt-get update
sudo apt-get install libgstrtspserver-1.0-dev
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
■プログラムをコンパイルして実行するには、以下のコマンドを使用します:
gcc -o dummy_usbcam_0.2 dummy_usbcam_0.2.c `pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0`
./dummy_usbcam_0.2 -r rtsp://127.0.0.1:8554/custom -d /dev/video0
■また、ヘルプメッセージを表示するには、以下のコマンドを使用します:
./dummy_usbcam_0.2 -h
■稼動確認環境
(車上) 192.168.101.30
cam@cam-desktop:~/cpp/src$ ./dummy_usbcam_0.2
cam@cam-desktop:~/cpp/src$ ./abc_vtp_0.1 -i 192.168.101.10 -p 38089 -r rtsp://127.0.0.1:8554/test
(地上) 192.168.101.10
pt@pt-desktop:~/go/src$ more srt_rtsp_server_38089.sh
#!/bin/bash
gst-launch-1.0 srtsrc uri=srt://:38089 keep-listening=true ! decodebin ! autovid
eosink
*/
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
#include <stdio.h>
#include <string.h>
void print_usage(const char *prog_name) {
g_print("Usage: %s -r [RTSP_URL] -d [DEVICE]\n", prog_name);
g_print("Default RTSP_URL: rtsp://127.0.0.1:8554/test\n");
g_print("Default DEVICE: /dev/video0\n");
g_print("Example: %s -r rtsp://127.0.0.1:8554/test -d /dev/video0\n", prog_name);
}
int main(int argc, char *argv[]) {
GMainLoop *loop;
GstRTSPServer *server;
GstRTSPMountPoints *mounts;
GstRTSPMediaFactory *factory;
const char *default_url = "rtsp://127.0.0.1:8554/test";
const char *default_device = "/dev/video0";
const char *rtsp_url = default_url;
const char *device = default_device;
char path[256] = "/test";
char service[6] = "8554"; // ポート番号のデフォルト値
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "-h") == 0) {
print_usage(argv[0]);
return 0;
} else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) {
rtsp_url = argv[++i];
// RTSP URLのポート番号とパス部分を抽出
const char *url_port = strchr(rtsp_url + strlen("rtsp://"), ':');
if (url_port != NULL) {
url_port++;
const char *url_path = strchr(url_port, '/');
if (url_path != NULL) {
strncpy(path, url_path, sizeof(path) - 1);
path[sizeof(path) - 1] = '\0'; // Null terminatorを追加
int port_length = url_path - url_port;
if (port_length < sizeof(service)) {
strncpy(service, url_port, port_length);
service[port_length] = '\0'; // Null terminatorを追加
}
}
}
} else if (strcmp(argv[i], "-d") == 0 && i + 1 < argc) {
device = argv[++i];
}
}
gst_init(&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
server = gst_rtsp_server_new();
gst_rtsp_server_set_service(server, service);
mounts = gst_rtsp_server_get_mount_points(server);
factory = gst_rtsp_media_factory_new();
char launch_string[512];
snprintf(launch_string, sizeof(launch_string),
"( v4l2src device=%s ! videoconvert ! x264enc speed-preset=ultrafast tune=zerolatency ! rtph264pay pt=96 name=pay0 )",
device);
gst_rtsp_media_factory_set_launch(factory, launch_string);
gst_rtsp_mount_points_add_factory(mounts, path, factory);
g_object_unref(mounts);
gst_rtsp_server_attach(server, NULL);
g_print("Stream ready at %s with device %s\n", rtsp_url, device);
g_main_loop_run(loop);
return 0;
}
で、
$ ./dummy_usbcam_0.2
をして、
$ gst-launch-1.0 rtspsrc location=rtsp://127.0.0.1:8554/test ! decodebin ! autovideosink
で、映像を受信しようとしたのですが、動きませんでした。
-----
そもそも、"/dev/video0"が見つかりません。
Raspberry PiがWebカメラを認識できるように、必要なパッケージをインストールします。
$ sudo apt-get update
$ sudo apt-get install v4l-utils
v4l-utilsは、Video4Linux(V4L)デバイスを操作するためのツールセットです。
次に、WebカメラがRaspberry Piに認識されているかを確認します。以下のコマンドを実行して、デバイスが認識されているか確認します。
$ lsusb
このコマンドは、接続されているUSBデバイスのリストを表示します。
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270
が表示されれば、成功です。
で、あとはGStreamerでデバイスが動くことを確認しました。
$ gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink
後は念の為、GStreamerのインストールができているかを確認して下さい。
$ sudo apt-get update
$ sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
で、
$ gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink
で、ローカルにカメラ映像が表示されれば成功です。
で、この後、プログラムを起動して、リモートで、
$ gst-launch-1.0 rtspsrc location=rtsp://192.168.0.200:8554/test ! decodebin ! autovideosink
(192.168.0.200はラズパイのIPアドレスです)
で、RTSPプロトコルで転送された映像が表示されるようになりました。
以上