diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c index 31a7df6f8..8f6f35c03 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c @@ -34,6 +34,7 @@ struct ffmpeg_cfg { const char *url; const char *format_name; const char *format_mime_type; + const char *muxer_settings; int video_bitrate; int audio_bitrate; const char *video_encoder; @@ -361,13 +362,37 @@ static inline bool open_output_file(struct ffmpeg_data *data) sizeof(data->output->filename)); data->output->filename[sizeof(data->output->filename) - 1] = 0; - ret = avformat_write_header(data->output, NULL); + AVDictionary *dict = NULL; + if ((ret = av_dict_parse_string(&dict, data->config.muxer_settings, + "=", " ", 0))) { + blog(LOG_WARNING, "Failed to parse muxer settings: %s\n%s", + av_err2str(ret), data->config.muxer_settings); + + av_dict_free(&dict); + return false; + } + + if (av_dict_count(dict) > 0) { + struct dstr str = {0}; + + AVDictionaryEntry *entry = NULL; + while ((entry = av_dict_get(dict, "", entry, + AV_DICT_IGNORE_SUFFIX))) + dstr_catf(&str, "\n\t%s=%s", entry->key, entry->value); + + blog(LOG_INFO, "Using muxer settings:%s", str.array); + dstr_free(&str); + } + + ret = avformat_write_header(data->output, &dict); if (ret < 0) { blog(LOG_WARNING, "Error opening '%s': %s", data->config.url, av_err2str(ret)); return false; } + av_dict_free(&dict); + return true; } @@ -832,6 +857,7 @@ static bool try_connect(struct ffmpeg_output *output) config.format_name = get_string_or_null(settings, "format_name"); config.format_mime_type = get_string_or_null(settings, "format_mime_type"); + config.muxer_settings = obs_data_get_string(settings, "muxer_settings"); config.video_bitrate = (int)obs_data_get_int(settings, "video_bitrate"); config.audio_bitrate = (int)obs_data_get_int(settings, "audio_bitrate"); config.video_encoder = get_string_or_null(settings, "video_encoder");