精华内容
下载资源
问答
  • UDP组播服务器

    千次阅读 2018-08-19 18:27:29
    因为项目需要组播发送TS流,所以自己写了一个组播服务器组播传输:数据发送者(源数据)将同一数据发送到多个接受者(组播组成员)。无论有多少个接受者,在整个网络链路上,只有一份该数据(在特殊场合,可以节省...

    因为项目需要组播发送TS流,所以自己写了一个组播服务器。

    组播传输:数据发送者(源数据)将同一数据发送到多个接受者(组播组成员)。无论有多少个接受者,在整个网络链路上,只有一份该数据(在特殊场合,可以节省带宽,减少主干网络阻塞)。

    组播报文的目的地址使用的是D类IP地址(224.0.0.0到239.255.255.255)。

    使用组播时,注意参数,生命周期(TTL,Time to live)的设置。

    UDP组播的基本步骤:
    1.创建udp socket
    2.bind
    3.加入组播组
    4.发送/接收数据
    5.close

    代码:
    1.创建udp socket

    //调用:createSocket(SOCK_DGRAM)
    int createSocket(int type) {
      // Call "socket()" to create a (IPv4) socket of the specified type.
      // But also set it to have the 'close on exec' property (if we can)
      int sock;
    
    #ifdef SOCK_CLOEXEC
      sock = socket(AF_INET, type|SOCK_CLOEXEC, 0);
      if (sock != -1 || errno != EINVAL) return sock;
      // An "errno" of EINVAL likely means that the system wasn't happy with the SOCK_CLOEXEC; fall through and try again without it:
    #endif
    
      sock = socket(AF_INET, type, 0);
    #ifdef FD_CLOEXEC
      if (sock != -1) fcntl(sock, F_SETFD, FD_CLOEXEC);
    #endif
    
    #ifdef SO_REUSEPORT
      if (setsockopt(sock , SOL_SOCKET, SO_REUSEPORT,
             (const char*)&reuseFlag, sizeof reuseFlag) < 0) {
        socketErr(env, "setsockopt(SO_REUSEPORT) error: ");
        closeSocket(sock );
        return -1;
      }
    #endif
      return sock;
    }

    2.bind

    int newSocket = createSocket(SOCK_DGRAM) ;
    struct sockaddr_in  m_localAddr;
    m_localAddr.sin_family = AF_INET;
    m_localAddr.sin_addr.s_addr = INADDR_ANY;
    m_localAddr.sin_port = htons(6666);
    if (bind(newSocket, (struct sockaddr*)&m_localAddr, sizeof m_localAddr) != 0)
    {
        printf("bind error!\n");
        close(newSocket) ;
        return -1;
    }
    
    /*
    // Set the sending interface for multicasts, if it's not the default:
    //m_localAddr.sin_addr.s_addr ==>SendingInterfaceAddr 
      if (SendingInterfaceAddr != INADDR_ANY) {
        struct in_addr addr;
        addr.s_addr = SendingInterfaceAddr;
    
        if (setsockopt(newSocket, IPPROTO_IP, IP_MULTICAST_IF,
               (const char*)&addr, sizeof addr) < 0) {
          socketErr(env, "error setting outgoing multicast interface: ");
          closeSocket(newSocket);
          return -1;
        }
      }
    */

    3.加入组播组

    bool socketJoinGroup(int socket,char *groupAddress){
    
        //if (!IsMulticastAddress(groupAddress)) return True;
        struct ip_mreq imr;
        imr.imr_multiaddr.s_addr = inet_addr(groupAddress);
        imr.imr_interface.s_addr = htonl(INADDR_ANY);
        if (setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
            (const char*)&imr, sizeof (struct ip_mreq)) < 0) {
            return False;
        }
        return True;
    }

    4.发送

    char buf[1024] ;
    struct sockaddr_in groupAddr ;
    if (sendto(sockfd, buf, strlen (buf), 0, (struct sockaddr *) &groupAddr , sizeof ( groupAddr )) < 0)
    {
    .....
    }

    5.close

    close(sockfd)

    注意结构:

     struct ip_mreq
        {
            struct in_addr imr_multiaddr;   // 组播组的IP地址。
            struct in_addr imr_interface;   // 本地某一网络设备接口的IP地址。
        };
    展开全文
  • VLC配置组播、单播服务器

    热门讨论 2012-02-28 16:36:23
    本文档为适用VLC软件搭建组播、单播服务器,内有图文解释。
  • internet组播服务器源代码!!!!!!!!!!!!
  • udp组播客户端和服务器端代码
  • UDP组播通信服务器及客户端程序。基于Windows的API,在vs2005下开发。代码是开发项目模块的示例程序。具有一定的参考价值。
  • VLC组播服务器

    2011-11-18 17:32:19
    测试组播协议的一个软件。使用起来比较简单,安装也较为快捷。
  • 利用VLC实现组播服务器

    千次阅读 2019-11-24 17:56:41
    VLC介绍 VLC 是一款自由、开源的跨平台多媒体...下面就使用VLC来搭建多服务器,实现局域网内视频的广播效果。包括服务器端和客户端。 VLC官方下载地址:https://www.videolan.org/,本次使用的版本为vlc-3.0....

    VLC介绍

    VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议(UDP/RTP/RTSP等)。它不仅仅是播放器,还可以是流服务器

    下面就使用VLC来搭建多播流服务器,实现局域网内视频的广播效果。包括服务器端和客户端。

    VLC官方下载地址:https://www.videolan.org/,本次使用的版本为vlc-3.0.8-win32.exe,下载完成后,直接安装即可,不需要任何设置。

    设置流服务器

    1. 双击打开vlc
    2. 媒体->流
      在这里插入图片描述
    3. 添加视频文件,这里是PM4格式
    4. 设置文件选项为串流(S)
      在这里插入图片描述
    5. 为了服务端也能播放视频,需要勾选“在本地显示”,这里我使用传统的UDP协议
      在这里插入图片描述
    6. 设置转码后的流传输信息,包括组播地址(239.2.1.1)和端口(1234)
      在这里插入图片描述
    7. 我们这里去勾选“激活转码”功能,并将配置文件设置为"H.264 + MP3"(TS)形式。
      在这里插入图片描述
    8. 设置其他串流选项
      在这里插入图片描述
      串流选项设置,这里可作为命令行参数之一:
    :sout=#duplicate{dst=udp{mux=ts,dst=239.2.1.1:1234},dst=display} :no-sout-all :sout-keep
    

    到这里,组播流服务器就设置完成了,下面设置客户端信息,用于接收服务端视频画面。

    设置客户端

    在另外一台电脑也安装VLC播放器,或者在手机上安装VLC移动端版本;这里显示的是window端的vlc,移动端设置参数也是一样的。

    1. 打开网络串流
      在这里插入图片描述
    2. 设置网络URL信息
      在这里插入图片描述

    这样就完成了服务端和客户端的设置,可以实现局域网内实现视频广播效果。

    命令行设置服务器和客户端

    VLC不仅支持界面方式设置,也支持命令行方式,下面给出服务端和客户端的命令行设置。

    设置流服务端:

    vlc.exe -vvv file_path :sout=#duplicate{dst=std{access=udp,mux=ts,dst=239.2.1.1:1234},dst=display} 
    

    设置客户端:

    vlc.exe udp://@239.2.1.1:1234
    

    运行效果:
    在这里插入图片描述

    大家可以根据这个指南动手尝试吧~

    展开全文
  • VLC搭建组播服务器

    千次阅读 2017-01-10 16:49:34
    搭建组播服务器  第一步:运行程序后选择“媒体--串流”; 第二步:通过“添加”选择需要播放的文件(以wmv文件为例),单击“串流”; 第三步:流输出有三项需要设置:来源、目标和选项。来源刚才已指定...

    搭建组播服务器 

    第一步:运行程序后选择“媒体--串流”;

    第二步:通过“添加”选择需要播放的文件(以wmv文件为例),单击“串流”;

    第三步:流输出有三项需要设置:来源、目标和选项。来源刚才已指定,点击“下一个”;

    第四步:勾选“在本地显示”,选择“RTP/ MPEG Transport Stream”输出,单击“添加”;

    第五步:如果建立IPv6组播服务器,可以输入组播地址ff15::1,指定端口号“5004”,单击右下角的“下一个”。如果需要建立IPv4组播服务器,则地址栏可输入“239.1.1.1”(239.0.0.0/8为本地管理组播地址);

    第六步:将TTL设置为10,点击左下角“串流”即可发送组播视频,同时在本地播放(视频打开时间较慢,需要等待半分钟左右);

    第七步:使用WireShark抓包查看。

    搭建组播客户端 

    第一步:运行程序后选择“媒体--打开网络串流”;

    第二步:输入URL(rtp://@[ff15::1]:5004),单击“播放”就可以观看组播视频,如果为IPv4组播环境,可输入rtp://239.1.1.1:5004。

    注:测试前请关闭PC防火墙,以免影响组播报文的发送和接收。

    =======================================

    以上技术可以用于模拟“IP高清摄像头传输数据过程 ”。



    http://blog.csdn.NET/wangjiannuaa/article/details/6461316

    展开全文
  • 最近,在写一个项目需要用到VLC搭建组播服务器作为视频源,我这里使用了UDP协议。UDP协议主要作用是将网络数据流量压缩成数据报的形式,一个典型的数据报就是一个二进制的传输单位。每一个数据报的前8个字节用来...

                          最近,在写一个项目需要用到VLC搭建组播流服务器作为视频源,我这里使用了UDP协议。UDP协议主要作用是将网络数据流量压缩成数据报的形式,一个典型的数据报就是一个二进制的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。总体来说:UDP任然不失为一项非常实用和可行的网络传输协议。

                 搭建VLC服务器的流程:

                 1.打开VLC;

                 2.点击右上角"媒体",在下拉列表中选择"流(s)"

                     

                 

                 3.打开后,点击"添加",选择要播放的视频资源。我这里是《摆渡人》;

                     

                 

                 4.选择好视频源后,点击"串流"选项;

                     

               

                 5.查看视频路径,以及文件类型,然后点击"下一个"

                                

                

                   6.勾选"在本地显示",选择"文件"下拉框,选择协议模式,我这里是UDP协议;

                       

                   7.点击"添加",选择目标播放路径(这里的路径我研究了好久,其实有两种地址:1.播放客户端的IP地址; 2.IP组播地址,IP组播地址是一个D类IP地址,范围从224.0.0.0~239.255.255.255 其中还有很多是为特殊地质保留的。而224.0.0.0~224.0.0.255的地址最好不要用,因为他们大多数是为了特殊目的保存的)。点击"下一步".

                       

                       

                   8.将"激活转码"去掉,点击"下一个"

                       

                   9.  点击"",即可进行播放。

                        

                  

                 这是VLC的本地播放的视频效果:

                        

                          

                 客户端代码(使用维他命的播放框架):

                  

    public class PlayAcyVertical extends Activity implements
    		OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener,
    		TextureView.SurfaceTextureListener {
    	private static final String TAG = PlayAcyVertical.class.getSimpleName();
    	private TextureView mTextureView;
    	private String path = "udp://@239.255.255.255:1234";
    	private Surface surf;
    	private boolean mIsVideoSizeKnown = false;
    	private boolean mIsVideoReadyToBePlayed = false;
    	SurfaceTexture surfaceTexture;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		if (!LibsChecker.checkVitamioLibs(this))
    			return;
    		setContentView(R.layout.acy_play_v);
    		InitPlayer();
    	}
    
    	public void InitPlayer() {
    		mTextureView = (TextureView) findViewById(R.id.surface);
    		mTextureView.setSurfaceTextureListener(this);
    		mTextureView.setFocusable(true);
    		mTextureView.setOnFocusChangeListener(new OnFocusChangeListener() {
    
    			@Override
    			public void onFocusChange(View v, boolean hasFocus) {
    				if (hasFocus == true) {// 如果获得到焦点
    					Toast.makeText(getApplicationContext(), "获取到焦点", 0).show();
    				} else {
    					Toast.makeText(getApplicationContext(), "没有获取到焦点", 0)
    							.show();
    				}
    			}
    		});
    	}
    
    	private void playVideo() {
    		doCleanUp();
    		try {
    			mMediaPlayer = new MediaPlayer(this, true);
    			mMediaPlayer.setDataSource(path);
    			if (surf == null) {
    				surf = new Surface(surfaceTexture);
    			}
    			Toast.makeText(getApplicationContext(), "surf=" + surf, 0).show();
    			mMediaPlayer.setSurface(surf);
    			mMediaPlayer.prepareAsync();
    			mMediaPlayer.setTimedTextShown(true);
    			mMediaPlayer.setOnBufferingUpdateListener(this);// 设置缓冲监听
    			mMediaPlayer.setOnCompletionListener(this);// 设置播放完毕监听
    			mMediaPlayer.setOnPreparedListener(this);// 设置准备完毕监听
    			mMediaPlayer.setBufferSize(512 * 1024);
    			mMediaPlayer.setVideoQuality(MediaPlayer.VIDEOQUALITY_MEDIUM);
    			setVolumeControlStream(AudioManager.STREAM_MUSIC);
    			mMediaPlayer.start();
    		} catch (Exception e) {
    			Toast.makeText(getApplicationContext(), e.getMessage(), 0).show();
    		}
    	}
    
    	private void doCleanUp() {
    		mIsVideoReadyToBePlayed = false;
    		mIsVideoSizeKnown = false;
    	}
    
    	@Override
    	public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
    			int height) {
    		surfaceTexture = surface;
    		playVideo();
    
    	}
    
    	@Override
    	public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
    
    		return false;
    	}
    
    	@Override
    	public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,
    			int arg2) {
    
    	}
    
    	@Override
    	public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
    
    	}
    
    	@Override
    	public void onPrepared(MediaPlayer mp) {
    		mIsVideoReadyToBePlayed = true;
    		if (mIsVideoReadyToBePlayed) {
    			startVideoPlayback();
    		}
    	}
    
    	@Override
    	public void onCompletion(MediaPlayer mp) {
    
    	}
    
    	@Override
    	public void onBufferingUpdate(MediaPlayer mp, int percent) {
    
    	}
    
    	private void startVideoPlayback() {
    		Log.v(TAG, "startVideoPlayback");
    		adjustAspectRatio(mMediaPlayer.getVideoWidth(),
    				mMediaPlayer.getVideoHeight());
    		mMediaPlayer.start();
    	}
    
    	public void adjustAspectRatio(int videoWidth, int videoHeight) {
    		int viewWidth = mTextureView.getWidth();
    		int viewHeight = mTextureView.getHeight();
    		double aspectRatio = (double) videoHeight / videoWidth;
    
    		int newWidth, newHeight;
    		if (viewHeight > (int) (viewWidth * aspectRatio)) {
    			// limited by narrow width; restrict height
    			newWidth = viewWidth;
    			newHeight = (int) (viewWidth * aspectRatio);
    		} else {
    			// limited by short height; restrict width
    			newWidth = (int) (viewHeight / aspectRatio);
    			newHeight = viewHeight;
    		}
    		int xoff = (viewWidth - newWidth) / 2;
    		int yoff = (viewHeight - newHeight) / 2;
    
    		Matrix txform = new Matrix();
    		mTextureView.getTransform(txform);
    		txform.setScale((float) newWidth / viewWidth, (float) newHeight
    				/ viewHeight);
    		// txform.postRotate(10); // just for fun
    		txform.postTranslate(xoff, yoff);
    		mTextureView.setTransform(txform);
    	}
    
    	@Override
    	protected void onDestroy() {
    		// TODO Auto-generated method stub
    		super.onDestroy();
    		releaseMediaPlayer();
    		doCleanUp();
    	}
    
    	private void releaseMediaPlayer() {
    		if (mMediaPlayer != null) {
    			mMediaPlayer.release();
    			mMediaPlayer = null;
    		}
    	}
    
    	@Override
    	protected void onPause() {
    		// TODO Auto-generated method stub
    		super.onPause();
    		releaseMediaPlayer();
    		doCleanUp();
    	}
    
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		int id = item.getItemId();
    		if (id == R.id.action_settings) {
    			return true;
    		}
    
    		return super.onOptionsItemSelected(item);
    	}
    
    }

           

                acy_paly_v.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/rel_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <TextureView
            android:id="@+id/surface"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true" />
    
    </RelativeLayout>

              这就是VLC搭建组播流的基本播放流程。主要代码已经提供了,有什么问题欢迎大家一起交流。






    展开全文
  • linux环境中,在通信双方互相不知对方IP的情况下,使用组播传输来获取对方IP。主要内容有如何获取本机IP地址和主机名以及组播传输两方面内容。
  • 在linux下实现UDP组播聊天室,是聊天室的服务器端,作用是存储与转发
  • 1 UDP局域网服务器 A 读出每一个客户端发送过来的数据包,然后fork出子进程,由子进程去处理客户端请求。 B 客户端与服务器段交换多个数据报,服务器为每一个客户端连接创建新的socket,在其上bind一个临时端口,...
  • Linux下组播源码,含客户端和服务器 接收端 zb_recv.c 发送端 zb_recv.c
  • 这次分享的是组播服务器代码。 主要流程:创建套接字-》绑定服务器端口-》开放服务器广播权限-》创建广播地址段的客户端-》开始在这个网段广播 客户端只要加入这个对应端口和网段就可以收到组播的内容了 #include ...
  • c#无服务器 基于udp聊天工具 能实现局域网聊天
  • vlc搭建组播服务器 vlc

    千次阅读 2014-02-18 15:09:19
    搭建组播服务器  第一步:运行程序后选择“媒体--串流”; 第二步:通过“添加”选择需要播放的文件(以wmv文件为例),单击“串流”; 第三步:流输出有三项需要设置:来源、目标和选项。来源刚才已指定...
  • 用VLC软件来搭建模拟组播流网络中的组播环境是否可用,一般验证测试二层,三层组播的网络环境,组播流是否可达。
  • 创建组播时: struct in_addr dest; dest.s_addr = chooseRandomIPv4SSMAddress(env); const Port rtpPortVideo(videoRTPPortNum);  const Port rtcpPortVideo(videoRTPPortNum+1);  rtpGroupsockVideo = n
  • 利用VLC搭建组播服务器

    千次阅读 2019-06-11 20:28:17
    另外需要在服务器PC1设置访问输出接口,即10.10.10.13,让组播流从这个接口流出。依次点击工具->首选项->全部:     Server端 1. 点击 “媒体->串流->文件->添加” 添加一个视频文件作为视频源 ...
  •  还是前两天帮“猪小妹”考虑毕业设计的时候,想了想vlc能不能作为vod的服务器,替代上一篇博客里面的live555 media server,因为live555 media server做的确实不是太好。查了些资料,在vlc群里面乱问了一通,终于...
  • 组播包测试工具

    2018-04-17 13:11:38
    组播传输测试软件,服务器客户端一体的.组播传输测试软件,服务器客户端一体的.组播传输测试软件,服务器客户端一体的.组播传输测试软件,服务器客户端一体的.组播传输测试软件,服务器客户端一体的.组播传输测试软件,...
  • 建立darwin组播方式的流媒体服务器

    千次阅读 2012-11-26 19:09:09
    在redhat9.0系统上建立darwin流媒体服务器(组播)的步骤: 1. 从苹果公司站点下载Darwin: (需注册) http://developer.apple.com/opensource/server/streaming/ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,055
精华内容 38,822
关键字:

服务器组播