p2p传输实时视频流

news/2024/11/2 16:26:42/

HYP2P是好游科技开发的p2p sdk,利用nat穿透的原理实现p2p打洞,主要用于实时音视频的传输。使用时可以配置成tcp模式或udp模式,tcp模式会自动帮您解决丢包、乱序、重传问题。中转模式则是基于tcp实现的。您可以灵活的自定义通信双方的协议,HYP2P不会解析您的业务数据。

下面通过两个程序配合演示p2p传输实时视频流,一个作为播放端的A,另一个是提供rtsp视频服务的B,A和B分别运行于不同的内网机器上。程序启动时A和B都是连接p2p服务器,打洞成功后,A直接从B获取rtsp视频流,并由vlc播放。

rtsp协议本身支持用udp或tcp传输实际的视频流,由于HYP2P的底层是由udp实现的,因此为了简单,我们这里配置vlc播放器使用tcp模式: 运行VLC media player后 ,选择工具—偏好设置—输入/编解码器。在最下面的live555流传输中选择 RTP over RTSP (TCP), 如下图:

下面先看程序A的代码,以下示例代码在windows下用vc2017或以上编译并执行。


#include "stdafx.h"
#include "p2papi.h"int g_nlocalport=0;
int DEVICE_ID   = 1000;
int g_nP2PSetUp = 0;class CP2PHoleSink : public IP2PSessionSink
{
public:CP2PHoleSink(){}~CP2PHoleSink(){}virtual void onServerConnected(int session, int state){p2p_login_server(session, DEVICE_ID);}virtual void  onLoginServer(int session, int state){//13是要连接的设备IDp2p_connect_peer(session,13);}virtual void onHoleState(int session, int state){        g_nP2PSetUp =state;        }virtual void onRecvServerData(int cmd, int subcmd, const unsigned char * pDataBuffer, int wDataSize){}virtual void onRecvP2PData(int session,int channel, const unsigned char * pDataBuffer, int wDataSize){}virtual void onChannelState(int session,int state){}virtual bool OnSocketCommand(int wMain, int sub, const void* pData, int nLen){return true;}virtual void onProxyStarted(int session, int port){}
};int main(int argc, char* argv[])
{int frame_index = 0;int64_t start_time = 0;if (argc >= 2)DEVICE_ID = atoi(argv[1]);printf("my deviceid = %d\n", DEVICE_ID);p2p_engine_init("43.142.138.68",20000,"d:/p2p.log");//"192.168.3.166"int sessionID = p2p_get_free_session();CP2PHoleSink sink;p2p_set_sink(sessionID,&sink);g_nlocalport = 49999;p2p_start_proxy(sessionID, g_nlocalport,1);int64_t p2puid = DEVICE_ID | 0x1000000000000000;p2p_connect_server(sessionID, p2puid, "");printf("local server port=%d\n", g_nlocalport);while (1){SleepEx(10,TRUE);}p2p_stop_proxy(sessionID);p2p_engine_destroy();return 0;
}

与上一篇发送hello wold字符串的示例相比只是多了下面两行代码

    g_nlocalport = 49999;p2p_start_proxy(sessionID, g_nlocalport,1);

表示视频流将被获取到本机的49999端口上,vlc只需要将播放地址设置为:rtsp://127.0.0.1:49999/video/test.264,既可播放B程序提供的视频流。

接着再看程序B的代码,以下示例代码在windows下用vc2017或以上编译并执行。


#include "stdafx.h"
#include "p2papi.h"
#include "livemedia.h"int DEVICE_ID   = 13;
int g_nP2PSetUp = 0;class CP2PHoleSink : public IP2PSessionSink
{
public:CP2PHoleSink(){}~CP2PHoleSink(){}virtual void onServerConnected(int session, int state){p2p_login_server(session, DEVICE_ID);}virtual void  onLoginServer(int session, int state){}virtual void onHoleState(int session, int state){        g_nP2PSetUp=state;    }virtual void onRecvServerData(int cmd, int subcmd, const unsigned char * pDataBuffer, int wDataSize){}virtual void onRecvP2PData(int session,int channel, const unsigned char * pDataBuffer, int wDataSize){}virtual void onChannelState(int session,int state){}virtual bool OnSocketCommand(int wMain, int sub, const void* pData, int nLen){return true;}virtual void onProxyStarted(int session, int port){}
};int main(int argc, char* argv[])
{int frame_index = 0;int64_t start_time = 0;if (argc >= 2)DEVICE_ID = atoi(argv[1]);p2p_engine_init("43.142.138.68",20000,"d:\p2pserver.log");//"192.168.3.166"DWORD last_update_time = GetTickCount();DWORD last_framenum_update = last_update_time;DWORD nFrameNum = 0;int initVal = 0;printf("my deviceid = %d\n", DEVICE_ID );int sessionID = p2p_get_free_session();CP2PHoleSink sink;p2p_set_sink(sessionID,&sink);//设备授权ID和密钥:4294967390,49uozeazd9//此授权ID与p2p_login_server中的设备ID不同p2p_connect_server(sessionID, 4294967390, "49uozeazd9");int serviceport = start_rtsp_server();p2p_set_device_port(sessionID, serviceport);while (initVal == 0){rtsp_server_update();SleepEx(10,TRUE);}p2p_stop_proxy(sessionID);stop_rtsp_server();p2p_engine_destroy();return 0;
}

与上一篇发送hello wold字符串的示例相比只是多了下面一行代码

//serviceport参数是提供视频流的端口号    
p2p_set_device_port(sessionID, serviceport);

此示例程序B中  livemedia.h 是实现rtsp功能库的头文件,里面定义了三个函数:start_rtsp_server,rtsp_server_update, stop_rtsp_server。

这三个函数本身与p2p功能不相关,只是实现rtsp视频流服务器的功能。

下面是vcl播放p2p视频的截屏:

以上通过两个控制台程序展示了使用 p2p传输rtsp视频的例子, 如有任何凝问,加我qq:390090739

测试时必须先运行B程序,再运行A程序,然后运行vcl media player,打开vcl后,选择 媒体—打开网络串流—网络,输入地址rtsp://127.0.0.1:49999/video/test.264,然后点“播放”按扭。 

完整的示例代码


http://www.ppmy.cn/news/132252.html

相关文章

什么是p2p流媒体技术?

P2P是英文Peer-to-Peer(对等)的简称,又被称为“点对点”。“”。“对等”技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。德国互联网调研机构ipoque称&…

让流媒体服务SRS支持P2P通信

# srs支持p2p通信简介 流媒体服务srs是国内开发且开源的一款功能强大,性能强劲的优秀的流媒体服务器,目前正被越来越广泛的使用。srs一般被用户部署在公网上的云主机,这样方便用户进行推拉流等各种操作。但将srs部署在公网的云主机上也会带来…

P2P流媒体

作 者:王洪波 马轶慧 1 P2P流媒体系统 1.1P2P流媒体系统播送方式 P2P流媒体系统按照其播送方式可分为直播系统和点播系统,此外近期还出现了一些既可以提供直播服务也可以提供点播服务的P2P流媒体系统。 1.1.1直播 在流媒体直播服务中,用户只…

基于P2P的流媒体技术概述

摘 要:P2P流媒体技术已成为网络应用中热门的技术之一,本文主要介绍流媒体,P2P的相关概念,并着重对P2P流媒体的关键技术进行了研究,最后又提出了P2P流媒体技术应该面对的挑战。 关键词:P2P ;流媒体;应用层组播;激励机制 1 引言      随着互联网的…

P2P流媒体开源项目介绍

P2P流媒体开源项目介绍 1. PeerCast 2002年成立,最早的开源P2P流媒体项目。PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据。节点离根节点越远,传输时延就越大&#x…

流媒体:浅谈传统媒体—流媒体—加P2P的流媒体的演变之路

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 【前言】 今天发现二哥在搞流媒体,顿时来了兴趣(之前在考试维护的时候经常听老师说P2P等),追问之下之前林哥搞成功过,而且写了一系…

【P2P】【转载】P2P流媒体开源项目介绍

大神的整理 P2P流媒体开源项目介绍 前言: 最近在做一个网站,发现p2p流媒体技术对于解决高流量高带宽问题真的很不错。 据说现在一些视频和直播公司在研究p2pcdn,证明了p2p永不过时。 先记录先来,有时间慢慢研究 PeerCast 2002…

流媒体协议之WebRTC实现p2p视频通话(二)

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 简介 目的 帮助自己了解webrtc 实现端对端通信 # 使用流程git clone https://gitee.com/wjj0720/webrtc.gitcd ./webRTCnpm inpm run dev…