0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-19 20:32:15 +02:00

obs-webrtc: Add support for audio-only and video-only outputs

Adds the `whip_output_audio` and `whip_output_video` output kinds,
which selectively advertise only video or only audio support.

To use these types, it is effectively the same as with the AV
version. Just create the output, assign your video or audio encoder,
and you're good.

libobs does not have support for "optional" outputs. With an AV output,
if you only assign a video or audio encoder, start will fail.
This commit is contained in:
tt2468 2023-12-12 21:36:27 -08:00 committed by Lain
parent cfb10ece79
commit 065d4533ee

View File

@ -83,12 +83,12 @@ void WHIPOutput::Data(struct encoder_packet *packet)
return;
}
if (packet->type == OBS_ENCODER_AUDIO) {
if (audio_track && packet->type == OBS_ENCODER_AUDIO) {
int64_t duration = packet->dts_usec - last_audio_timestamp;
Send(packet->data, packet->size, duration, audio_track,
audio_sr_reporter);
last_audio_timestamp = packet->dts_usec;
} else if (packet->type == OBS_ENCODER_VIDEO) {
} else if (video_track && packet->type == OBS_ENCODER_VIDEO) {
int64_t duration = packet->dts_usec - last_video_timestamp;
Send(packet->data, packet->size, duration, video_track,
video_sr_reporter);
@ -99,6 +99,12 @@ void WHIPOutput::Data(struct encoder_packet *packet)
void WHIPOutput::ConfigureAudioTrack(std::string media_stream_id,
std::string cname)
{
if (!obs_output_get_audio_encoder(output, 0)) {
do_log(LOG_DEBUG,
"Not configuring audio track: Audio encoder not assigned");
return;
}
auto media_stream_track_id = std::string(media_stream_id + "-audio");
uint32_t ssrc = base_ssrc;
@ -125,6 +131,12 @@ void WHIPOutput::ConfigureAudioTrack(std::string media_stream_id,
void WHIPOutput::ConfigureVideoTrack(std::string media_stream_id,
std::string cname)
{
if (!obs_output_get_video_encoder(output)) {
do_log(LOG_DEBUG,
"Not configuring video track: Video encoder not assigned");
return;
}
auto media_stream_track_id = std::string(media_stream_id + "-video");
std::shared_ptr<rtc::RtpPacketizer> packetizer;
@ -590,10 +602,11 @@ void WHIPOutput::Send(void *data, uintptr_t size, uint64_t duration,
void register_whip_output()
{
struct obs_output_info info = {};
const uint32_t base_flags = OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE;
struct obs_output_info info = {};
info.id = "whip_output";
info.flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE;
info.flags = OBS_OUTPUT_AV | base_flags;
info.get_name = [](void *) -> const char * {
return obs_module_text("Output.Name");
};
@ -630,4 +643,12 @@ void register_whip_output()
info.protocols = "WHIP";
obs_register_output(&info);
info.id = "whip_output_video";
info.flags = OBS_OUTPUT_VIDEO | base_flags;
obs_register_output(&info);
info.id = "whip_output_audio";
info.flags = OBS_OUTPUT_AUDIO | base_flags;
obs_register_output(&info);
}