小编Tob*_*oby的帖子

Enterprise Architect:高质量地导出UML图

使用Enterprise Architect(版本9.2),我创建了一些类和序列UML图.现在我需要Word文档中的那些图表.

我的第一种方法是使用Windows 7 Snipping Tool将它们剪切掉并粘贴到文档中.但是出于印刷目的,质量太差了.

第二种方法是Enterprise Architect中提供的"将它们另存为图像".但有了这个,质量更差.

第三种方法是将它们导出为pdf文件.有了这个,质量相当不错,我可以将这些pdf导入到Inkscape中,然后将它们转换为*.png文件,将它们导入到word中.问题是,Enterprise Architect有点失败了.意味着图片本身具有高质量,但它试图转换类的字体,然后我在字母之间有一些空格,应该没有.

长话短说 - 有没有办法将我的UML图从Enterprise Architect导出到像.png或者这样的常见图片格式.tiff,同时保持不错的质量?

uml class-diagram image enterprise-architect

50
推荐指数
3
解决办法
8万
查看次数

批处理脚本 - 通过参数迭代

我有一个包含多个参数的批处理脚本.我正在读取它们的总数,然后像这样运行for循环:

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do set /A argCount+=1
echo Number of processed arguments: %argCount%

set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
set /a counter=!counter!+1 )
Run Code Online (Sandbox Code Playgroud)

我现在想做的是使用我的运行变量(xcounter)来访问输入参数.我在想这样的事情:

REM Access to %1 
echo %(!counter!)
Run Code Online (Sandbox Code Playgroud)

在理想的世界中,这一行应该打印出我的第一个命令行参数,但显然它没有.我知道我对%操作员做错了什么,但无论如何我可以访问我这样的论点吗?

//编辑:只是为了清楚 - 问题在于它%(!counter!)为我提供了变量的值counter.counter=2它的意义给了我2而不是内容%2.

arguments loops batch-file command-line-arguments

32
推荐指数
4
解决办法
4万
查看次数

使用FFmpeg进行H.264转换(来自RTP流)

环境:

我有一台IP摄像机,能够通过RTP以H.264编码格式传输数据.从以太网记录该原始流.有了这些数据,我必须工作.

目标:

最后我想要一个*.mp4文件,我可以使用常见的媒体播放器(如VLC或Windows MP).

到目前为止我做了什么:

我拿了原始流数据并解析它.由于数据是通过RTP传输的,我需要处理NAL字节,SPS和PPS.

1.写一个原始文件

首先,我确定通过以太网接收的每个帧的类型.为此,我解析每个RTP有效负载的前两个字节,因此我可以获得8个NAL单元位,片段类型位以及开始,保留和结束位.在有效载荷中,它们的排列方式如下:

Byte 1: [          3 NAL Unit Bits          | 5 Fragment Type Bits]
Byte 2: [Start Bit | Reserved Bit | End Bit | 5 NAL Unit Bits]
Run Code Online (Sandbox Code Playgroud)

由此我可以确定:

  • 视频帧的开始和结束 - >开始位和结束位
  • 有效载荷的类型 - > 5个碎片类型位
  • NAL单位字节

在我的案例中必要的片段类型是:

Fragment Type  7 = SPS
Fragment Type  8 = PPS
Fragment Type 28 = Video Fragment
Run Code Online (Sandbox Code Playgroud)

通过将字节1和2中的NAL单元位放在一起来创建NAL字节.

现在,根据碎片类型,我执行以下操作:

SPS/PPS:

  1. 写入NAL前缀(0x00 0x00 0x01),然后写入SPS或PPS数据

使用起始位进行分段

  1. 写NAL前缀
  2. 写NAL单位字节
  3. 写下剩余的原始数据

没有Start Bit的碎片

  1. 写原始数据

这意味着我的原始文件看起来像这样:

