浏览代码

libobs: Try to pair video with one multi-track encoders

When starting a multi-track output, attempt to pair the video encoder
with one of the audio encoders to ensure that the video and audio
encoders start as close together in time as possible.  This ensures the
best possible audio/video syncing point when using multi-track audio
output.
jp9000 10 年之前
父节点
当前提交
a7067906f3
共有 1 个文件被更改,包括 20 次插入11 次删除
  1. 20 11
      libobs/obs-output.c

+ 20 - 11
libobs/obs-output.c

@@ -1384,12 +1384,26 @@ static inline bool initialize_audio_encoders(obs_output_t *output,
 	return true;
 }
 
-static inline bool pair_encoders(obs_output_t *output, size_t num_mixes)
+static inline obs_encoder_t *find_inactive_audio_encoder(obs_output_t *output,
+		size_t num_mixes)
+{
+	for (size_t i = 0; i < num_mixes; i++) {
+		struct obs_encoder *audio = output->audio_encoders[i];
+
+		if (!audio->active && !audio->paired_encoder)
+			return audio;
+	}
+
+	return NULL;
+}
+
+static inline void pair_encoders(obs_output_t *output, size_t num_mixes)
 {
-	if (num_mixes == 1) {
-		struct obs_encoder *audio = output->audio_encoders[0];
-		struct obs_encoder *video = output->video_encoder;
+	struct obs_encoder *video = output->video_encoder;
+	struct obs_encoder *audio = find_inactive_audio_encoder(output,
+			num_mixes);
 
+	if (video && audio) {
 		pthread_mutex_lock(&audio->init_mutex);
 		pthread_mutex_lock(&video->init_mutex);
 
@@ -1406,8 +1420,6 @@ static inline bool pair_encoders(obs_output_t *output, size_t num_mixes)
 		pthread_mutex_unlock(&video->init_mutex);
 		pthread_mutex_unlock(&audio->init_mutex);
 	}
-
-	return true;
 }
 
 bool obs_output_initialize_encoders(obs_output_t *output, uint32_t flags)
@@ -1432,11 +1444,8 @@ bool obs_output_initialize_encoders(obs_output_t *output, uint32_t flags)
 	if (has_audio && !initialize_audio_encoders(output, num_mixes))
 		return false;
 
-	if (has_video && has_audio) {
-		if (!pair_encoders(output, num_mixes)) {
-			return false;
-		}
-	}
+	if (has_video && has_audio)
+		pair_encoders(output, num_mixes);
 
 	return true;
 }