哔哩哔哩直播姬 - biliobs

源码地址 https://github.com/bilibili/biliobs

直播姬基于或引用了以下项目

  • Qt5
  • obs-studio
  • openssl
  • ffmpeg
  • cURL
  • jansson
  • boost
  • netbsd

目的

通过对比obs-studio和biliobs的源码学习软件设计,无关紧要的代码不做记录。

从main开始分析启动初始化流程,这里是所有程序通用的初始化流程,GET

  • main函数进入,首先处理argv参数,后面会用到
base::CommandLine::Init(argc, argv);
base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
  • 程序单例,弹出控制台打印debug信息
#ifdef WIN32HANDLE instanceMutex = CreateMutexW(NULL, TRUE, InstanceMutexName);if (GetLastError() == ERROR_ALREADY_EXISTS){CloseHandle(instanceMutex);return 0;}if( cmd_line->HasSwitch("console") ){AllocConsole();freopen("con", "w", stdout);}
#endif

tips: 这里判断重复后直接退出了,我常用的方法是找到已启动的窗口然后置顶

HWND hwnd = FindWindow(L"Qt5QWindowIcon", DHF_APPNAME_W);
if (nullptr == hwnd)hwnd = FindWindow(L"Qt5QWindowToolSaveBits", DHF_APPNAME_W);
if (nullptr != hwnd)SetForegroundWindow(hwnd);
  • 创建BiLiApp,这个和OBSApp相似
BiLiApp BiLiOBSApp(argc, argv);
  • 安装DirectX
if (!DetectDX()) // LoadLibrary(L"D3DCompiler_43.dll")
{...InstallDX(); // exec "\\DxWebUpdate.exe"
}
  • 捕获程序崩溃信息,让程序优雅崩溃
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)AppCrashHandleCallback);
LONG AppCrashHandleCallback(EXCEPTION_POINTERS *pE)
{...CreateDumpFile(filePath, pE);/*open explorer*/QString pure_path = path;pure_path.resize(path.length() - 1);pure_path.append(fileName);QString arg("/select, ");arg.append(pure_path);ShellExecuteW(NULL, L"open", L"explorer.exe", arg.toStdWString().c_str(), NULL, SW_SHOWNORMAL);/*sleep用于使新启进程能够raise到窗口上层*/Sleep(1000);return EXCEPTION_EXECUTE_HANDLER; //优雅结束
}
  • 正式启动程序
if (BiLiOBSApp.mInitApp())BiLiOBSApp.exec();

这里开始进入到app内部的初始化

  • 进入BiLiApp::mInitApp进行初始化,几乎全部为OBS源码,创建主窗口
bool BiLiApp::mInitApp() {QCoreApplication::addLibraryPath("."); // 加载dll的路径try {//create dirs before loginif (!MakeBiliCommonDirs())throw "Failed to create common directories";IBiliAPI* biliApi = BiliAPIMan::GetInstance(); // 接口类,单例HotkeyManager::InitializeInstance(); // 维护程序快捷键EnableMuteHotkeySupport();if (!mOBSInitGlobalConfig())throw "Failed to initialize global config";if (!MakeUserDirs())throw "Failed to make user dirs";if (!MakeUserProfileDirs())throw "Failed to make user profile dirs";fstream logFile;create_log_file(logFile);delete_oldest_file("common/profiler_data");if (!mOBSInit()) // 这里执行了StartupOBS,初始化libobs模块return false;// 创建窗口,类似OBSBasic类,构造函数中执行UI方面的初始化mBiLiOBSMainWid = new BiLiOBSMainWid(biliApi);    //create main widget and set it's shadow widmBiLiOBSMainWid->setAttribute(Qt::WA_DeleteOnClose);mBiLiOBSMainWid->mOBSInit();mBiLiOBSMainWid->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose);} catch (const char *error) {blog(LOG_ERROR, "%s", error);OBSErrorBox(nullptr, "%s", error);return false;}mBiLiOBSMainWid->mShow();return true;
}
  • 进入BiLiOBSMainWid::mOBSInit进行窗口初始化,在OBS源码基础上增加了B站自己的东西
/* 1.OBS代码 */
mInitBasicConfig()
mResetAudio()
mResetVideo()mInitOBSAudioCallbacks();
AddExtraModulePaths();
obs_load_all_modules();
mInitService()
mInitPrimitives();InitPreview();
sltResetPreviewWid();
ResetPreview();/* 2.B站代码 *///创建推流服务
mService = obs_service_create("rtmp_custom", "default_service", NULL, NULL);
//已经被智能指针接管,所以要释放一下
obs_service_release(mService);//创建推流对象
this->outputHandler.reset();
this->outputHandler.reset(CreateSimpleOutputHandler(this));mSleepInhibitor = os_inhibit_sleep_create("OBS Video/audio");
os_inhibit_sleep_set_active(mSleepInhibitor, true);
//show();//获取房间信息、推流地址
emit OnRetryButtonClicked();//检查更新
worker.AddTask(std::bind(&BiLiOBSMainWid::mCheckNewVersion, this, nullptr));//获取头像
worker.AddTask(std::bind(&BiLiOBSMainWid::mGetUserFacePixmapTaskWrapper, weak_ref_, &BiLiOBSMainWid::mGetUserFacePixmapTask));//获取房间礼物数
worker.AddTask(std::bind(&BiLiOBSMainWid::mUpdateRoomPresentCountTaskWrapper, weak_ref_, &BiLiOBSMainWid::mUpdateRoomPresentCountTask));loadDanmakuHistoryConfig();

