diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c index b214105b6..67c1a2e2d 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c @@ -375,18 +375,33 @@ inline static void ts_offset_update(struct ffmpeg_muxer *stream, stream->found_audio[packet->track_idx] = true; } -static bool ffmpeg_mux_start(void *data) +static inline void update_encoder_settings(struct ffmpeg_muxer *stream, + const char *path) { - struct ffmpeg_muxer *stream = data; - obs_data_t *settings; - const char *path; + obs_encoder_t *vencoder = obs_output_get_video_encoder(stream->output); + const char *ext = strrchr(path, '.'); + + /* if using m3u8, repeat headers */ + if (ext && strcmp(ext, ".m3u8") == 0) { + obs_data_t *settings = obs_encoder_get_settings(vencoder); + obs_data_set_bool(settings, "repeat_headers", true); + obs_encoder_update(vencoder, settings); + obs_data_release(settings); + } +} + +static inline bool ffmpeg_mux_start_internal(struct ffmpeg_muxer *stream, + obs_data_t *settings) +{ + const char *path = obs_data_get_string(settings, "path"); + + update_encoder_settings(stream, path); if (!obs_output_can_begin_data_capture(stream->output, 0)) return false; if (!obs_output_initialize_encoders(stream->output, 0)) return false; - settings = obs_output_get_settings(stream->output); if (stream->is_network) { obs_service_t *service; service = obs_output_get_service(stream->output); @@ -395,7 +410,6 @@ static bool ffmpeg_mux_start(void *data) path = obs_service_get_url(service); stream->split_file = false; } else { - path = obs_data_get_string(settings, "path"); stream->max_time = obs_data_get_int(settings, "max_time_sec") * 1000000LL; @@ -427,7 +441,6 @@ static bool ffmpeg_mux_start(void *data) } start_pipe(stream, path); - obs_data_release(settings); if (!stream->pipe) { obs_output_set_last_error( @@ -446,6 +459,17 @@ static bool ffmpeg_mux_start(void *data) return true; } +static bool ffmpeg_mux_start(void *data) +{ + struct ffmpeg_muxer *stream = data; + + obs_data_t *settings = obs_output_get_settings(stream->output); + bool success = ffmpeg_mux_start_internal(stream, settings); + obs_data_release(settings); + + return success; +} + int deactivate(struct ffmpeg_muxer *stream, int code) { int ret = -1; diff --git a/plugins/obs-ffmpeg/texture-amf.cpp b/plugins/obs-ffmpeg/texture-amf.cpp index 6a1796726..f5487e5b1 100644 --- a/plugins/obs-ffmpeg/texture-amf.cpp +++ b/plugins/obs-ffmpeg/texture-amf.cpp @@ -1158,6 +1158,11 @@ static bool amf_avc_init(void *data, obs_data_t *settings) : 250; set_avc_property(enc, IDR_PERIOD, gop_size); + + bool repeat_headers = obs_data_get_bool(settings, "repeat_headers"); + if (repeat_headers) + set_avc_property(enc, HEADER_INSERTION_SPACING, gop_size); + set_avc_property(enc, DE_BLOCKING_FILTER, true); const char *ffmpeg_opts = obs_data_get_string(settings, "ffmpeg_opts");