[NAL Prefix][SPS][NAL …
Run Code Online (Sandbox Code Playgroud)

video ffmpeg stream rtp h.264

17
推荐指数
1
解决办法
1万
查看次数

如何正确地反复检查Boost错误代码?

我有一个绑定到a的回调函数boost::asio::deadline_timer.现在,当取消定时器或它到期时,将调用该函数.由于我需要区分这两种情况,我需要检查传递的错误代码.基本代码如下:

void CameraCommand::handleTimeout(const boost::system::error_code& error)
{
    std::cout << "\nError: " << error.message() << "\n";
    return;
}
Run Code Online (Sandbox Code Playgroud)

现在当调用处理程序因为计时器到期时错误代码是Success,当取消计时器时错误代码是Operation canceled.

现在我的问题是,如何正确检查发生了什么?

建议1:

if( error.message() == "Success" )
{
     // Timer expired
}
else
{
     // Timer cancelled
}
Run Code Online (Sandbox Code Playgroud)

建议2:

if( error.value() == 0 )
{
     // Timer expired
}
else
{
     // Timer cancelled
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是 - 有没有办法比较错误本身而不是价值或字符串?有点像(现在这个)

if ( error == boost::system::error::types::success )
Run Code Online (Sandbox Code Playgroud)

因为我不喜欢第一个建议是我需要创建一个字符串只是为了检查,这在我看来是有点不必要的.第二种方式有一个弱点,我需要查找所有错误代码,如果我想检查其他东西?那么有没有任何枚举或方法来检查错误或我有两种建议的方式之一?

c++ error-handling boost boost-asio

15
推荐指数
2
解决办法
1万
查看次数

H.264 over RTP - 识别SPS和PPS帧

我有一个来自IP摄像机的原始H.264流,包含在RTP帧中.我想将原始H.264数据放入文件中,以便我可以将其转换为ffmpeg.

因此,当我想将数据写入我的原始H.264文件时,我发现它必须如下所示:

00 00 01 [SPS] 
00 00 01 [PPS]
00 00 01 [NALByte]
[PAYLOAD RTP Frame 1]     // Payload always without the first 2 Bytes -> NAL
[PAYLOAD RTP Frame 2]
[... until PAYLOAD Frame with Mark Bit received]  // From here its a new Video Frame
00 00 01 [NAL BYTE]
[PAYLOAD RTP Frame 1]
....
Run Code Online (Sandbox Code Playgroud)

所以我得到的SPSPPSSession Description Protocol我的前面的RTSP通信.此外,相机在开始使用视频流之前发送SPS和输入PPS两个单独的消息.

所以我按此顺序捕获消息:

1. Preceding RTSP Communication …
Run Code Online (Sandbox Code Playgroud)

c++ rtp rtsp h.264

13
推荐指数
2
解决办法
3万
查看次数

Eclipse - "这个项目不是CDT项目"

我有现有的C代码和现有的Makefile,我想将其包装到Eclipse C-Project中(使用Eclipse 3.4 Ganymede).该守则的组织方式如下:

主目录: /Project/Software

源码和头文件:../Project/Software/CodeDir1 ../Project/Software/CodeDir2等等..

到目前为止,我一直在做这些步骤:

  1. 将Eclipse workapce设置为/ Project /
  2. 使用名称创建新的C-Project Software- > Now Eclipse将所有Source文件等集成到Project中
  3. 转到属性 - > C/C++ Build并设置为"Custom Build options"

我第一次这样做,一切正常.我把输出到我的控制台,一切都很酷.但随后"Build Icon"(小锤子)变灰了,我再也无法点击它了.如果我现在转到项目属性 - > C/C++ Build它只是说"这个项目不是CDT项目",而且我得到一个带有"java.lang.NullPointerException"的错误.

我怎样才能获得一个有效的项目?

编辑:

为了避免一个简单的错误,我尝试使用新版本的Eclipse(Kepler).我得到相同的错误("没有CDT项目"),但没有Null指针异常.

但我可以稍微缩小一下这个问题:一次开始制作过程时,它始终有效.如果构建过程失败,我仍然可以转到我的构建属性.只要我完成一个完整且无错误的构建运行,就会出现此问题.关于这一点,它只发生在我的make调用是从Eclipse完成的.如果我从命令行调用它,我仍然可以从eclipse中运行一个.

c eclipse project

13
推荐指数
2
解决办法
2万
查看次数

Linux - 使用FIONREAD的ioctl始终为0

我想知道我的TCP套接字有多少字节可读.我用标志"FIONREAD"调用ioctl,它实际上应该给我这个值.当我调用函数时,我得到返回值0(所以没有错误),但我的整数参数得到值0.这没有问题但是当我调用recv()方法时,我实际上从套接字中读取了一些字节.我究竟做错了什么?

//这里有一些代码:

char recBuffer[BUFFERLENGTH] = {0};
int bytesAv = 0;
int bytesRead = 0;
int flags = 0;
if ( ioctl (m_Socket,FIONREAD,&bytesAv) < 0 )
{
    // Error
}
if ( bytesAv < 1 )
{
    // No Data Available
}
bytesRead = recv(m_Socket,recBuffer,BUFFERLENGTH,flags);
Run Code Online (Sandbox Code Playgroud)

当我调用recv函数时,我实际读取了一些有效的数据(我预期的)

sockets ioctl

11
推荐指数
3
解决办法
5万
查看次数

RTCP/RTP通信问题

不幸的是,我仍然坚持使用一点RTP/RTCP通信来正确访问我的IP摄像头.

我想做什么

相机有一个我想读的内部缓冲区.因此,我通过RTSP与相机通信,并告诉它流式传输数据.当摄像机通过整个缓冲区时,流媒体将停止.

到目前为止我有什么

  1. 通过RTSP与DESCRIBE/ SETUP/ PLAYRequest(RTSP)通信以启动流的TCP连接.当Camera传输数据时,此连接必须保持打开状态.

  2. 我收到通过RTP发送的数据的端口(基于UDP) - 处理这个并不是我关心的问题,我甚至完全无法访问它,我只想提及它是为了完整性.

  3. 接收RTCP Sender Reports/的UDP套接字Source Descriptions.这很重要,因为我不知道流何时停止(如第2点所述,我不能只看流停止时).在这个Socket我读到RTCP Sender Report Goodbye到来,这意味着流式传输已经完成.然后我可以关闭TCP Socket(来自RTSP通信).

出了什么问题

它适用于2MB或4MB等小缓冲区.我收到了一些源描述,然后是Goodbye.但在我的特定测试案例中,我想使用16MB(仍然不到相机能力的一半).我收到发件人报告,但在某些时候(总是大约8MB +/- 300KB),相机才停止发送.

值得注意的是,我可以通过VLC访问缓冲区而不会出现问题.我甚至看过通信(RTSP和RTCP),它与我的应用程序几乎完全相同......我想在下面提到的一件事:

可能的原因

这是我需要你的建议的部分.

可能性:缺乏接收者报告

当通过VLC进行流式传输时,我注意到有一些RTCP Receiver Reports从VLC发送到摄像机(类似于循环Sender Reports).那么camere是否期望在Receiver Report特定时间内(或者在发送特定数量的字节之后)至少有一个?目前我想不出任何其他原因.

解?

  • 如果我们假设相机停止流式传输,因为没有Receiver Reports我想知道是否有办法实现它们而不需要携带太多信息.我已经阅读了一些RFC 3550,我猜这些报告消息背后仍然有一堆逻辑.现在我实际上不需要,所以我也不想在这里实现完整的RTCP协议.是否足以发送一些Receiver Report虚拟帧,以便相机继续流式传输?如果是这样,他们怎么样?

  • 如果它与缺乏无关Receiver Reports,我只是不需要它们,那么相机停止流动的原因是什么呢?有什么建议?

编辑:

好吧,我只是设法制作某种Dummy Receiver Report,它似乎工作(我只能收到12MB然后我得到了所需的再见)

我只填充了一个28Byte缓冲区,并在Header字段中使用了一些值,这意味着:

buffer[0] = 0x80;   // Version 2 , …
Run Code Online (Sandbox Code Playgroud)

c++ udp rtp rtsp rtcp

9
推荐指数
1
解决办法
3719
查看次数

自定义类/对象的构造函数和初始化

我可以想象这个问题已经被问到了,但实际上我找不到任何合适的解决方案,所以请原谅这是一个多余的问题.

我有一个自定义类

class myClass_A
{
public:
    myClass_A();          // Constructor
    myFunction_A();       // Some function from Class A
};
Run Code Online (Sandbox Code Playgroud)

现在我有另一个自定义类,它有一个类型的成员 myClass_A

class myClass_B
{
public:
    myFunction_B();       // Some function from Class B

private:
    myClass_A m_instance; // Instance of Class A
}
Run Code Online (Sandbox Code Playgroud)

现在myFunction_B()myFunction_A()m_instance这样的方式调用方法:

myClass_B::myFunction_B()
{
    m_instance.myFunction_A();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我编译我的代码(基本上就像我上面发布的示例),它将成功,没有任何警告或错误.所以我的问题是:

A.在这个例子中是否会调用构造函数?

B.我真的可以从未初始化的对象中调用方法吗?

C.假设没有调用构造函数但我仍然可以从该对象调用方法 - >这意味着我的类的成员仍未初始化?

对不起,如果这些问题有点愚蠢,但我觉得我现在的速度很慢.

c++ constructor initialization

9
推荐指数
1
解决办法
1万
查看次数

提升了named_mutex和remove()命令

我有一个可以由多个线程创建的类.但是在一个函数中需要保护代码,所以我决定使用boost interprocess互斥.每个类在其构造函数中创建或打开相同的Mutex:

MyClass::MyClass()
{
       boost::interprocess::named_mutex m_Lock(
                 boost::interprocess::open_or_create, "myLock" );
}
Run Code Online (Sandbox Code Playgroud)

所以现在有一个关键代码部分被调用的地方:

int MyClass::MyFunction()
{
       boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
                  m_Lock, boost::interprocess::try_to_lock);
       if(!lock)
       {
           return -1;
       }
       // else do some stuff here 
}
Run Code Online (Sandbox Code Playgroud)

要在函数后清理(和它在boost页面上描述的那样),我在我的类析构函数中使用remove命令:

MyClass::~MyClass()
{
       boost::interprocess::named_mutex::remove("myLock");
}
Run Code Online (Sandbox Code Playgroud)

实际上所有这些代码都运行良好,但我有一个问题:

正如在remove命令的描述中所说:

从系统中删除命名的互斥锁.错误时返回false.永远不要扔.

所以这意味着删除命令只是将Mutex清除出系统 - 即使另一个线程刚刚锁定它(我已经尝试过这种情况 - 它已经不再被锁定了).所以我的问题如下:例如我有3个线程(A,B和C) - 现在发生以下情况:

  1. 进程A创建类的实例,调用函数并锁定它
  2. 进程B创建类的实例,调用函数但无法访问代码(然后等待例如)
  3. 进程A完成受保护的代码并解锁
  4. 进程B获得对受保护代码的访问权并锁定它
  5. 进程A删除类的实例 - >调用remove命令
  6. 进程C创建类的实例,调用函数并可以访问代码,因为remove命令删除了Mutex - > Error!

所以现在有人可能会说"那就不要打电话了!" - 那可能吗?我的意思是,因为named_mutex写入系统,我怀疑它是否在没有显式调用的情况下被删除,即使程序结束.有人帮忙吗?

c++ boost mutex locking interprocess

8
推荐指数
1
解决办法
5360
查看次数