p2p传输实时视频流

2023-05-16

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是要连接的设备ID
        p2p_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,然后点“播放”按扭。 

完整的示例代码

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

p2p传输实时视频流 的相关文章

  • 网络地址转换的类型及特点

    1 网络地址转换的类型及特点 NAT有三种类型 静态NAT StaticNAT 动态地址NAT PooledNAT 网络地址端口转换NAPT Port LevelNAT 静态NAT 指将内部网络的私有IP地址转换为公有IP地址 IP地址对是
  • STUN和TURN技术浅析

    原文地址 http www h3c com cn MiniSite Technology Circle Net Reptile The Five Home Catalog 201206 747038 97665 0 htm 在现实Inter
  • url的讲解

    摘抄博客 什么是URL URL是什么意思 刘宇凡的专栏 CSDN博客 ur是什么意思 什么是URL URL是Uniform Resource Locator的缩写 即统一资源定位系统 也就是我们通常所说的网址 URL是在Internet的W
  • 最后一次实验

    拓扑图 实验要求 拓扑分析 先分ip 然后分vlan然后配ip 配路由 设备配置和配置解析 sw1 sw2 r1 r2 r3 实验结果
  • FutureWarning: Criterion ‘mse‘ was deprecated in v1.0 and will be removed in version 1.2.

    出现FutureWarning Criterion mse was deprecated in v1 0 and will be removed in version 1 2 Use criterion squared error whic
  • llvm 介绍有用的网站

    LLVM笔记 7 指令的side effect LLVM笔记 7 指令的side effect Five100Miles 博客园 LLVM每日谈之十八 GEP Instruction的几点总结 LLVM每日谈之十八 GEP Instruct
  • 5月10日 ksjsb抓包教程,小黄鸟无需ROOT抓包

    1 先下载抓包工具 小黄鸟 自己搜索 注意 这里下载完小黄鸟app后 安装打开时 该下载的安全证书下载 手机root权限该给的都给 2 打开小黄鸟工具 添加目标应用 快手极速版 3 启动小黄鸟 然后退出让它后台运行 打开快手极速版到菜单栏找
  • 百度文库免费复制word文档的纯文字

    2022年5月11日测试过 以下方法能正常使用 1 在页面中安F12或者从浏览器的设置中找到开发人员工具 2 切换到控制台 然后点击右上角图标进入更多设置 3 在设置 首选项中 找到 调试程序 然后勾选 禁用javascript 4 做完上
  • springboot多模块打包配置问题

    工程案例结构 baidu 聚合过程 baidu web 子模块web工程 baidu service 子模块 baidu config 子模块配置工程 注意事项 配置步骤 1 baidu 聚合工程 工程下的 pom xml 文件案列如下
  • PLC控制电动机的顺序启动逆序停止

    一 PLC控制电动机延迟启动正转和反转 实验要求 当按下电动机的正转启动按钮时 电动机需要延迟30秒后 电动机才会正转启动工作 当按下反转按钮时 电动机需要延迟20秒后 电动机才会反转启动工作 当按下停止按钮时电动机立刻停止工作 PLC I
  • 开源P2P视频流媒体源代码研究

    1 Azureus http azureus sourceforge net 这是java版的betorrent 最新版本2 4 0 2 从网上直接下载的源代码是没法构建的 所用的库没有在包里面 可以到 http azureus cvs s
  • 数据结构与算法--用c语言建立队列以及其相关操作

    一 队列的定义和特点 队列与栈一样 也是一种特殊的线性表 与栈 先进后出 不同的是 队列服从 先进先出 也就是元素从队尾进入队列 从队头离开 如图所示 a1最先进入队列 因此最先从对头离开队列 然后是a2 以此类推 二 队列的相关操作及其代
  • 点对点如何通过路由器工作?

    一台电脑如何通过互联网连接到另一台电脑 例如 程序侦听 PC 1 上的连接 PC 1 位于路由器 1 后面 PC 2 有一个客户端程序尝试连接到 PC 1 在这种情况下 用作听力程序的正确技术 技巧是什么 This 布莱恩 福特的文章解释跨
  • 使用 Java 和 Corba 识别对等文件共享中的客户端。并在 2 个客户端之间建立套接字套接字

    我正在使用 Java 和 CORBA 开发一个点对点文件共享应用程序 我是 CORBA 新手 到目前为止 我已经成功创建了一个客户端程序 该程序通过 CORBA 在 SQL 数据库中注册一个文件 该表存储以下信息 filename 共享 基
  • 在 Python 中使用 Rasterbar libtorrent 挑选同级

    有谁知道是否可以选择使用 libtorrent 进行连接的对等点 也就是说 在跟踪器返回对等 IP 和端口的列表后 只有选定的几个将根据某些定义的标准进行连接 Thanks 您可以使用以下命令从集合中删除对等点set ip filter 您
  • 如何修复 InvalidStateError:没有远程 SDP 时无法添加 ICE 候选者

    我正在创建一个 webRTC 视频聊天 当从 Firefox 发起呼叫时显示呼叫者所有活动成员 并且接收者使用 chrome 此错误显示 未捕获 承诺 DOMException 无法在 RTCPeerConnection 上执行 addIc
  • 安卓和iPhone之间的距离

    我正在寻找一种当两部手机靠近时传输数据的方法 这需要跨平台 因此我无法使用 NFC 或 iBeacon 我计划使用 allJoyn 发送信息 我只想将数据发送给距离我几英尺的其他人 有什么方法可以在其他手机上准确读取距离吗 或者我可以通过放
  • 如何用C#实现P2P?

    最近 我想使用c 和Winform开发一个简单的聊天程序 主要功能是聊天和文件传输 但是我找不到使用dotnet实现p2p的示例 谁可以帮助我 查看WCF
  • WebRTC:匹配最近的同行

    给定一个公共 IP 地址 对等点 A 和许多其他公共 IP 地址 IPv4 和 IPv6 地址的混合 列表 将对等点 A 的 IP 地址匹配的最简单方法是什么 n最近的对等点 而无需让对等点手动相互 ping 通以进行延迟基准测试 我认为使
  • 如何在两个设备(android,iphone)之间传输“数据”?

    如何在两个设备之间传输数据 我想在不同平台 android iphone 之间传输数据 主要是图像文件 是否可以使用 p2p 或者我应该使用客户端服务器 任何帮助将不胜感激 你看过吗高通的 AllJoyn 库 https developer

随机推荐