java上的rtsp流

2023-12-14

任何人都可以帮我提供有关如何使用 gstreamer 在 java 中实现 RTSP 流媒体服务器的教程。

链接文本


RTSP建立过程Server(代码是用 C 编写的,但请查看我的客户端代码以了解如何使用 gstreamer-java API。它应该相当简单)

我修改了URL中的代码

http://www.ip-sense.com/linuxsense/how-to-develop-a-rtsp-server-in-linux-using-gstreamer/

/* GStreamer
 * Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
 * Copyright (c) 2012 enthusiasticgeek <[email protected]>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */


//Edited by: enthusiasticgeek (c) 2012 for Stack Overflow Sept 11, 2012

//###########################################################################
//Important
//###########################################################################

//On ubuntu: sudo apt-get install libgstrtspserver-0.10-0 libgstrtspserver-0.10-dev

//Play with VLC
//rtsp://localhost:8554/test

//video decode only:  gst-launch -v rtspsrc location="rtsp://localhost:8554/test" ! rtph264depay ! ffdec_h264 ! autovideosink
//audio and video: 
//gst-launch -v rtspsrc location="rtsp://localhost:8554/test" name=demux demux. ! queue ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! autovideosink sync=false demux. ! queue ! rtppcmadepay  ! alawdec ! autoaudiosink

//###########################################################################
#include <gst/gst.h>

#include <gst/rtsp-server/rtsp-server.h>

/* define this if you want the resource to only be available when using
 * user/admin as the password */
#undef WITH_AUTH

/* this timeout is periodically run to clean up the expired sessions from the
 * pool. This needs to be run explicitly currently but might be done
 * automatically as part of the mainloop. */
static gboolean
timeout (GstRTSPServer * server, gboolean ignored)
{
  GstRTSPSessionPool *pool;

  pool = gst_rtsp_server_get_session_pool (server);
  gst_rtsp_session_pool_cleanup (pool);
  g_object_unref (pool);

  return TRUE;
}

int
main (int argc, char *argv[])
{
  GMainLoop *loop;
  GstRTSPServer *server;
  GstRTSPMediaMapping *mapping;
  GstRTSPMediaFactory *factory;
#ifdef WITH_AUTH
  GstRTSPAuth *auth;
  gchar *basic;
#endif

  gst_init (&argc, &argv);

  loop = g_main_loop_new (NULL, FALSE);

  /* create a server instance */
  server = gst_rtsp_server_new ();
  gst_rtsp_server_set_service(server,"8554"); //set the port #

  /* get the mapping for this server, every server has a default mapper object
   * that be used to map uri mount points to media factories */
  mapping = gst_rtsp_server_get_media_mapping (server);

#ifdef WITH_AUTH
  /* make a new authentication manager. it can be added to control access to all
   * the factories on the server or on individual factories. */
  auth = gst_rtsp_auth_new ();
  basic = gst_rtsp_auth_make_basic ("user", "admin");
  gst_rtsp_auth_set_basic (auth, basic);
  g_free (basic);
  /* configure in the server */
  gst_rtsp_server_set_auth (server, auth);
#endif

  /* make a media factory for a test stream. The default media factory can use
   * gst-launch syntax to create pipelines.
   * any launch line works as long as it contains elements named pay%d. Each
   * element with pay%d names will be a stream */
  factory = gst_rtsp_media_factory_new ();

  gst_rtsp_media_factory_set_launch (factory, "( "
      "videotestsrc ! video/x-raw-yuv,width=320,height=240,framerate=10/1 ! "
      "x264enc ! queue ! rtph264pay name=pay0 pt=96 ! audiotestsrc ! audio/x-raw-int,rate=8000 ! alawenc ! rtppcmapay name=pay1 pt=97 "")");

  /* attach the test factory to the /test url */
  gst_rtsp_media_mapping_add_factory (mapping, "/test", factory);

  /* don't need the ref to the mapper anymore */
  g_object_unref (mapping);

  /* attach the server to the default maincontext */
  if (gst_rtsp_server_attach (server, NULL) == 0)
    goto failed;

  /* add a timeout for the session cleanup */
  g_timeout_add_seconds (2, (GSourceFunc) timeout, server);

  /* start serving, this never stops */
  g_main_loop_run (loop);

  return 0;

  /* ERRORS */
failed:
  {
    g_print ("failed to attach the server\n");
    return -1;
  }
}

Makefile

# Copyright (c) 2012 enthusiasticgeek
# RTSP demo for Stack Overflow

sample:
    gcc -Wall -I/usr/include/gstreamer-0.10 rtsp.c -o rtsp `pkg-config --libs --cflags gstreamer-0.10 gstreamer-rtsp-0.10` -lglib-2.0 -lgstrtspserver-0.10 -lgstreamer-0.10

