小编sba*_*bbi的帖子

使用QtMultimedia播放自定义avi数据流

我需要播放一个自定义AVI文件,其中包含经典视频流,音频流以及自定义数据流.

自定义流包含由某些自定义小部件可视化的数据; 这些小部件只需要在适当的时间将每个自定义帧写入缓冲区.

我们的应用程序基于Qt,并且已经使用QMediaPlayer/ QVideoWidget播放传统视频,但额外的自定义流使事情变得更复杂,因为AFAIK QMediaPlayer只播放视频/音频并忽略其他所有内容.

我想避免重新发明整个qt-multimedia,但我不知道如何充分利用可用的Qt类.


我到目前为止的想法是:

  1. 编写一个自定义媒体播放器类,使用解复用和解码视频ffmpeg,实现定时,QAudioOutput用于播放音频,生成QVideoFrame要在视频上播放的s 流,并将自定义数据写入某个缓冲区以进行可视化.

    问题:为了避免编写代码来重新缩放/转换视频帧,我想重用QVideoWidget,但它似乎只适用于"真实" QMediaPlayer.

  2. 将输入文件解复用并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)

c++ qt ffmpeg qtmultimedia

58
推荐指数
1
解决办法
1772
查看次数

什么时候初始化`thread_local`全局变量?

请考虑以下示例(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在第一次使用时初始化对象?

c++ multithreading thread-local c++11

18
推荐指数
1
解决办法
4318
查看次数

C++ 11和C++ 03之间的库兼容性

我正在使用g ++ - 4.7和-std = c ++ 0x在C++ 11中开发应用程序.
我的应用程序链接到一些用g ++ - 4.7编译的共享库,但没有-std = c ++ 0x指令.

不幸的是,没有任何作用,这意味着我在使用外部库类和方法时会有一些奇怪的行为.(当然在没有-std = c ++ 0x的情况下编译我的应用程序工作正常).

  1. 这是预期的行为还是编译器错误?

  2. 任何解决方法(类似于externC关键字)?

c++ c++11

11
推荐指数
1
解决办法
1224
查看次数

在SFINAE中缩小int到bool,gcc和clang之间的输出不同

请考虑以下示例:

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. …

c++ gcc clang sfinae c++11

10
推荐指数
1
解决办法
331
查看次数

std :: this_thread :: sleep_for()有没有虚假的唤醒?

注意,这不是一个问题std::condition_variable::wait_for().我知道可以假装醒来.

我的程序的行为表明这个问题的答案是肯定的,但是对于condition_variable案例,STL文档非常清楚.至少在cppreference.com上,this_thread的正确答案似乎是否定的.

编译器是gcc 4.8.1,如果这是一个缺陷.

c++ sleep stl thread-sleep c++11

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

获取元组元素的偏移量

我编写了以下代码来获取元组元素的偏移量

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了解不多,所以我的问题是:

  1. 它是合法的c ++吗?
  2. 更重要的是,为什么我被允许在constexpr函数中调用std :: get(非constexpr)?

据我所知,constexpr,编译器被迫在编译时评估表达式的结果,因此在实践中不会发生零去引用.

c++ tuples constexpr c++11

7
推荐指数
1
解决办法
1215
查看次数

这是从析构函数中抛出异常的安全方法吗?

我知道从析构函数中抛出通常是一个坏主意,但我想知道我是否可以使用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中吗?这是一个糟糕的设计吗?

c++ exception c++11

7
推荐指数
1
解决办法
503
查看次数

静态大小的valarray实现

我正在寻找静态大小的std::valarray实现。

我自己可以轻松实现它,但是我需要进行constexpr操作(求和,减法等),而且这样做很无聊/容易出错,所以我在这里问是否有一个流行的实现。

如果我必须自己实现这一点,那么您认为在这种情况下表达式模板值得吗?

c++ constexpr c++11

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

可变参数模板是否可以匹配非可变参数模板参数?

请考虑以下代码段:

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错误还是标准要求这种行为?

c++ templates variadic template-meta-programming c++11

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

在 CMake 中包含 Visual Studio 解决方案

我有一个大项目,它分为两部分:

  • 第 1 部分需要跨平台,我们使用 CMake 为此设置所有项目文件。

  • 第 2 部分仅适用于 Windows。它在 .SLN 文件中配置,它取决于第 1 部分。

我们使用cmake生成了一个Part1.sln,但是此时我们有两种不同的解决方案(Part1.sln和Part2.sln),不断地从一个切换到另一个很烦人。

显然,在第 2 部分中使用 CMake 不是一种选择,因为我们的大多数开发人员无法编辑 cmake 文件,并且希望直接从 MSVC 修改解决方案。

据我所知,不可能在另一个解决方案中“包含”一个视觉工作室解决方案,但我可能错了。

我们想生成一个包含第 1 部分和第 2 部分的单个 .SLN 文件,可能使用 CMake 本身或其他一些方法。

c++ cmake visual-studio-2008 visual-studio

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

M68K:同一寄存器上的预减

在 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在处理这种极端情况时并不值得信赖。

assembly 68000 addressing-mode

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

转发声明一个typedef

我有一个大的头文件(~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)

c++ forward-declaration c++03

4
推荐指数
1
解决办法
3981
查看次数

C++ Combinatoric检查是否满足条件子集

我想确保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)

c++

0
推荐指数
1
解决办法
40
查看次数