小编Sta*_*ked的帖子

测量`std :: clock()`的分辨率

是否可以测量std::clock()通话的分辨率?或者这是一个无法影响观察的问题吗?

我写了以下天真的基准:

#include <ctime>
#include <iostream>

int main() {
    std::clock_t initial = std::clock();
    std::clock_t current;
    while (initial == (current = std::clock()));
    std::cout << "Initial: " << initial << std::endl;
    std::cout << "Current: " << current << std::endl;
    std::cout << "Precision: " << (static_cast<double>(current - initial) / CLOCKS_PER_SEC) << "s" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我跑了几百次,总是输出0.01s.

我的问题是:

  • 以上代码是衡量分辨率的好方法clock()吗?
  • 如果没有,那么它有什么问题?怎么可以改进?

c++ clock

6
推荐指数
1
解决办法
557
查看次数

提升协程断言失败

为了在boost中尝试新的协同程序功能,我创建了以下程序:

#include <boost/coroutine/all.hpp>
#include <string>
#include <vector>


typedef boost::coroutines::coroutine<int(char)> coroutine_t;


void f(coroutine_t::caller_type & ca)
{
    std::vector<int> vec = {1, 2, 3};
    for (int i : vec)
    {
        char c = ca.get();
        std::cout << "c: " << c << std::endl;
        ca(i);
    }
}

int main()
{
    coroutine_t cr(f);
    std::string str("abc");
    for (char c : str)
    {
        std::cout << c << std::flush;
        cr(c);
        int n = cr.get();
        std::cout << n << std::endl;        
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码基于文档中示例代码.

我的构建命令如下:

$ g++ …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-coroutine

6
推荐指数
1
解决办法
639
查看次数

什么是最简单(和正确)的转义算法?

免责声明:这是一个理论问题,目的是增加我的理解.我知道我总是可以使用像JSON库这样的工具来解决问题.

假设我想创建一个以逗号分隔的值列表,这些值本身可能包含逗号.这些逗号需要先被转义.假设我.用作转义字符然后["a", "b,c"]变成a,b.,c.

但是,如果其中一个值最初包含一个.,序列,那么我们需要转义逗号之前逃避它们.因此[ "a", "b.,c" ]变得a,b..,c.

但是,如果其中一个值最初包含一个..,序列,那么我们需要转义逗号之前逃避它们.因此[ "a", "b..,c" ]变得a,b...,c.

但是,如果其中一个值最初包含一个...,序列,那么我们需要转义逗号之前逃避它们.因此[ "a", "b...,c" ]变得a,b....,c.

等等...

解码过程必须执行反向递归.

但是,我怀疑如果我做得太难而且有一种更简单的方法.有更简单的方法吗?

algorithm escaping

6
推荐指数
1
解决办法
1389
查看次数

在被另一个线程写入并在该线程加入之后从主线程访问变量是否安全?

这是线程安全的吗?

int x = 0;
std::thread([&]{ x = 1; }).join();
std::cout << x;
Run Code Online (Sandbox Code Playgroud)

变量x可以从两个线程访问,而不使用原子或锁.但是,join()强制访问x 的调用 是顺序的.

这里需要内存屏障吗?

c++

6
推荐指数
1
解决办法
165
查看次数

将多个视频合并为一个

我有三个视频:

  • 用摄像机拍摄的演讲
  • 演讲中使用的计算机桌面捕获视频
  • 和白板的视频

我想创建一个最终视频,这三个组件占据屏幕的某个区域.

开源软件是否允许我这样做(mencoder,ffmpeg,virtualdub ..)?你推荐哪一个?

或者是否有一个C/C++ API可以让我以编程方式创建类似的东西?

编辑
将来会有多个录制的讲座.这意味着我需要通用/自动化解决方案.

我目前正在检查是否可以使用GStreamer编写应用程序来完成这项工作.对此有何评论?

解决了!
我成功地用GStreamer的视频混合器元素做到了这一点.我使用gst-launch语法创建管道,然后使用gst_parse_launch加载它.这是实现复杂管道的一种非常有效的方法.

这是一个管道,它接收两个传入的视频流和一个徽标图像,将它们混合成一个流并复制它,以便它同时显示并保存到磁盘.

  desktop. ! queue
           ! ffmpegcolorspace
           ! videoscale
           ! video/x-raw-yuv,width=640,height=480
           ! videobox right=-320
           ! ffmpegcolorspace
           ! vmix.sink_0
  webcam. ! queue
          ! ffmpegcolorspace
          ! videoscale
          ! video/x-raw-yuv,width=320,height=240
          ! vmix.sink_1
  logo. ! queue
        ! jpegdec
        ! ffmpegcolorspace
        ! videoscale
        ! video/x-raw-yuv,width=320,height=240
        ! vmix.sink_2
  vmix. ! t.
  t. ! queue
     ! ffmpegcolorspace
     ! ffenc_mpeg2video
     ! filesink location="recording.mpg"
  t. ! queue
     ! ffmpegcolorspace
     ! dshowvideosink
  videotestsrc name="desktop"
  videotestsrc name="webcam"
  multifilesrc …
Run Code Online (Sandbox Code Playgroud)

c++ video ffmpeg gstreamer

5
推荐指数
1
解决办法
5430
查看次数

VLC桌面流媒体

编辑
我停止使用VLC并切换到GMax FLV编码器.它在IMO方面做得更好.

原帖
我将我的桌面(屏幕)作为H264视频流发送到另一台机器,使用以下命令行将其保存到文件中:

流的发件人:

vlc -I dummy
    --sout='#transcode{vcodec=h264,vb=512,scale=0.5}
            :rtp{mux=ts,dst=192.168.0.1,port=4444}'
Run Code Online (Sandbox Code Playgroud)

流的接收者:

vlc -I rc
    rtp://@:4444
    --sout='#std{access=file,mux=ps,dst=/home/user/output.mp4}'
    --ipv4
Run Code Online (Sandbox Code Playgroud)

这有效,但有一些问题:

  • 大多数玩家无法播放该文件.
  • VLC能够播放文件,但有些奇怪:
  • =>播放实际开始前大约需要10秒钟.
  • =>寻求不起作用.

有人能指出我如何解决这些问题的正确方向吗?

编辑:我取得了一些进展.

播放的初始延迟是因为播放器正在等待关键帧.通过强制流的发送者每4秒创建一个新的关键帧,我可以减少延迟:

:screen-fps=10
--sout='#transcode{vcodec=h264,venc=x264{keyint=40},vb=512,scale=0.5}
       :rtp{mux=ts,dst=192.168.0.1,port=4444}'
Run Code Online (Sandbox Code Playgroud)

然而寻求问题并没有解决,但我理解它好一点.RTP流以原始流格式保存为文件,通常不能作为常规视频文件播放.VLC设法播放此文件,但大多数其他播放器没有.所以我需要将其转换为常规视频文件.我正在调查我是否可以使用ffmpeg执行此操作,如果我为其提供记录流的SDP文件.

欢迎大家帮忙!

video vlc video-streaming

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

如何设置工具栏按钮高度?

将按钮添加到工具栏(使用旧的Windows API)时,我似乎无法找到更改按钮高度的方法.我需要能够增加按钮的高度,因为我使用的是大图标.

我目前正在使用自定义绘图绘制所有内容,因为我希望能够使用不同宽度的图标,这在使用图像列表时是不可能的.但是,为了获得高度,我愿意放弃该要求并使用图像列表而不是自定义绘制.

c++ winapi

5
推荐指数
1
解决办法
1474
查看次数

HTTP验证实用程序?

有没有人知道可以检查HTTP请求/响应是否有效的实用程序?

http

5
推荐指数
1
解决办法
1118
查看次数

克服Clojure的'要求'?

是否可以覆盖'require'命令,以便在本地计算机上找不到某个资源时尝试下载该命令.例如:

(require 'examples.introduction) 
; if not found => download from the net
;   (url: http://media.pragprog.com/titles/shcloj/code/examples/introduction.clj)
Run Code Online (Sandbox Code Playgroud)

clojure

5
推荐指数
1
解决办法
301
查看次数

Sum函数不起作用:/

不久之前,这段代码似乎有效,但现在它已不复存在了.它有什么问题吗?

user=> (defn sum [a b] (a + b))
#'user/sum
user=> (sum 3 4)
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
user=>
Run Code Online (Sandbox Code Playgroud)

这可能是休息时间:)

clojure

5
推荐指数
1
解决办法
2268
查看次数