使用Enterprise Architect(版本9.2),我创建了一些类和序列UML图.现在我需要Word文档中的那些图表.
我的第一种方法是使用Windows 7 Snipping Tool将它们剪切掉并粘贴到文档中.但是出于印刷目的,质量太差了.
第二种方法是Enterprise Architect中提供的"将它们另存为图像".但有了这个,质量更差.
第三种方法是将它们导出为pdf文件.有了这个,质量相当不错,我可以将这些pdf导入到Inkscape中,然后将它们转换为*.png文件,将它们导入到word中.问题是,Enterprise Architect有点失败了.意味着图片本身具有高质量,但它试图转换类的字体,然后我在字母之间有一些空格,应该没有.
长话短说 - 有没有办法将我的UML图从Enterprise Architect导出到像.png或者这样的常见图片格式.tiff,同时保持不错的质量?
我有一个包含多个参数的批处理脚本.我正在读取它们的总数,然后像这样运行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)
我现在想做的是使用我的运行变量(x或counter)来访问输入参数.我在想这样的事情:
REM Access to %1
echo %(!counter!)
Run Code Online (Sandbox Code Playgroud)
在理想的世界中,这一行应该打印出我的第一个命令行参数,但显然它没有.我知道我对%操作员做错了什么,但无论如何我可以访问我这样的论点吗?
//编辑:只是为了清楚 - 问题在于它%(!counter!)为我提供了变量的值counter.counter=2它的意义给了我2而不是内容%2.
环境:
我有一台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)
由此我可以确定:
在我的案例中必要的片段类型是:
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:
0x00 0x00 0x01),然后写入SPS或PPS数据使用起始位进行分段
没有Start Bit的碎片
这意味着我的原始文件看起来像这样:
[NAL Prefix][SPS][NAL …Run Code Online (Sandbox Code Playgroud) 我有一个绑定到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)
因为我不喜欢第一个建议是我需要创建一个字符串只是为了检查,这在我看来是有点不必要的.第二种方式有一个弱点,我需要查找所有错误代码,如果我想检查其他东西?那么有没有任何枚举或方法来检查错误或我有两种建议的方式之一?
我有一个来自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)
所以我得到的SPS和PPS从Session Description Protocol我的前面的RTSP通信.此外,相机在开始使用视频流之前发送SPS和输入PPS两个单独的消息.
所以我按此顺序捕获消息:
1. Preceding RTSP Communication …Run Code Online (Sandbox Code Playgroud) 我有现有的C代码和现有的Makefile,我想将其包装到Eclipse C-Project中(使用Eclipse 3.4 Ganymede).该守则的组织方式如下:
主目录: /Project/Software
源码和头文件:../Project/Software/CodeDir1 ../Project/Software/CodeDir2等等..
到目前为止,我一直在做这些步骤:
Software- > Now Eclipse将所有Source文件等集成到Project中我第一次这样做,一切正常.我把输出到我的控制台,一切都很酷.但随后"Build Icon"(小锤子)变灰了,我再也无法点击它了.如果我现在转到项目属性 - > C/C++ Build它只是说"这个项目不是CDT项目",而且我得到一个带有"java.lang.NullPointerException"的错误.
我怎样才能获得一个有效的项目?
编辑:
为了避免一个简单的错误,我尝试使用新版本的Eclipse(Kepler).我得到相同的错误("没有CDT项目"),但没有Null指针异常.
但我可以稍微缩小一下这个问题:第一次开始制作过程时,它始终有效.如果构建过程失败,我仍然可以转到我的构建属性.只要我完成一个完整且无错误的构建运行,就会出现此问题.关于这一点,它只发生在我的make调用是从Eclipse完成的.如果我从命令行调用它,我仍然可以从eclipse中运行一个.
我想知道我的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函数时,我实际读取了一些有效的数据(我预期的)
不幸的是,我仍然坚持使用一点RTP/RTCP通信来正确访问我的IP摄像头.
我想做什么
相机有一个我想读的内部缓冲区.因此,我通过RTSP与相机通信,并告诉它流式传输数据.当摄像机通过整个缓冲区时,流媒体将停止.
到目前为止我有什么
通过RTSP与DESCRIBE/ SETUP/ PLAYRequest(RTSP)通信以启动流的TCP连接.当Camera传输数据时,此连接必须保持打开状态.
我收到通过RTP发送的数据的端口(基于UDP) - 处理这个并不是我关心的问题,我甚至完全无法访问它,我只想提及它是为了完整性.
接收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) 我可以想象这个问题已经被问到了,但实际上我找不到任何合适的解决方案,所以请原谅这是一个多余的问题.
我有一个自定义类
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.假设没有调用构造函数但我仍然可以从该对象调用方法 - >这意味着我的类的成员仍未初始化?
对不起,如果这些问题有点愚蠢,但我觉得我现在的速度很慢.
我有一个可以由多个线程创建的类.但是在一个函数中需要保护代码,所以我决定使用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) - 现在发生以下情况:
所以现在有人可能会说"那就不要打电话了!" - 那可能吗?我的意思是,因为named_mutex写入系统,我怀疑它是否在没有显式调用的情况下被删除,即使程序结束.有人帮忙吗?