视频编辑软件。
1,主页地址
https://www.openshot.org/screenshots
2,源码地址
CGraph
中文名为【色丶图】,是一套无任何第三方依赖的跨平台图流程执行框架。通过GPipeline
(流水线)底层调度,实现了依赖元素依次顺序执行、非依赖元素并发执行的调度功能。
纯C++开发,跟Qt没啥关系,但是如果跟Qt 的QGraphicsView框架的流程图结合在一起,就可以实现强大的流程图编辑,调度功能。
1,源码地址
基于 Qt 的通用库,可以为各种应用程序开发节点编辑器。该库可用于简单的图形可视化和流程编辑。使用QGraphicsView框架。
1,源码地址
OpenBoard 是一款开源跨平台交互式白板教学软件,主要供学校和大学使用。 它既可以与交互式白板一起使用,也可以在带有手写板显示屏和投影仪的双屏设置中使用。
利用的是Qt的QGraphicsView框架,可绘制圆,矩形,文字等基本图形,还能嵌套网页,文档,媒体等控件。
1,主页地址
https://openboard.ch/index.en.html
2,源码地址
一,OBS
OBS是一个免费的开源的视频录制和视频实时推流软件。并同时支持多种平台。
1,主页地址
2,源码地址
https://github.com/obsproject/obs-studio
二,streamlabs
基于OBS开发的一款直播软件,增加了登录,聊天,商城的功能,界面使用Electron开发,底层推流部分使用OBS。比OBS更漂亮,功能更多。
1,主页地址
https://streamlabs.com/zh-cn/streamlabs-live-streaming-software
2,源码地址
一,VLC
VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。
1,主页地址
2,源码地址
https://github.com/videolan/vlc
二,QtAV
基于Qt和FFmpeg的跨平台高性能音视频播放框架。
1,主页地址
2,源码地址
https://github.com/wang-bin/QtAV
三,smplayer
1,主页地址
2,源码地址
一,需求
软件上线后,出现问题再去排查,看日志是第一步,那就需要一个专业的日志框架,这里推荐spdlog,多线程安全,使用简单,基本功能都具备。
二, 使用
1, 将源码放到工程目录下。
https://github.com/gabime/spdlog
2,写一个单列 来配置日志和调用日志。
#pragma once
#include <QCoreApplication>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/async.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <iostream>
#include <QDateTime>
class XLogger
{
public:
static XLogger* getInstance()
{
static XLogger xlogger;
return &xlogger;
}
std::shared_ptr<spdlog::logger> getLogger()
{
return m_logger;
}
private:
XLogger()
{
try
{
//日志等级 可以从配置文件读取
spdlog::level::level_enum level = spdlog::level::debug;
const QString logger_name = QCoreApplication::applicationDirPath() + "\\log\\" +QDateTime::currentDateTime().toString("yyyy-MM-dd") + ".log";
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
//文件大小 限制,日志命名
auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logger_name.toStdString(), 100 * 1024 * 1024, 1000);
console_sink->set_pattern("%Y-%m-%d %H:%M:%S.%f [%l] [%@] %v");
file_sink->set_pattern("%Y-%m-%d %H:%M:%S.%f [%l] [%@] %v");
//这里即输出到控制台 也写到文件
console_sink->set_level(level);
file_sink->set_level(level);
std::vector<spdlog::sink_ptr> sinks;
sinks.push_back(console_sink);
sinks.push_back(file_sink);
m_logger = std::make_shared<spdlog::logger>("multi-sink", begin(sinks), end(sinks));
m_logger->set_level(spdlog::level::trace);
m_logger->flush();
}
catch (const spdlog::spdlog_ex& ex)
{
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
}
~XLogger()
{
spdlog::drop_all();
}
void* operator new(size_t size)
{}
XLogger(const XLogger&) = delete;
XLogger& operator=(const XLogger&) = delete;
private:
std::shared_ptr<spdlog::logger> m_logger;
};
#define LOGT(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::trace, __VA_ARGS__)
#define LOGD(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::debug, __VA_ARGS__)
#define LOGI(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::info, __VA_ARGS__)
#define LOGW(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::warn, __VA_ARGS__)
#define LOGE(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::err, __VA_ARGS__)
3, 使用的时候 直接使用宏即可。
//没有参数
LOGI("Camera close!");
//携带参数
int index=0;
LOGI("{} close!",index);