基于OBS二次开发的录屏工具,使用OBS的SDK和Qt开发的工具。QT 5.15.2 MSVC 64编译。
添加视频源
int obsRecord::AddSource(eCaptureType model)
{
//清除之前的Source
clearScene();
//音频源处理
obs_set_output_source(kChannelTransitions, NULL);
obs_set_output_source(kChannelOutput, NULL);
obs_set_output_source(kChannelInput, NULL);
//设置淡入淡出
size_t idx = 0;
const char *id;
/* automatically add transitions that have no configuration (things
* such as cut/fade/etc) */
while (obs_enum_transition_types(idx++, &id)) {
if (!obs_is_source_configurable(id)) {
const char *name = obs_source_get_display_name(id);
obs_source_t *tr =
obs_source_create_private(id, name, NULL);
if (strcmp(id, "fade_transition") == 0)
fadeTransition_ = tr;
}
}
if(!fadeTransition_)
return false;
obs_set_output_source(kChannelTransitions, fadeTransition_);
obs_source_release(fadeTransition_);
obs_source_t *s = obs_get_output_source(kChannelTransitions);
obs_transition_set(s, obs_scene_get_source(scene_));
obs_source_release(s);
//音频输入输出源添加
if(HasAudioDevices(OUTPUT_AUDIO_SOURCE))
ResetAudioDevice(OUTPUT_AUDIO_SOURCE, "default", "DesktopDevice1", kChannelOutput);
if(HasAudioDevices(INPUT_AUDIO_SOURCE))
ResetAudioDevice(INPUT_AUDIO_SOURCE, "default", "AuxDevice1", kChannelInput);
//设置降噪处理
AddFilterToAudioInput("noise_suppress_filter");
//添加画面采集源
if(model == kCaptureWindow)
{
captureSource_ = obs_source_create(CaptureWindowID, "WindowCapture", NULL, NULL);
}
else if(model == kCaptureMonitor)
{
captureSource_ = obs_source_create(CaptureMonitorID, "CaptureMonitor", NULL, NULL);
}
if(!captureSource_)
return false;
eCaptureModel_ = model;
//添加Source到场景中
obs_enter_graphics();
obs_scene_atomic_update(scene_, AddSourceToScene, captureSource_);
obs_leave_graphics();
//设置默认采集窗口
// obs_data_t *setting = obs_source_get_settings(captureSource_);
// obs_data_t *cpSetting = obs_data_create();
// obs_data_apply(cpSetting, setting);
// obs_data_release(setting);
captureSourceProperty_ = obs_source_properties(captureSource_);
printf("AddSource Success\n");
return true;
}
开始录制
bool obsRecord::startRecording(const std::string &fileName)
{
OBSDataAutoRelease settings = obs_data_create();
obs_data_set_string(settings, "url", fileName.c_str());
obs_data_set_string(settings, "format_name", ".mp4");
obs_data_set_string(settings, "format_mime_type", "mime/mp4");
obs_data_set_string(settings, "muxer_settings", "movflags=faststart");
// obs_data_set_int(settings, "gop_size", 200);
obs_data_set_int(settings, "gop_size", m_FPS * 10);
obs_data_set_int(settings, "video_bitrate", 150);
obs_data_set_string(settings, "video_encoder", "libx264");
obs_data_set_int(settings, "video_encoder_id", AV_CODEC_ID_H264); //AV_CODEC_ID_H264
obs_data_set_string(settings, "video_settings", "profile=main x264-params=crf=22");
obs_data_set_int(settings, "audio_bitrate", 128);
obs_data_set_string(settings, "audio_encoder", "aac");
obs_data_set_int(settings, "audio_encoder_id", AV_CODEC_ID_AAC); //AV_CODEC_ID_AAC
obs_data_set_string(settings, "audio_settings", NULL);
obs_output_set_mixers(recordOutput_, 1);
obs_output_set_media(recordOutput_, obs_get_video(), obs_get_audio());
obs_output_update(recordOutput_, settings);
obs_data_release(settings);
if(obs_output_start(recordOutput_))
return true;
blog(LOG_ERROR, "start failed");
return false;
}
OBS 二次开发插件录屏