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.

[参考译文] TDA4VM:是否能够在 TDA4VM 和 TDA4VE 上安装 gst-rtsp-server 库?

Guru**** 2468560 points
Other Parts Discussed in Thread: TDA4VM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1469894/tda4vm-is-it-able-to-install-gst-rtsp-server-libraries-on-tda4vm-and-tda4ve

器件型号:TDA4VM

工具与软件:

是否能够在 TDA4VM 和 TDA4VE 上安装 gst-rtsp-server 库? 例如:

apt-get install libgstrtspserver-1.0-dev gstreamer1.0-rtsp

或者应该从源代码安装 gst-rtsp-server 库?

我们在 TDA4VM 和 TDA4VE 上使用 SDK 8.5。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、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/目录?

    谢谢!
    乐在其中

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新了解决方案:
    (TDA4VE SDK8.5缺少文件?)
    由于没有 rtsp-server 头文件、因此将头文件从 GitHub Gstreamer/gst-rtsp-server (地址为1.16 到)复制到/usr/include/gstreamer-1.0/gst/rtsp-server
    cp -r ./include/rtsp-server/ /usr/include/gstreamer-1.0/gst/

    (TDA4VE SDK8.5缺少文件?)
    由于没有软链接 gstrtspserver-1.0.so、因此软链接 libgstrtspserver-1.0.so.0到 libgstrtspserver-1.0.so
    ln -s /usr/lib/libgstrtspserver-1.0.so.0 /usr/lib/libgstrtspserver-1.0.so
    重写 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 " ! 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;
    }
    

     
     
    构建 GStreamer RTSP 服务器示例代码(需要 GObject-2.0和 glib-2.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.0
    使用调试日志运行程序:
    GST_DEBUG=3 ./gst_rtsp_server_tda4
    然后在 Windows10上以客户端身份打开 VLC 媒体播放器、使用以下 URL:
    rtsp://<rtsp_server_ip>:8554/stream