构建二进制文件后,只需运行它./rtsp并在终端中打开另一个选项卡以使用以下管道测试服务器。

测试了解码管道。效果很好!

gst-launch -v rtspsrc location="rtsp://localhost:8554/test" name=demux demux. ! queue ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! autovideosink sync=false demux. ! queue ! rtppcmadepay  ! alawdec ! autoaudiosink

Java代码Client

 // Display RTSP streaming of video
 // (c) 2011 enthusiasticgeek
 // This code is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
 // Leave Credits intact

package video2; //replace this with your package
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

//import org.gstreamer.Caps;
import org.gstreamer.Element;
import org.gstreamer.ElementFactory;
import org.gstreamer.Gst;
import org.gstreamer.Pad;
import org.gstreamer.PadDirection;
import org.gstreamer.Pipeline;
import org.gstreamer.swing.VideoComponent;

/**
 * A Simple videotest example.
 */
public class Main {
    public Main() {
    }
    private static Pipeline pipe;
    public static void main(String[] args) {
    // Quartz is abysmally slow at scaling video for some reason, so turn it off.
    System.setProperty("apple.awt.graphics.UseQuartz", "false");

    args = Gst.init("SwingVideoTest", args);

    pipe = new Pipeline("pipeline");
    /*
    final Element videosrc = ElementFactory.make("videotestsrc", "source");
    final Element videofilter = ElementFactory.make("capsfilter", "flt");
    videofilter.setCaps(Caps.fromString("video/x-raw-yuv, width=720, height=576"
            + ", bpp=32, depth=32, framerate=25/1"));
    */

     pipe.getBus().connect(new Bus.ERROR() {
        public void errorMessage(GstObject source, int code, String message) {
            System.out.println("Error occurred: " + message);
            Gst.quit();
        }
    });
    pipe.getBus().connect(new Bus.STATE_CHANGED() {
        public void stateChanged(GstObject source, State old, State current, State pending) {
            if (source == pipe) {
                System.out.println("Pipeline state changed from " + old + " to " + current);
            }
        }
    });
    pipe.getBus().connect(new Bus.EOS() {
        public void endOfStream(GstObject source) {
            System.out.println("Finished playing file");
            Gst.quit();
        }
    });        

     pipe.getBus().connect(new Bus.TAG() {
        public void tagsFound(GstObject source, TagList tagList) {
            for (String tag : tagList.getTagNames()) {
                System.out.println("Found tag " + tag + " = "
                        + tagList.getValue(tag, 0));
            }
        }
    });

    final Element source = ElementFactory.make("rtspsrc", "Source");
    final Element demux = ElementFactory.make("rtpmp4vdepay", "Depay");
    final Element decoder=ElementFactory.make("ffdec_mpeg4", "Decoder");
    final Element colorspace = ElementFactory.make("ffmpegcolorspace",  "Colorspace");
    //final Element sink = ElementFactory.make ("autovideosink", "Output");

    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            // Create the video component and link it in
            VideoComponent videoComponent = new VideoComponent();
            Element videosink = videoComponent.getElement();

           source.connect(new Element.PAD_ADDED() {
           public void padAdded(Element element, Pad pad) {
            pad.link(demux.getStaticPad("sink"));
           }
            });

           Pad p = new Pad(null, PadDirection.SRC);
           source.addPad(p);

            source.set("location","rtsp://<user>:<pass>@<ip>/mpeg4/1/media.amp");  //replace this with your source

            pipe.addMany(source, demux, decoder, colorspace, videosink);
            Element.linkMany(demux, decoder, colorspace, videosink);

            // Now create a JFrame to display the video output
            JFrame frame = new JFrame("Swing Video Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(videoComponent, BorderLayout.CENTER);
            videoComponent.setPreferredSize(new Dimension(720, 576));
            frame.pack();
            frame.setVisible(true);

            // Start the pipeline processing
            pipe.play();
        }
    });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java上的rtsp流 的相关文章

