1.找到菜单
2.找到qmenu相关代码找到菜单代码
QString qname = QT_UTF8(name);
QAction *popupItem = new QAction(qname, this);
popupItem->setData(QT_UTF8(type));
connect(popupItem, SIGNAL(triggered(bool)), this,
SLOT(AddSourceFromAction()));
3.找到所有菜单回调事件AddSourceFromAction
void OBSBasic::AddSourceFromAction()
{
QAction *action = qobject_cast<QAction *>(sender());
if (!action)
return;
AddSource(QT_TO_UTF8(action->data().toString()));
}
获取推流的url
rtmp://hkg.contribute.live-video.net/app
推流key
live_669447722_e9f19k4TZx6RlyxHbGd1OUeubjOSBw
推流函数
void OBSBasic::StartStreaming()
{
if (outputHandler->StreamingActive())
return;
if (disableOutputsRef)
return;
if (!outputHandler->SetupStreaming(service)) {
DisplayStreamStartError();
return;
}
if (api)
api->on_event(OBS_FRONTEND_EVENT_STREAMING_STARTING);
SaveProject();
ui->streamButton->setEnabled(false);
ui->streamButton->setChecked(false);
ui->streamButton->setText(QTStr("Basic.Main.Connecting"));
if (sysTrayStream) {
sysTrayStream->setEnabled(false);
sysTrayStream->setText(ui->streamButton->text());
}
if (!outputHandler->StartStreaming(service)) {
DisplayStreamStartError();
return;
}
bool recordWhenStreaming = config_get_bool(
GetGlobalConfig(), "BasicWindow", "RecordWhenStreaming");
if (recordWhenStreaming)
StartRecording();
bool replayBufferWhileStreaming = config_get_bool(
GetGlobalConfig(), "BasicWindow", "ReplayBufferWhileStreaming");
if (replayBufferWhileStreaming)
StartReplayBuffer();
}
安装输出流
inline void SimpleOutput::SetupOutputs()
{
SimpleOutput::Update();
obs_encoder_set_video(h264Streaming, obs_get_video());
obs_encoder_set_audio(aacStreaming, obs_get_audio());
obs_encoder_set_audio(aacArchive, obs_get_audio());
if (usingRecordingPreset) {
if (ffmpegOutput) {
obs_output_set_media(fileOutput, obs_get_video(),
obs_get_audio());
} else {
obs_encoder_set_video(h264Recording, obs_get_video());
obs_encoder_set_audio(aacRecording, obs_get_audio());
}
}
}
更新输出流参数
void SimpleOutput::Update()
{
obs_data_t *h264Settings = obs_data_create();
obs_data_t *aacSettings = obs_data_create();
//6000
int videoBitrate =
config_get_uint(main->Config(), "SimpleOutput", "VBitrate");
int audioBitrate = GetAudioBitrate();//160
//false
bool advanced =
config_get_bool(main->Config(), "SimpleOutput", "UseAdvanced");
//true
bool enforceBitrate = !config_get_bool(main->Config(), "Stream1",
"IgnoreRecommended");
//null
const char *custom = config_get_string(main->Config(), "SimpleOutput",
"x264Settings");
//"x264"
const char *encoder = config_get_string(main->Config(), "SimpleOutput",
"StreamEncoder");
const char *presetType;
const char *preset;
if (strcmp(encoder, SIMPLE_ENCODER_QSV) == 0) {
presetType = "QSVPreset";
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) {
presetType = "AMDPreset";
UpdateStreamingSettings_amd(h264Settings, videoBitrate);
} else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) {
presetType = "NVENCPreset";
} else {
presetType = "Preset";
}
//presetType="Preset"
//"veryfast"
preset = config_get_string(main->Config(), "SimpleOutput", presetType);
obs_data_set_string(h264Settings, "rate_control", "CBR");
obs_data_set_int(h264Settings, "bitrate", videoBitrate);
if (advanced) {
obs_data_set_string(h264Settings, "preset", preset);
obs_data_set_string(h264Settings, "x264opts", custom);
}
obs_data_set_string(aacSettings, "rate_control", "CBR");
obs_data_set_int(aacSettings, "bitrate", audioBitrate);
//设置264的设置和aac的设置到rtmp协议服务
obs_service_apply_encoder_settings(main->GetService(), h264Settings,
aacSettings);
if (!enforceBitrate) {
obs_data_set_int(h264Settings, "bitrate", videoBitrate);
obs_data_set_int(aacSettings, "bitrate", audioBitrate);
}
//获取视频数据
video_t *video = obs_get_video();
enum video_format format = video_output_get_format(video);
if (format != VIDEO_FORMAT_NV12 && format != VIDEO_FORMAT_I420)
obs_encoder_set_preferred_video_format(h264Streaming,
VIDEO_FORMAT_NV12);
obs_encoder_update(h264Streaming, h264Settings);
obs_encoder_update(aacStreaming, aacSettings);
obs_encoder_update(aacArchive, aacSettings);
obs_data_release(h264Settings);
obs_data_release(aacSettings);
}
void obs_service_apply_encoder_settings(obs_service_t *service,
obs_data_t *video_encoder_settings,
obs_data_t *audio_encoder_settings)
{
if (!obs_service_valid(service, "obs_service_apply_encoder_settings"))
return;
if (!service->info.apply_encoder_settings)
return;
if (video_encoder_settings || audio_encoder_settings)
service->info.apply_encoder_settings(service->context.data,
video_encoder_settings,
audio_encoder_settings);
}
设置参数
static void rtmp_common_apply_settings(void *data, obs_data_t *video_settings,
obs_data_t *audio_settings)
{
struct rtmp_common *service = data;
json_t *root = open_services_file();
if (root) {
initialize_output(service, root, video_settings,
audio_settings);
json_decref(root);
}
}
初始化services.json
static void initialize_output(struct rtmp_common *service, json_t *root,
obs_data_t *video_settings,
obs_data_t *audio_settings)
{
json_t *json_service = find_service(root, service->service, NULL);
json_t *recommended;
if (!json_service) {
if (service->service && *service->service)
blog(LOG_WARNING,
"rtmp-common.c: [initialize_output] "
"Could not find service '%s'",
service->service);
return;
}
recommended = json_object_get(json_service, "recommended");
if (!recommended)
return;
if (video_settings)
apply_video_encoder_settings(video_settings, recommended);
if (audio_settings)
apply_audio_encoder_settings(audio_settings, recommended);
}
获取视频数据
video_t *obs_get_video(void)
{
return obs->video.video;
}
视频编码
void obs_encoder_set_video(obs_encoder_t *encoder, video_t *video)
{
const struct video_output_info *voi;
if (!obs_encoder_valid(encoder, "obs_encoder_set_video"))
return;
if (encoder->info.type != OBS_ENCODER_VIDEO) {
blog(LOG_WARNING,
"obs_encoder_set_video: "
"encoder '%s' is not a video encoder",
obs_encoder_get_name(encoder));
return;
}
if (!video)
return;
voi = video_output_get_info(video);
encoder->media = video;
encoder->timebase_num = voi->fps_den;
encoder->timebase_den = voi->fps_num;
}
RTMP流设置
void
RTMP_Init(RTMP *r)
{
memset(r, 0, sizeof(RTMP));
r->m_sb.sb_socket = -1;
RTMP_Reset(r);
#ifdef CRYPTO
RTMP_TLS_Init(r);
#endif
}
void
RTMP_Reset(RTMP *r)
{
r->m_inChunkSize = RTMP_DEFAULT_CHUNKSIZE;
r->m_outChunkSize = RTMP_DEFAULT_CHUNKSIZE;
r->m_bSendChunkSizeInfo = 1;
r->m_nBufferMS = 30000;
r->m_nClientBW = 2500000;
r->m_nClientBW2 = 2;
r->m_nServerBW = 2500000;
r->m_fAudioCodecs = 3191.0;
r->m_fVideoCodecs = 252.0;
r->Link.curStreamIdx = 0;
r->Link.nStreams = 0;
r->Link.timeout = 30;
r->Link.swfAge = 30;
}