Mac 使用 OBS 直播¶

Mac 使用 OBS 直播¶
OBS¶
开源、全平台最好的直播串流软件之一。
开源意味着更多人维护,更新快、性能好、bug较少
支持的功能能够覆盖直播推流的所有需求
注:如果是Windows电脑可以直接使用Bilibili官方的直播姬进行直播推流,使用体验没得说
安装OBS¶
官网下载 https://obsproject.com
Mac电脑选择macOS版本下载
下载好之后将软件拖动到电脑的应用程序文件夹即可
设置语言¶
打开软件之后,右下角可以进入设置,或者使用快捷键 ⌘, ,然后设置语言
OBS简单使用¶
直播是什么:把声音和画面混合在一起 将音视频诗句传输至B站直播服务器
Scene Source Audio Mixer Controls
Scene 场景
一整个开播的场景
比如平日开发代码直播是一种
直播iPad打原神是一种
和别的同学联动聊天的界面是一种
歌回的界面是一种
不同场景中的声音和画面不同,使用的组件和UI不同
Source 源
主要
Video Capture Device 视频捕捉
用来接入摄像头或iPad画面
QuickTime Player 也可以捕获iPad界面,性能更好,但稍微有一点延迟
Display Capture 显示器捕捉
主要用来捕捉Mac的屏幕
如果有外接显示器可以将OBS放到外接显示器上,然后捕捉主显示器(反过来也可以)
Window Capture 应用窗口捕捉
比如显示正在播放的音乐可以捕捉 Music.app 的界面
Browser 浏览器捕捉
只要是浏览器的界面 都可以通过输入链接进行捕获
Audio Input Capture 音频捕捉
音源:
电脑发出的声音(提示音 网页播放的视频声音 音乐软件播放的声音)
外置麦克风的声音
推流:
直播观众需要听到的声音
需要调整不同音源的音量
音响:
联动时需要听到别人的声音
电脑播放视频或音乐的时候自己也想听到
次要
Image 图像
放静态图片当背景或插画
Text 说明文字
放一些直播的说明
Media Source 媒体(视频、音频等)
比如开场动画和需要播放的视频
Group用来分组
注意不支持嵌套组
使用 Scene 场景 管理不同的页面是官方更推荐的方法
Audio Mixer 混音器
主要用来调声音 需要观众帮忙确认声音大小
右键 > Filter > Noise Suppression > 选择一种降噪方式
视频设置¶
绿幕抠像:对于输入的视频源,右键 > Filter > 左下角加号 > Chroma Key 选择绿色、拖动滑动条选择抠掉绿色的程度
在OBS上选择其他画面
思路:
使用OBS支持的脚本设置文本框的文本
使用浏览器捕获窗口
在屏幕上显示当前日期:见附录
在屏幕上显示B站弹幕:
https://comen.app 输入直播间的id就可以进行直播间弹幕的捕获。
问题是背景不是透明的 还在开发中
GitHub | 3Shain - Comen
音频设置¶
目标:耳机听到系统发出的声音,自己的语音和耳机听到的声音推流到观众端
设置方法:
在https://github.com/ExistentialAudio/BlackHole下载 BlackHole 并按照说明进行安装(安装好后 系统的声音会通过这个BlackHole的管道 到达BlackHole的输出;macOS是不能录制Mac内部发出的声音的(音乐版权保护))
打开macOS中的 Audio MIDI Setup.app,点击左下角加号添加多输出设备,添加耳机和BlackHole,Mac内部的音量需要既输出到耳机,又输出到BlackHole
然后打开系统设置,在 Sound 音频 中选择输出设备为刚才创建的多输出设备。输入选择外置麦克风(注意如果使用AirPods 不要同时将AirPods作为输入和输出 音质会特别差)
打开OBS,在 Source 源 处添加输入音频
外置麦克风
BlackHole 因为创建了多输出设备 所以你耳机中听到的声音和BlackHole输入进OBS的声音是一致的
Controls 设置¶
Stream 串流
打开 Bilibili直播中心 > 我的直播间 > 开播设置,复制服务器地址和串流密钥到OBS设置中。点击开始串流即可开始直播。
Output 输出
输出码率根据上传网速选择 比如我家的上传网速最高是 2 MB/s,折算为 16000kbps,那么码率最高设置这么高
码率越高压缩越少、画质越好;但需要考虑设备性能
Audio 音频
全局音频全部关掉 使用 Source 源 进行捕获即可
采样率调到48kHz(最高音质 音频占不了多少存储)
Video 视频
注意如果设备GPU和网络性能不是特别好的话好把帧率和分辨率调低一些
Hotkeys 快捷键
比如你要快速开麦、放一些图可以使用快捷键操作;按自己的需求来
Advanced 高级
一般不用动 如果只是使用的话
附¶
OBS时间显示 脚本¶
lua脚本是不需要安装额外解析程序的,可以直接在OBS的菜单栏选择脚本设置参数进行使用。
菜单栏 > Tools > Scripts 点击左下角加号添加时间脚本,按照下面的方式设置参数。因为要分两行显示,所以可以创建两个相同的脚本:
current_date.lua %a %b %d Mon Feb 07
current_time.lua %X 20:21:05
Lua 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139--[[ OBS Studio datetime script
This script transforms a text source into a digital clock. The datetime format
is configurable and uses the same syntax than the Lua os.date() call.
]]
obs = obslua
source_name = ""
datetime_format = ""
activated = false
-- Function to set the time text
function set_datetime_text(source, format)
local text = os.date(format)
local settings = obs.obs_data_create()
obs.obs_data_set_string(settings, "text", text)
obs.obs_source_update(source, settings)
obs.obs_data_release(settings)
end
function timer_callback()
local source = obs.obs_get_source_by_name(source_name)
if source ~= nil then
set_datetime_text(source, datetime_format)
obs.obs_source_release(source)
end
end
function activate(activating)
if activated == activating then
return
end
activated = activating
if activating then
obs.timer_add(timer_callback, 1000)
else
obs.timer_remove(timer_callback)
end
end
-- Called when a source is activated/deactivated
function activate_signal(cd, activating)
local source = obs.calldata_source(cd, "source")
if source ~= nil then
local name = obs.obs_source_get_name(source)
if (name == source_name) then
activate(activating)
end
end
end
function source_activated(cd)
activate_signal(cd, true)
end
function source_deactivated(cd)
activate_signal(cd, false)
end
function reset()
activate(false)
local source = obs.obs_get_source_by_name(source_name)
if source ~= nil then
local active = obs.obs_source_showing(source)
obs.obs_source_release(source)
activate(active)
end
end
----------------------------------------------------------
function script_description()
return "Sets a text source to act as a clock when the source is active.\
\
The datetime format can use the following tags:\
\
%a abbreviated weekday name (e.g., Wed)\
%A full weekday name (e.g., Wednesday)\
%b abbreviated month name (e.g., Sep)\
%B full month name (e.g., September)\
%c date and time (e.g., 09/16/98 23:48:10)\
%d day of the month (16) [01-31]\
%H hour, using a 24-hour clock (23) [00-23]\
%I hour, using a 12-hour clock (11) [01-12]\
%M minute (48) [00-59]\
%m month (09) [01-12]\
%p either \"am\" or \"pm\" (pm)\
%S second (10) [00-61]\
%w weekday (3) [0-6 = Sunday-Saturday]\
%x date (e.g., 09/16/98)\
%X time (e.g., 23:48:10)\
%Y full year (1998)\
%y two-digit year (98) [00-99]\
%% the character `%´"
end
function script_properties()
local props = obs.obs_properties_create()
obs.obs_properties_add_text(props, "format", "Datetime format", obs.OBS_TEXT_DEFAULT)
local p = obs.obs_properties_add_list(props, "source", "Text Source", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING)
local sources = obs.obs_enum_sources()
if sources ~= nil then
for _, source in ipairs(sources) do
source_id = obs.obs_source_get_id(source)
if source_id == "text_gdiplus" or source_id == "text_ft2_source" then
local name = obs.obs_source_get_name(source)
obs.obs_property_list_add_string(p, name, name)
end
end
end
obs.source_list_release(sources)
return props
end
function script_defaults(settings)
obs.obs_data_set_default_string(settings, "format", "%X")
end
function script_update(settings)
activate(false)
source_name = obs.obs_data_get_string(settings, "source")
datetime_format = obs.obs_data_get_string(settings, "format")
reset()
end
function script_load(settings)
local sh = obs.obs_get_signal_handler()
obs.signal_handler_connect(sh, "source_show", source_activated)
obs.signal_handler_connect(sh, "source_hide", source_deactivated)
end