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,然后点“播放”按扭。

完整的示例代码

p2p传输实时视频流相关推荐

  1. python Intel Realsense udp协议 局域网传输实时视频流并通过窗口显示 (opencv压缩解码)

    文章目录 发送端 接收端 执行结果 发送端 接收端 发送端 # -*- coding: utf-8 -*- """ @File : 200103_obstacle_det ...

  2. python实现流媒体传输_基于OpenCV的网络实时视频流传输的实现

    很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头.但是有时,大家又希望能够随时随地观看视频直播. 大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它 ...

  3. 第6季2:基于RTSP协议的实时视频流传输的源码分析

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 前言 博文第一季2:HI3518EV200的初体验中,所提供的测试文件sample_venc实现了基于RTSP协议的实时视频流传输功能. ...

  4. Vitis项目:基于 ZYNQ 的 IMX2221 摄像头实时视频流采集传输 (一)传感器配置

    项目:基于 ZYNQ 的 IMX2221 摄像头实时视频流采集传输 章节:传感器配置(一) 本章目的:使用 ZYNQ 芯片的 PS 端的 SPI 接口对 CMOS 图像传感器进行设置操作,保证 CMO ...

  5. 基于 OpenCV 的网络实时视频流传输

    作者 | 努比 来源 | 小白学视觉 大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它们具有更高的分辨率并降低了布线成本.在本文中,我们将重点介绍IP摄像机 ...

  6. 基于OpenCV的网络实时视频流传输

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头.但是有 ...

  7. H5解码H264实时视频流

    浏览器如何解码实时视频流?最近研究了一下,大体思路为通过websocket把裸H264传输到浏览器,在通过js封装成mp4格式,再通过Html5的video标签进行解码,效果还是比较不错. <! ...

  8. 新的Google Lyra音频编解码器对实时视频流意味着什么?

    正文字数:2602  阅读时长:4分钟 通过语言编码中的码率缩减趋势,Lyra与Opus中的区别比较,Lyra的作用,XDN平台上的高效语音编码技术几个方面探讨新的Google Lyra音频编解码器对 ...

  9. 浅析云控平台画面传输的视频流方案

    简介: 本文将小结本次云控平台画面传输的视频流方案. 背景 ARC(高德车机云控平台)是一个基于车载设备业务深度定制的云控平台,通过该平台我们能够实现远程使用不同类型的车载设备.为了让远程使用者像在本 ...

最新文章

  1. OpenCV Python + Tesseract-OCR轻松实现中文识别
  2. java方法怎么写_关于java方法,这几题该怎么写
  3. eclipse/MyEclipse 日期格式、注释日期格式、时区问题
  4. 华为p6电信版 android 4.5,华为P6电信版系统应用apk补全教程 完整EMUI
  5. aws lambda_如何通过在本地模拟AWS Lambda来加速无服务器开发
  6. 黄聪:Discuz自制模板带jquery时与discuz本身冲突解决办法
  7. 关于一般公司加密软件的处理程序实现解密方法
  8. python 三角函数 计算
  9. 平房误差函数_平方误差函数(square error function)与平方损失函数(square loss function)...
  10. 2020哔哩哔哩校招前端笔试编程题
  11. iOS中给图片加水印或文字的几种方法
  12. Netty学习1——Netty的核心组件
  13. input框中的文字加下划线
  14. 《有效的单元测试》一第2章 寻 求 优 秀
  15. Python豆瓣爬虫(2)BeautifulSoup库
  16. execute,executeQuery,executeUpdate三个方法有什么区别呢?
  17. simon手册翻译_part2
  18. linux如何查看无线密码是多少个,在 Linux 中查看连接过的 WiFi 密码
  19. 又是没有专业技术的一篇嘿嘿!
  20. day22-网络爬虫2

热门文章

  1. win 10 caffe python=3.5 小白安装全过程(最详细,完美解决各种版本不兼容等问题)
  2. 【高项】第3章 项目立项管理【知识点精华笔记】
  3. rabbitMQ实例(java)
  4. 手把手教你在GitHub上传项目(超详细)
  5. 解决无公网IP,远程访问黑群晖NAS
  6. 微信小程序AR扫描识别图(支持多图片)加载3D模型及其动画
  7. 动态规划-最少硬币组合问题(Java)
  8. reghdfe:多维面板固定效应估计
  9. ★Oracle imp/impdp 导入dmp文件到数据库
  10. MAC最详细配置rz/sz命令