我需要播放一个自定义AVI文件,其中包含经典视频流,音频流以及自定义数据流.
自定义流包含由某些自定义小部件可视化的数据; 这些小部件只需要在适当的时间将每个自定义帧写入缓冲区.
我们的应用程序基于Qt,并且已经使用QMediaPlayer/ QVideoWidget播放传统视频,但额外的自定义流使事情变得更复杂,因为AFAIK QMediaPlayer只播放视频/音频并忽略其他所有内容.
我想避免重新发明整个qt-multimedia,但我不知道如何充分利用可用的Qt类.
我到目前为止的想法是:
编写一个自定义媒体播放器类,使用解复用和解码视频ffmpeg,实现定时,QAudioOutput用于播放音频,生成QVideoFrame要在视频上播放的s 流,并将自定义数据写入某个缓冲区以进行可视化.
问题:为了避免编写代码来重新缩放/转换视频帧,我想重用QVideoWidget,但它似乎只适用于"真实" QMediaPlayer.
将输入文件解复用并QMediaPlayer与AV流一起提供.
将输入解复用ffmpeg(可能将解码留给Qt后端),让一个QIODevice只检索输入文件中的视频/音频流,另一个检索数据流.播放视频/音频QMediaPlayer.
+-------+
| QFile |
+---^---+
|
inherits
|
+--------------------+
| MyAviDemuxer |
| |
| holds a queue of |
| demuxed packets |
+--------------------+
| |
readDataPacket readVideoPacket
| |
+-------v--------+ +--------v-----------+ +-----------+
| MyCustomReader | …Run Code Online (Sandbox Code Playgroud)请考虑以下示例(cout为简单起见,省略了锁定保护).
#include <future>
#include <iostream>
#include <thread>
using namespace std;
struct C
{
C() { cout << "C constructor\n";}
~C() { cout << "C destructor\n";}
};
thread_local C foo;
int main()
{
int select;
cin >> select;
future<void> f[10];
for ( int i = 0;i < 10; ++i)
f[i] = async( launch::async,[&](){ if (select) foo; } );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在clang和gcc上,如果用户写'0',该程序不输出任何内容,而如果用户输入非零数字则打印Constructor/ Destructor10次.另外clang抱怨明显的非使用表达结果.
由于thread_local存储生命周期应该跨越整个线程的生命周期,我期望foo在每个线程中初始化变量,而不管用户输入如何.
我可能想要一个thread-local变量,其唯一目的是在构造函数中产生副作用,标准是否要求thread_local在第一次使用时初始化对象?
我正在使用g ++ - 4.7和-std = c ++ 0x在C++ 11中开发应用程序.
我的应用程序链接到一些用g ++ - 4.7编译的共享库,但没有-std = c ++ 0x指令.
不幸的是,没有任何作用,这意味着我在使用外部库类和方法时会有一些奇怪的行为.(当然在没有-std = c ++ 0x的情况下编译我的应用程序工作正常).
这是预期的行为还是编译器错误?
任何解决方法(类似于externC关键字)?
请考虑以下示例:
template<int i>
struct nice_type;
template<class T>
struct is_nice : std::false_type {};
template<int i>
struct is_nice< nice_type<i> > : std::integral_constant<int, i> {};
template<class T, class = void>
struct pick
{
typedef std::integral_constant<int, -1> type;
};
template<class T>
struct pick<T, typename std::enable_if< is_nice<T>::value >::type >
{
typedef std::integral_constant<int, is_nice<T>::value > type;
};
int main()
{
std::cout << pick<int>::type::value << ", ";
std::cout << pick< nice_type<42> >::type::value << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Clang(3.4.1)输出"-1,-1",而GCC(4.9.0)输出"-1,42".
问题在于专业化pick.虽然Gcc似乎很乐意转换is_nice<T>::value(42)bool(true),但clang没有这样做,并且放弃了专业化.这两个例子都是用-std=c++11. …
注意,这不是一个问题std::condition_variable::wait_for().我知道可以假装醒来.
我的程序的行为表明这个问题的答案是肯定的,但是对于condition_variable案例,STL文档非常清楚.至少在cppreference.com上,this_thread的正确答案似乎是否定的.
编译器是gcc 4.8.1,如果这是一个缺陷.
我编写了以下代码来获取元组元素的偏移量
template<size_t Idx,class T>
constexpr size_t tuple_element_offset() {
return static_cast<size_t>(
reinterpret_cast<char*>(&std::get<Idx>(*reinterpret_cast<T*>(0))) - reinterpret_cast<char*>(0));
}
Run Code Online (Sandbox Code Playgroud)
这实际上类似于offsetof宏的实现.它看起来很难看,但在gcc-4.6上编译并正常工作
typedef std::tuple<int,char,long> mytuple;
mytuple var = std::make_tuple(4,'c',1000);
char * ptr = reinterpret_cast<char*>(&var);
long * pt = reinterpret_cast<long*>(ptr+tuple_element_offset<2,mytuple>());
std::cout << *pt << std::endl;
Run Code Online (Sandbox Code Playgroud)
打印"1000".
我对constexpr了解不多,所以我的问题是:
据我所知,constexpr,编译器被迫在编译时评估表达式的结果,因此在实践中不会发生零去引用.
我知道从析构函数中抛出通常是一个坏主意,但我想知道我是否可以使用std::uncaught_exception()安全抛出析构函数.
考虑以下RAII类型:
struct RAIIType {
...
~RAIIType() {
//do stuff..
if (SomethingBadHappened()) {
//Assume that if an exception is already active, we don't really need to detect this error
if (!std::uncaught_exception()) {
throw std::runtime_error("Data corrupted");
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
这个UB在c ++ 11中吗?这是一个糟糕的设计吗?
我正在寻找静态大小的std::valarray实现。
我自己可以轻松实现它,但是我需要进行constexpr操作(求和,减法等),而且这样做很无聊/容易出错,所以我在这里问是否有一个流行的实现。
如果我必须自己实现这一点,那么您认为在这种情况下表达式模板值得吗?
请考虑以下代码段:
template<template<class> class T,class U>
struct apply
{
typedef T<U> type;
};
typedef apply<std::tuple,int>::type tuple_of_one_int; //Should be std::tuple<int>
Run Code Online (Sandbox Code Playgroud)
GCC 4.8.2.说:
type/value mismatch at argument 1 in template parameter list for [...] struct apply
expected a template of type ‘template<class> class T’, got ‘template<class ...> class std::tuple’
Run Code Online (Sandbox Code Playgroud)
这基本上意味着类std::tuple变量模板不是Tin 的有效模板参数apply.
这是一个GCC错误还是标准要求这种行为?
我有一个大项目,它分为两部分:
第 1 部分需要跨平台,我们使用 CMake 为此设置所有项目文件。
第 2 部分仅适用于 Windows。它在 .SLN 文件中配置,它取决于第 1 部分。
我们使用cmake生成了一个Part1.sln,但是此时我们有两种不同的解决方案(Part1.sln和Part2.sln),不断地从一个切换到另一个很烦人。
显然,在第 2 部分中使用 CMake 不是一种选择,因为我们的大多数开发人员无法编辑 cmake 文件,并且希望直接从 MSVC 修改解决方案。
据我所知,不可能在另一个解决方案中“包含”一个视觉工作室解决方案,但我可能错了。
我们想生成一个包含第 1 部分和第 2 部分的单个 .SLN 文件,可能使用 CMake 本身或其他一些方法。
在 M68040 asm 中,给出:
mov.l #0x1000, %a0
mov.l -(%a0), -(%a0)
Run Code Online (Sandbox Code Playgroud)
%a0第二个之后的值是多少mov?寄存器是递减两次还是一次?
mov.l我们可以使用少数几个支持源和目标上的预递减/后递增的指令之一来代替吗?
MC68040 UM 声明move16 (%an)+, (%an)+仅执行单个增量,但我找不到有关一般情况的任何信息。
我正在开发模拟器,但没有实际的 CPU。此外,网上的普遍共识似乎是Easy68k在处理这种极端情况时并不值得信赖。
我有一个大的头文件(~10000行),由我的控件中的脚本/程序自动生成.
为了避免在我的类的声明中包含此文件,我转发声明我需要的几种类型:
--myclass.h
namespace bl {
class TypeA;
class TypeB;
}
// Other stuff and myclass definition...
Run Code Online (Sandbox Code Playgroud)
现在它证明了TypeA并且TypeB不是类名,而是在自动生成的文件中定义为:
typedef SomeUnspecifiedClassName TypeA;
typedef AnotherUnspecifiedClassName TypeB;
Run Code Online (Sandbox Code Playgroud)
在哪里SomeUnspecifiedClassName我的意思是我不能转发声明这个类型名称,因为它可能会在各种情况下发生变化.
我怎样才能转发声明typedef?(不能使用c ++ 11)
我想确保2/3值在给定阈值内的示例.下面的代码实现了这一点,但我想知道是否有更通用的方法.
struct foo {
int id;
float item1;
float item2;
float item3;
}
bool ConditionCheck(foo val1, foo val2, foo val3) {
int count = 0;
if (abs(val1.item1 - val2.item1) < val3.item1) {
count++;
}
if (abs(val1.item2 - val2.item2) < val3.item2) {
count++;
}
if (abs(val1.item3 - val2.item3) < val3.item3) {
count++;
}
if (count >= 2) {
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
问题源于自定义结构,其他参数作为数组:
// assuming array holds: [id, item1, item2, item3]
bool ConditionCheck(float (&val1)[4], float (&val2)[4], float(&threshold)[4]) {
int …Run Code Online (Sandbox Code Playgroud)