随机推荐

  • = 和 != 的语义

    在 XQuery 中 foo bar foo bar 产生值true 这似乎是显而易见的 但我注意到 foo bar foo bar also yields true 我觉得这很令人惊讶 我知道我可以否定 with not x y 我注意到
  • Kotlin函数参数:Val不能重新赋值

    我用 Kotlin 写了红黑树 乐趣插入修正插入新元素后恢复平衡 z Node 是新元素 树平衡算法取自here 第 2 3 页 这problem是科特林吗不允许我重新分配 z to z parent and z parent parent
  • Android:CollapsingToolbarLayout 和 SearchView,文本重叠

    我对 CollapsingToolbarLayout 标题与 SearchView 文本重叠没有什么问题 当CollapsingToolbarLayout展开时 没有问题 但是当折叠时 文本会重叠 如何修复它 我尝试了托马斯的答案 但它有一
  • 当我使用对话框显示新页面时,它只能使用一次,并且始终在页面中显示相同的内容

    你好 这是我第一次使用对话框 这是我的代码 dialog dialog autoOpen false closeOnWscape true show blind width 800 buttons close function alert
  • 将 OpenMP 与 GCC 静态链接

    给出以下文件 print cpp include
  • Fortran 输出实数

    已经声明了一个变量 真实 4 因素 然后因子 2 25 我想输出2 25 尝试过F3 2 有什么帮助吗 WRITE lu09 9315 FACTOR 9315 FORMAT F4 2 Fortran 格式F3 2会输出最多的数字 99 但任
  • 当数组中给出级别时转换对象列表

    假设我有一个数组 它告诉我标签列表和一个值 我需要将它们添加到 JSON 对象中 怎么把它改成这样呢 所以基本上我有一个数组和一个值100 arr 1 Male 应该将其转换为对象 obj 1 Male 100 你可以使用reduceRig
  • 如何将字符串添加到 string[] 数组?没有 .Add 功能

    private string ColeccionDeCortes string Path DirectoryInfo X new DirectoryInfo Path FileInfo listaDeArchivos X GetFiles
  • 在 addClassRules 中添加组

    我该如何添加groups for require from group添加到addClassRules validator addClassRules group input require from group 1 group input
  • Rails 3.1 提交带有链接的 ajax (remote: true) 表单

    在 Rails 3 1 应用程序上使用 ajax 我需要能够使用链接而不是提交按钮提交 ajax 表单 使用远程 true 我需要对链接 或表单 做什么才能使其作为 ajax 提交而不是正常的表单提交 我尝试将 onclick java 添
  • 如何彻底删除gcloud?

    我是 mac 新手 我只是删除了 gcloud 文件夹 现在 当我打开命令行窗口时 我总是会看到下一个 bash Users myuser gcloud google cloud sdk completion bash inc 没有这样的文
  • C编程:scanf中的字符[重复]

    这个问题在这里已经有答案了 scanf 字符有问题 运行程序时不要让我输入字符 当我输入整数时程序会打印 printf 并转到最后一个 else include
  • 为什么 Spark 的 Word2Vec 返回向量?

    运行Spark 的 Word2Vec 示例 我意识到它接受一个字符串数组并给出一个向量 我的问题是 它不应该返回矩阵而不是向量吗 我期望每个输入单词有一个向量 但它返回一个向量周期 或者也许它应该接受字符串 而不是字符串数组 一个单词 作为
  • 如何在 PHP 应用程序内从另一个站点呈现 javascript?

    我想做的是从 PHP 应用程序内部的网页读取特定行 这是迄今为止我的实验设置
  • ASP 中的访问控制允许来源

    我有一个 DOM 文件 它调用另一个域上的 ASP 文件 不是 NET 我该如何写Access Control Allow Origin在ASP 中 Access Control Allow Origin是 PHP 的 但我找不到 ASP
  • oracle.jdbc.OracleDatabaseException: ORA-00972: 标识符太长

    这是我的实体类 Entity public class ProjectDetails Id private int projectId private String projectDescription private int langua
  • jQuery.extend 和 jQuery.fn.extend 之间的区别?

    我试图理解 jquery 插件语法 因为我想将两个插件合并到 一 信号灯还需要能够间隔停止或运行多次 反正 这个语法与以下相同吗 jQuery fn extend everyTime function interval label fn t
  • 自定义 SSL 处理在 Android 2.2 FroYo 上停止工作

    对于我的应用程序 Transdroid 我通过 HTTP 连接到远程服务器 也可以选择通过 HTTPS 安全连接 对于与 HttpClient 的这些 HTTPS 连接 我使用自定义 SSL 套接字工厂实现来确保自签名证书正常工作 基本上
  • VBA COM 互操作问题

    我有一些来自 MSDN 的示例代码 我正在尝试对其进行修改以供使用 但 VBA 编译器拒绝尖括号的内容 lt gt 我在模块中有以下代码 Imports System Imports System Runtime InteropServic
  • java上的rtsp流

    任何人都可以帮我提供有关如何使用 gstreamer 在 java 中实现 RTSP 流媒体服务器的教程 链接文本 RTSP建立过程Server 代码是用 C 编写的 但请查看我的客户端代码以了解如何使用 gstreamer java AP