非正式测试用DDS写的“视频”传输程序

其实有点无聊,想测试一下开多少个视频订阅端可以把网络带宽占满。

先说说测试的环境:

    100M的局域网

     DDS InfoRepo 运行在 54M无线网卡的笔记本上。

     视频发布端运行在 100M的网卡的机器上

     多外视频订阅端运行在四台 100M网卡的台式机上。

以上操作系统为 Windows XP有Windows 2003

 

疯狂的启动订阅端,一共启动了120多个实例,发布端的机器网卡占用率超过90%.

程序说明:

   视频发布端:通过dshow抓帧,每秒15帧,  320*240大小,以jpg格式压缩成约5K/帧。通过dds发布给订阅者。

  订阅者接收到以数据,将jpg的图片显示在界面上。

  发布者和订阅者采用的QoS策略为默认值。

  当网卡占率超过 90%以上 (P:S  > 1:120+),系统显得不稳定,先是usb摄像头罢工,然后是发布端直接退出。

 

下图是示意图 1个发布者,两个订阅者。

image

测试时,发现publish端(最上层的小画面)usb摄像头表示很呆滞,网络传输无明显延迟。

测试仅当好玩,未记录其他结果。

如果您对此感兴趣,可来邮件索要源代码。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
在Fast DDS中,你可以通过创建一个Publisher和Subscriber来实现传值调用功能。以下是一个简单的示例程序: ```cpp #include <fastdds/dds/domain/DomainParticipantFactory.hpp> #include <fastdds/dds/subscriber/Subscriber.hpp> #include <fastdds/dds/subscriber/SampleInfo.hpp> #include <fastdds/dds/publisher/Publisher.hpp> #include <fastdds/dds/topic/Topic.hpp> #include <fastdds/dds/topic/TypeSupport.hpp> #include "your_data_type.h" // 你定义的数据类型头文件 using namespace eprosima::fastdds::dds; class YourDataTypeSubscriber { public: YourDataTypeSubscriber() { // 创建DomainParticipant DomainParticipantQos qos; participant_ = DomainParticipantFactory::get_instance()->create_participant(0, qos); // 注册数据类型 YourDataTypeTypeSupport::register_type(participant_); // 创建Subscriber subscriber_ = participant_->create_subscriber(SUBSCRIBER_QOS_DEFAULT, nullptr); // 创建Topic topic_ = participant_->create_topic("YourDataTypeTopic", "YourDataType", TOPIC_QOS_DEFAULT); // 创建DataReader和监听器 reader_ = subscriber_->create_datareader(topic_, DATAREADER_QOS_DEFAULT, &listener_); } ~YourDataTypeSubscriber() { // 删除资源 participant_->delete_subscriber(subscriber_); DomainParticipantFactory::get_instance()->delete_participant(participant_); } class YourDataTypeListener : public ReaderListener { public: YourDataTypeListener() = default; void on_data_available(DataReader* reader) override { YourDataType data; SampleInfo info; while (reader->take_next_sample(&data, &info) == ReturnCode_t::RETCODE_OK) { if (info.valid_data) { // 处理收到的数据 // ... } } } }; private: DomainParticipant* participant_; Subscriber* subscriber_; Topic* topic_; YourDataTypeListener listener_; DataReader* reader_; }; class YourDataTypePublisher { public: YourDataTypePublisher() { // 创建DomainParticipant DomainParticipantQos qos; participant_ = DomainParticipantFactory::get_instance()->create_participant(0, qos); // 注册数据类型 YourDataTypeTypeSupport::register_type(participant_); // 创建Publisher publisher_ = participant_->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr); // 创建Topic topic_ = participant_->create_topic("YourDataTypeTopic", "YourDataType", TOPIC_QOS_DEFAULT); // 创建DataWriter writer_ = publisher_->create_datawriter(topic_, DATAWRITER_QOS_DEFAULT); } ~YourDataTypePublisher() { // 删除资源 publisher_->delete_datawriter(writer_); DomainParticipantFactory::get_instance()->delete_participant(participant_); } void publish(const YourDataType& data) { // 发布数据 writer_->write(&data); } private: DomainParticipant* participant_; Publisher* publisher_; Topic* topic_; DataWriter* writer_; }; ``` 在上面的示例程序中,我们创建了一个`YourDataTypeSubscriber`类和一个`YourDataTypePublisher`类,分别用于接收和发送`YourDataType`类型的数据。我们在`main`函数中使用这两个类来传递数据。 ```cpp int main() { YourDataTypePublisher publisher; YourDataTypeSubscriber subscriber; while (true) { YourDataType data; // 填充数据 // ... publisher.publish(data); // 等待接收数据 // ... } return 0; } ``` 在`main`函数中,我们创建了一个`YourDataTypePublisher`对象和一个`YourDataTypeSubscriber`对象,并在一个无限循环中使用`publisher`对象发布数据,然后使用`subscriber`对象接收数据。你可以在`YourDataTypeSubscriber::YourDataTypeListener::on_data_available`方法中处理接收到的数据。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值