dss如何搭建rtsp服务器
① 如何实现最小的RTSP服务器
RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话。
首先创建RTSP服务器(具体实现类是DynamicRTSPServer),在创建过程中,先建立Socket(ourSocket)在TCP的554 端口进行监听,然后把连接处理函数句柄(RTSPServer::incomingConnectionHandler)和socket句柄传给任务调度器(taskScheler)。
任务调度器把socket句柄放入后面select调用中用到的socket句柄集(fReadSet)中,同时将socket句柄和 incomingConnectionHandler句柄关联起来。 接着,主程序开始进入任务调度器的主循环(doEventLoop),在主循环中调用系统函数select阻塞,等待网络连接。
当RTSP客户端输入( rtsp://192.168.0.1/1.mpg)连接服务器时,select返回对应的scoket,进而根据前面保存的对应关系,可找到对应处理函数句柄,这里就是前面提到的incomingConnectionHandler了。在 incomingConnectionHandler中创建了RTSPClientSession,开始对这个客户端的会话进行处理。
② 如何用vlc搭建rtsp服务器
打开“媒体——流”选项
点击“添加”按钮选择流媒体文件,然后点击“串流”按钮
点击“下一个”后,在“目标设置”界面选择“RTSP”,然后点击添加 + 按钮
填上目标ip地址,并在“转码选项”中选择相应的编码类型(这个视情况而定),目标IP地址就是PC机器本机的IP地址
客户端, 点击“媒体——打开网络串流”,在弹出的框中输入“rtsp://192.168.1.2:1234/tcp1”,点击“播放”按钮即可。
③ live555中是怎样创建rtsp服务器的
可以保存下来的 你发的这个网址本身就是一个音乐的链接地址
直接在迅雷中 新建—普通/emule任务 然后把你的这个网址放进去就可以下载的
很简单的
④ 如何使用easydarwin搭建代理流媒体服务器
(1)
http://dss.macosforge.org/downloads/DarwinStreamingSrvr5.5.5-Windows.exe
下载后解压,直接点击文件Install.bat,安装到 C:\ProgramFiles\Darwin Streaming Server
(2)
安装 Perl 解释器,从 http://www.perl.org/get.html 选择
Strawberry Perl
ActiveStatePerl
选择ActivePerlW下载,我的系统是32位,在这里选择32位的下载,然后安装 ,默认即可。
装好后在 cmd 下面使用:
c:\document and settings> cd C:\ProgramFiles\Darwin Streaming Server
# 根据提示创建 WebAdmin 的账号和密码
C:\Program Files\Darwin Streaming Server> perl WinPasswdAssistant.pl
# 运行 WebAdmin 管理器
C:\Program Files\Darwin Streaming Server> perl streamingadminserver.pl
# 现在就可以打开 http://127.0.0.1:1220/ 来对 DSS 服务器进行管理了
在 DSS WebAdmin 里面修改 General Settings -> Media Directory ,将它改为你的 Media 目录,如果使用默认的,把视频文件放到C:\ProgramFiles\Darwin Streaming Server\Movies 里面
(3)
用 QuickTime 或VLC 打开rtsp://127.0.0.1:554/sample_100kbit.mp4,正常的话,就可以看到视频正常播放了.Movies 里面有自带的样例.
⑤ linux怎么架设RTSP流媒体服务器
Linux下利用gnump3d架设流媒体服务器
库文件被安装到:/usr/lib/perl5/5.8.6/gnump3d目录
man被安装到:
/usr/man/man1/gnump3d.1
/usr/man/man1/gnump3d-index.1
/usr/man/man1/gnump3d-top.1
/usr/man/man1/gnump3d.conf.1
3、配置
gnump3d的配置文件被存放在/etc/gnump3d/gnump3d.conf ,我们可以对配置文件进行修改。
gnump3d的themes被存放在/usr/share/gnump3d/目录中,所以要想换theme,可以在 gnump3d.conf中指定。
媒体文件存放在目录gnump3d.conf中,是/home/mp3 ,您也可以改为您媒体文件的目录,或者在/home中建一个mp3目录,把所有的媒体文件拷过去。
4、运行gnump3d流媒体服务器
[root@localhost gnump3d-2.9.5]# gnump3d&
或
[root@localhost gnump3d-2.9.5]# gnump3d2&
5、访问gnump3d流媒体服务器
访问地址是:http://localhost:8888/ ,您也可以让局域网的其它电脑来访问,当然要把localhost改为您的机器的IP地址,举例来说,如果您的流媒体服务器所在电脑的IP是192.168.1.6 ,那么,局域网访问地址应该是:
http://192.168.1.6:8888
对属性的配置页面:
http://localhost:8888/prefs/
6、汉化theme让界面变成中文
⑥ RTSP流播放支持什么格式
Quicktime Player播放 链接的应该是DSS,而DSS支持的就是MP4,3pg,mov 。
MS的流服务器 就支持asf了。
⑦ 如何在win2008中搭建rtsp流媒体服务器
用Helix Server做流媒体服务器,搭建过程先参考下http://wenku..com/link?url=uWcq___,如果不成功,后期我会在csdn上写篇博客,到时候把链接发给你。我搭过很多流媒体服务器,这个就是专门支持rtsp协议的,视频格式为rmvb或rm,音频格式为ra,就是用helix server做流媒体服务器,helix procer plus做视音频编码器,realplayer做客户端播放器,这三个组合起来使用,配置通畅就好了,那么都和你说了用哪些软件了,其实网上都能搜到相关软件的使用说明了,不懂的再问我吧!
⑧ java中怎么实现RTSP服务器说下思路,说详细一点,第一次接触RTSP
按rtsp的协议写网络程序。。。。。。。。。。有一个开源的项目叫jrtsp
⑨ 怎么实现最小的RTSP服务器
亲 很高兴为你解答 以下答案有道友提供
//////rtsp.c//////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <errno.h>
#include <netdb.h>
#include <time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h> //close()
#include "h264.h"
//#define DEST_PORT 8888
typedef struct
{
int startcodeprefix_len; //! 4 for parameter sets and first slice in picture, 3 for everything else (suggested)
unsigned len; //! Length of the NAL unit (Excluding the start code, which does not belong to the NALU)
unsigned max_size; //! Nal Unit Buffer size
int forbidden_bit; //! should be always FALSE
int nal_reference_idc; //! NALU_PRIORITY_xxxx
int nal_unit_type; //! NALU_TYPE_xxxx
char *buf; //! contains the first byte followed by the EBSP
unsigned short lost_packets; //! true, if packet loss is detected
} NALU_t;
FILE *bits = NULL; //!< the bit stream file
static int FindStartCode2 (unsigned char *Buf);//查找开始字符0x000001
static int FindStartCode3 (unsigned char *Buf);//查找开始字符0x00000001
//static bool flag = true;
static int info2=0, info3=0;
RTP_FIXED_HEADER *rtp_hdr;
NALU_HEADER *nalu_hdr;
FU_INDICATOR *fu_ind;
FU_HEADER *fu_hdr;
/**
int sock_init(int sockfd,struct sockaddr_in addr,int SERVER_PORT)
{
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
fprintf(stderr,"Socket Error:%s\n",strerror(errno));
exit(1);
}
printf("sockfd is %d\n",sockfd);
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(SERVER_PORT);
if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
{
fprintf(stderr,"Bind Error:%s\n",strerror(errno));
exit(1);
}
printf("init successfel!!\nport is %dsockfd is %d\n",SERVER_PORT,sockfd);
return 0;
}
*/
char* sock_recv(int sockfd,struct sockaddr *addr_client,int *addrlen)
{
//int *tem_len = &addrlen;
socklen_t len;
printf("sock_recv sockfd is %d\n",sockfd);
char *recv_buffer = malloc (sizeof (char));
//printf("sock_recv sockfd is88888888888888 %d\n",sockfd);
int n;
n=recvfrom(sockfd,recv_buffer,256,0,addr_client,&len);
//printf("recv number is %d\n",n);
if(0)
{
printf("recvfrom error!\n");
exit (1);
}
if(-1==n)
{
perror("recv error:");
}
else
{
addrlen=(int *)len;
printf("sock recv success!!\n");
/** char IPdotdec[20]; //存放点分十进制IP地址
struct in_addr s =
inet_ntop(AF_INET, (void *)&s, IPdotdec, 16);
printf("addr_client.data=%s\n",IPdotdec);
*/ printf("addr_len=%ld\n",addrlen);
}
return recv_buffer;
}
//为NALU_t结构体分配内存空间
NALU_t *AllocNALU(int buffersize)
{
NALU_t *n;
if ((n = (NALU_t*)calloc (1, sizeof (NALU_t))) == NULL)
{
printf("AllocNALU: n");
exit(0);
}
n->max_size=buffersize;
if ((n->buf = (char*)calloc (buffersize, sizeof (char))) == NULL)
{
free (n);
printf ("AllocNALU: n->buf");
exit(0);
}
return n;
}
//释放
void FreeNALU(NALU_t *n)
{
if (n)
{
if (n->buf)
{
free(n->buf);
n->buf=NULL;
}
free (n);
}
}
void OpenBitstreamFile (char *fn)
{
if (NULL == (bits=fopen(fn, "rb")))
{
printf("open file error\n");
exit(0);
}
printf("test264 open successful!\n");
}
//这个函数输入为一个NAL结构体,主要功能为得到一个完整的NALU并保存在NALU_t的buf中,获取他的长度,填充F,IDC,TYPE位。
//并且返回两个开始字符之间间隔的字节数,即包含有前缀的NALU的长度
int GetAnnexbNALU (NALU_t *nalu)
{
int pos = 0;
int StartCodeFound, rewind;
unsigned char *Buf;
if ((Buf = (unsigned char*)calloc (nalu->max_size , sizeof(char))) == NULL)
printf ("GetAnnexbNALU: Could not allocate Buf memory\n");
nalu->startcodeprefix_len=3;//初始化码流序列的开始字符为3个字节
if (3 != fread (Buf, 1, 3, bits))//从码流中读3个字节
{
free(Buf);
return 0;
}
info2 = FindStartCode2 (Buf);//判断是否为0x000001
if(info2 != 1)
{
//如果不是,再读一个字节
if(1 != fread(Buf+3, 1, 1, bits))//读一个字节
{
free(Buf);
return 0;
}
info3 = FindStartCode3 (Buf);//判断是否为0x00000001
if (info3 != 1)//如果不是,返回-1
{
free(Buf);
return -1;
}
else
{
//如果是0x00000001,得到开始前缀为4个字节
pos = 4;
nalu->startcodeprefix_len = 4;
}
}
else
{
//如果是0x000001,得到开始前缀为3个字节
nalu->startcodeprefix_len = 3;
pos = 3;
}
//查找下一个开始字符的标志位
StartCodeFound = 0;
info2 = 0;
info3 = 0;
while (!StartCodeFound)
{
if (feof (bits))//判断是否到了文件尾
{
nalu->len = (pos-1)-nalu->startcodeprefix_len;
memcpy (nalu->buf, &Buf[nalu->startcodeprefix_len], nalu->len);
nalu->forbidden_bit = nalu->buf[0] & 0x80; //1 bit
nalu->nal_reference_idc = nalu->buf[0] & 0x60; // 2 bit
nalu->nal_unit_type = (nalu->buf[0]) & 0x1f;// 5 bit
free(Buf);
return pos-1;
}
Buf[pos++] = fgetc (bits);//读一个字节到BUF中
info3 = FindStartCode3(&Buf[pos-4]);//判断是否为0x00000001
if(info3 != 1)
info2 = FindStartCode2(&Buf[pos-3]);//判断是否为0x000001
StartCodeFound = (info2 == 1 || info3 == 1);
}
// Here, we have found another start code (and read length of startcode bytes more than we should
// have. Hence, go back in the file
rewind = (info3 == 1)? -4 : -3;
if (0 != fseek (bits, rewind, SEEK_CUR))//把文件指针指向前一个NALU的末尾
{
free(Buf);
printf("GetAnnexbNALU: Cannot fseek in the bit stream file");
}
// Here the Start code, the complete NALU, and the next start code is in the Buf.
// The size of Buf is pos, pos+rewind are the number of bytes excluding the next
// start code, and (pos+rewind)-startcodeprefix_len is the size of the NALU excluding the start code
// 不管有没有再次读到 头 ,其主要 关心的还是 nalu->len
nalu->len = (pos+rewind)-nalu->startcodeprefix_len;
memcpy (nalu->buf, &Buf[nalu->startcodeprefix_len], nalu->len);//拷贝一个完整NALU,不拷贝起始前缀0x000001或0x00000001
nalu->forbidden_bit = nalu->buf[0] & 0x80; //1 bit
nalu->nal_reference_idc = nalu->buf[0] & 0x60; // 2 bit
nalu->nal_unit_type = (nalu->buf[0]) & 0x1f;// 5 bit
free(Buf);
return (pos+rewind);//返回两个开始字符之间间隔的字节数,即包含有前缀的NALU的长度
}
//输出NALU长度和TYPE
void mp(NALU_t *n)
{
if (!n)return;
//printf("a new nal:");
printf(" len: %d ", n->len);
printf("nal_unit_type: %x\n", n->nal_unit_type);
}
希望能帮助你
⑩ 如何在手机内部搭建rtsp服务器
package org.zhangkai.postdata;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import org.apache.http.protocol.HTTP;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class postActivity extends Activity implementsRunnable{
Button btn ;
final String SERVER = "127.0.0.1";
final int PORT = 1560;//在手机内部,端口号可以随便用,除了有固定用途的端口,比如80
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)this.findViewById(R.id.send);
btn.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
try {
Socket socket = new Socket (SERVER,PORT);
OutputStream mOutput = socket.getOutputStream();
mOutput.write("test".getBytes());
mOutput.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
new Thread (this).start();
}
public void run() {
try {
ServerSocket server = new ServerSocket (PORT);
System.out.println("start accept....");
Socket socket = server.accept();
InputStream mInput = socket.getInputStream();
byte[] data = new byte[1400];
int length = mInput.read(data);
System.out.println("data:"+new String (data,0,length));
} catch (IOException e) {
e.printStackTrace();
}
}
}