工具与软件:
是否能够在 TDA4VM 和 TDA4VE 上安装 gst-rtsp-server 库? 例如:
apt-get install libgstrtspserver-1.0-dev gstreamer1.0-rtsp
或者应该从源代码安装 gst-rtsp-server 库?
我们在 TDA4VM 和 TDA4VE 上使用 SDK 8.5。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好、Joy Yang、
gst-rtsp-server 库应已包含在 SDK 中。 下面是一种测试 RTSP 功能的简单方法: [常见问题解答] SK-AM69:如何使用 RTSP 源运行 GStreamer 流水线-处理器论坛-处理器- TI E2E 支持论坛
谢谢!
Fabiana
尊敬的 Fabiana:
我想使用 TDA4作为 GStreamer RTSP 服务器(而不是 RTSP 客户端)。
以下是启动 GStreamer RTSP 服务器的示例代码:
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
#define SERVER_HOST "0.0.0.0"
#define SERVER_PORT "8554"
#define SERVER_MAX_CONNECTIONS 10
#define VIDEO_PATH "video.mp4"
// 當 VLC 切換播放狀態時,處理 timestamp 凍結與恢復
static void media_new_state(GstRTSPMedia *media, gint state, gpointer user_data) {
GstElement *pipeline = gst_rtsp_media_get_element(media);
if (state == GST_STATE_PAUSED) {
g_print("Media paused. Freezing timestamp.\n");
gst_element_set_start_time(pipeline, GST_CLOCK_TIME_NONE);
} else if (state == GST_STATE_PLAYING) {
g_print("Media playing. Resuming timestamp.\n");
gst_element_set_base_time(pipeline, gst_element_get_base_time(pipeline));
}
}
// 當媒體初始化時,設定 clock 和 pipeline
static void media_configure(GstRTSPMediaFactory *factory, GstRTSPMedia *media, gpointer user_data) {
GstElement *pipeline = gst_rtsp_media_get_element(media);
GstClock *clock = gst_element_get_clock(pipeline);
if (clock) {
GstClockTime base_time = gst_clock_get_time(clock);
g_print("Media configured. Pipeline clock time: %lu\n", base_time);
// 確保 pipeline 使用相同 clock,避免 VLC 重新計算 timestamp
gst_rtsp_media_set_clock(media, clock);
}
// 監聽媒體狀態變更 (播放、暫停、停止)
g_signal_connect(media, "new-state", G_CALLBACK(media_new_state), NULL);
}
int main(int argc, char *argv[]) {
GMainLoop *loop;
GstRTSPServer *server;
GstRTSPMountPoints *mounts;
GstRTSPMediaFactory *factory;
gst_init(&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
// 建立 RTSP 伺服器
server = gst_rtsp_server_new();
gst_rtsp_server_set_address(server, SERVER_HOST); // 讓 RTSP 伺服器監聽所有網路介面
gst_rtsp_server_set_service(server, SERVER_PORT); // 設定 Port
gst_rtsp_server_set_backlog(server, SERVER_MAX_CONNECTIONS); // 設定最大連線數
// 設定 mount point
mounts = gst_rtsp_server_get_mount_points(server);
factory = gst_rtsp_media_factory_new();
// 設定 GStreamer pipeline
gst_rtsp_media_factory_set_launch(factory,
"( filesrc location=" VIDEO_PATH " ! decodebin ! videoconvert ! "
"x264enc tune=zerolatency bitrate=2000 key-int-max=10 speed-preset=superfast ! "
"rtph264pay name=pay0 pt=96 )");
// 設定媒體配置回呼
g_signal_connect(factory, "media-configure", G_CALLBACK(media_configure), NULL);
// 掛載 stream
gst_rtsp_mount_points_add_factory(mounts, "/stream", factory);
g_object_unref(mounts);
// 啟動 RTSP 伺服器
if (gst_rtsp_server_attach(server, NULL) == 0) {
g_printerr("Failed to attach the RTSP server\n");
return -1;
}
g_print("RTSP server is running at rtsp://%s:%s/stream\n", SERVER_HOST, SERVER_PORT);
g_main_loop_run(loop);
return 0;
}
它将通过以下方式构建:
gcc gst_rtsp_server.c -o gst_rtsp_server \
-I/usr/include/gstreamer-1.0 \
-I/usr/include/glib-2.0 \
-I/usr/lib/glib-2.0/include \
-L/usr/lib \
-lgstreamer-1.0 \
-lgstrtspserver-1.0
默认情况下、这2个库(libgstreamer-1.0和 libgstrtspserver-1.0)可在/usr/lib 上找到:
root@j721s2-evm:~/gst-rtsp-server# find /usr -name libgstreamer* /usr/lib/libgstreamer-1.0.so.0.1603.0 /usr/lib/libgstreamer-1.0.so /usr/lib/libgstreamer-1.0.so.0
root@j721s2-evm:~/gst-rtsp-server# find /usr -name libgstrtspserver* /usr/lib/libgstrtspserver-1.0.so.0.1603.0 /usr/lib/libgstrtspserver-1.0.so.0
使用 opkg list-installed 命令可以找到这两个软件包:
gstreamer1.0 - 1.16.3-r0.0 gstreamer1.0-rtsp-server - 1.16.3-r0.0
但在基于 TDA4构建时发现错误:
gst_rtsp_server.c:2:10: fatal error: gst/rtsp-server/rtsp-server.h: No such file or directory
2 | #include <gst/rtsp-server/rtsp-server.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
/usr/include/gstreamer-1.0/gst/gst.h (已找到)
/usr/include/gstreamer-1.0/gst/rtsp-server/rtsp-server.h (未找到)
为什么没有 gst/rtsp-server/目录?
谢谢!
乐在其中
cp -r ./include/rtsp-server/ /usr/include/gstreamer-1.0/gst/
ln -s /usr/lib/libgstrtspserver-1.0.so.0 /usr/lib/libgstrtspserver-1.0.so
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
#define SERVER_HOST "0.0.0.0"
#define SERVER_PORT "8554"
#define SERVER_MAX_CONNECTIONS 10
#define VIDEO_PATH "video.mp4"
// 當 VLC 切換播放狀態時,處理 timestamp 凍結與恢復
static void media_new_state(GstRTSPMedia *media, gint state, gpointer user_data) {
GstElement *pipeline = gst_rtsp_media_get_element(media);
if (state == GST_STATE_PAUSED) {
g_print("Media paused. Freezing timestamp.\n");
gst_element_set_start_time(pipeline, GST_CLOCK_TIME_NONE);
} else if (state == GST_STATE_PLAYING) {
g_print("Media playing. Resuming timestamp.\n");
gst_element_set_base_time(pipeline, gst_element_get_base_time(pipeline));
}
}
// 當媒體初始化時,設定 clock 和 pipeline
static void media_configure(GstRTSPMediaFactory *factory, GstRTSPMedia *media, gpointer user_data) {
GstElement *pipeline = gst_rtsp_media_get_element(media);
GstClock *clock = gst_element_get_clock(pipeline);
if (clock) {
GstClockTime base_time = gst_clock_get_time(clock);
g_print("Media configured. Pipeline clock time: %lu\n", base_time);
// 確保 pipeline 使用相同 clock,避免 VLC 重新計算 timestamp
gst_rtsp_media_set_clock(media, clock);
}
// 監聽媒體狀態變更 (播放、暫停、停止)
g_signal_connect(media, "new-state", G_CALLBACK(media_new_state), NULL);
}
int main(int argc, char *argv[]) {
GMainLoop *loop;
GstRTSPServer *server;
GstRTSPMountPoints *mounts;
GstRTSPMediaFactory *factory;
gst_init(&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
// 建立 RTSP 伺服器
server = gst_rtsp_server_new();
gst_rtsp_server_set_address(server, SERVER_HOST); // 讓 RTSP 伺服器監聽所有網路介面
gst_rtsp_server_set_service(server, SERVER_PORT); // 設定 Port
gst_rtsp_server_set_backlog(server, SERVER_MAX_CONNECTIONS); // 設定最大連線數
// 設定 mount point
mounts = gst_rtsp_server_get_mount_points(server);
factory = gst_rtsp_media_factory_new();
// 設定 GStreamer pipeline
gst_rtsp_media_factory_set_launch(factory,
"( filesrc location=" VIDEO_PATH " ! qtdemux ! h264parse ! "
"queue max-size-buffers=512 max-size-time=0 max-size-bytes=0 ! "
"v4l2h264dec ! videoconvert ! "
"v4l2h264enc bitrate=2000000 gop-size=30 i-period=30 ! "
"queue max-size-buffers=512 max-size-time=0 max-size-bytes=0 ! "
"rtph264pay name=pay0 pt=96 config-interval=1 )");
// 設定媒體配置回呼
g_signal_connect(factory, "media-configure", G_CALLBACK(media_configure), NULL);
// 掛載 stream
gst_rtsp_mount_points_add_factory(mounts, "/stream", factory);
g_object_unref(mounts);
// 啟動 RTSP 伺服器
if (gst_rtsp_server_attach(server, NULL) == 0) {
g_printerr("Failed to attach the RTSP server\n");
return -1;
}
g_print("RTSP server is running at rtsp://%s:%s/stream\n", SERVER_HOST, SERVER_PORT);
g_main_loop_run(loop);
return 0;
}
gcc gst_rtsp_server.c -o gst_rtsp_server \
-I/usr/include/gstreamer-1.0 \
-I/usr/include/glib-2.0 \
-I/usr/lib/glib-2.0/include \
-L/usr/lib \
-lgstreamer-1.0 \
-lgstrtspserver-1.0 \
-lgobject-2.0 \
-lglib-2.0GST_DEBUG=3 ./gst_rtsp_server_tda4
rtsp://<rtsp_server_ip>:8554/stream