是否可以测量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()吗?为了在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) 免责声明:这是一个理论问题,目的是增加我的理解.我知道我总是可以使用像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.
等等...
解码过程必须执行反向递归.
但是,我怀疑如果我做得太难而且有一种更简单的方法.有更简单的方法吗?
这是线程安全的吗?
int x = 0;
std::thread([&]{ x = 1; }).join();
std::cout << x;
Run Code Online (Sandbox Code Playgroud)
变量x可以从两个线程访问,而不使用原子或锁.但是,join()强制访问x 的调用 是顺序的.
这里需要内存屏障吗?
我有三个视频:
我想创建一个最终视频,这三个组件占据屏幕的某个区域.
开源软件是否允许我这样做(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) 编辑
我停止使用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)
这有效,但有一些问题:
有人能指出我如何解决这些问题的正确方向吗?
编辑:我取得了一些进展.
播放的初始延迟是因为播放器正在等待关键帧.通过强制流的发送者每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文件.
欢迎大家帮忙!
将按钮添加到工具栏(使用旧的Windows API)时,我似乎无法找到更改按钮高度的方法.我需要能够增加按钮的高度,因为我使用的是大图标.
我目前正在使用自定义绘图绘制所有内容,因为我希望能够使用不同宽度的图标,这在使用图像列表时是不可能的.但是,为了获得高度,我愿意放弃该要求并使用图像列表而不是自定义绘制.
是否可以覆盖'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) 不久之前,这段代码似乎有效,但现在它已不复存在了.它有什么问题吗?
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)
这可能是休息时间:)