至此窗口创建完成,直播相关代码完全拷贝自OBS,可以参考OBS-studio的源码

哔哩哔哩直播姬和OBS源码对比相关推荐

  1. vs2019编译obs源码生成sln解决方案

    目录 一.OBS介绍 二.OBS源码下载 三.Qt配置 四.设置依赖库目录 五.开始编译 六.main函数 七.视频教程 一.OBS介绍   obs的编译不是很难,只要代码下的全,环境变量配的ok, ...

  2. VS2013编译OBS源码

    obs源码来之:https://sourceforge.net/projects/obsproject/ 下载源码之后直接打开sln索引文件就行 项目打开之后 obs作为启动项 直接编译就行,正常应该 ...

  3. 直播带货app源码,实现直播的秒开和优化

    一.概述 目前,移动视频直播正处于一个高速膨胀的时期.游戏直播,秀场直播.直播带货app源码等APP铺天盖地.如何在千军万马中脱颖而出,直播的实时性和流畅性是重中之重. 直播带货app源码的实时性对于 ...

  4. 直播带货app源码,实现直播连麦和PK

    一.概述 连麦:是指直播带货app源码中,由观众向主播发起连线请求,在主播和该观众之间建立低延迟的通讯链路,而其他观众可以看到"主播+连麦观众"的合成音视频内容. PK:是指直播过 ...

  5. 不会吧,你开发直播卖货软件源码时,不用PHP写后台?

    PHP系统是软件开发常用的开发语言,百度.搜狐.网易的开发中,也使用了它,这足以证明其可靠性和可用性,对于直播卖货软件源码的开发工作,我们也会使用到PHP,当然只是后台部分,一套完整的直播卖货软件源码 ...

  6. 运营级手机直播平台源码 短视频直播带货APP源码

    短视频直播带货APP源码 全开源原生直播APP源码 前端:原生APP 安卓端:Java 苹果端:OC 后台:PHP 数据库:Mysql 技术框架:Thinkphp5.1 系统特色功能包括:礼物系统:提 ...

  7. 自己搭建网红直播带货平台源码该怎么做

    直播带货作为"直播+"形态的一种,在近两年收到了广泛的关注,本文主要讲述:自己搭建网红直播带货平台源码,需要注意些什么,有哪些常见问题? 搭建网红直播平台源码需要多少人手: 产品组 ...

  8. 如何选择网红直播带货平台源码的功能进行开发搭建

    据三方数据显示,国内移动互联网在社交.视频.电商等几个领域,行业用户规模均已突破5亿,用户每天花费在互联网上的时间已突破6小时,人均单日时长增加18分钟,下沉市场用户规模高达6.14亿,红利可观.那么 ...

  9. 直播带货系统源码利用FloatingActionButton实现 展开/折叠多级悬浮菜单

    直播带货系统源码利用FloatingActionButton实现 展开/折叠多级悬浮菜单的相关代码 1.大家看一下,我们最终提供出来的调用的示例: //初始化2个Item弹出菜单 val expand ...

最新文章

  1. android ffmpeg 编码h264,Mac系统下ffmpeg+h264+flv编码的android录制屏幕实现2
  2. 赠书 | 热潮下的冷思考,人工智能即将改变的三大领域
  3. SignalR的另类实现技巧
  4. springboot 利用configureMessageConverters add FastJsonHttpMessageConverter 实现返回JSON值 null to ...
  5. 深度学习之基于opencv和CNN实现人脸识别
  6. 德国汽车厂发生机器人杀人事件 人机协作是大势所趋
  7. 〖Demo〗-- 模拟登录
  8. 推荐一个原型设计工具Balsamiq Mockups
  9. 适合草根站长的认证产品介绍
  10. 白盒测试哪种测试效果好_比较常用的白盒测试工具有哪些?
  11. 高性能RPC框架BRPC核心机制分析
  12. Unity WebGL与浏览器脚本交互
  13. 测试用例---场景法和错误推测法
  14. 多种消息提醒系统的设计模式、实现方案(附功能截图+表结构)
  15. MyBatis高效同步百万级数据
  16. 如何让血管“返老还童”
  17. Tomcat配置HTTP协议转HTTPS协议
  18. hive的分区和分桶
  19. CDN加速与DDOS防御
  20. uplink端口能接路由器吗_交换机常见的网络故障,你知道如何解决吗?

热门文章

  1. C55X McBSP
  2. 学院官网项目三级页面总结
  3. DAY 09 Python 操作Excel
  4. GA-BP遗传神经网络预测
  5. js内置对象【学习笔记】
  6. Linux 命令(68)—— realpath 命令
  7. Python·os.path.abspath和os.path.realpath区别
  8. css3——3D动画、transform-style:preserve-3d、transform:perspective()、perspective-origin
  9. 华为Nova 4 HL1VCEM (VCE-L22/VCE-AL00)手机图纸电路原理图+主板高清图片
  10. 同大取大同小取小口诀图解_口诀巧取不等式组的解集