lavf/segment: add segment_format_options option

This commit is contained in:
Stefano Sabatini 2014-09-06 15:43:11 +02:00
parent 2c5c37ade1
commit 4f5493fe23
3 changed files with 35 additions and 3 deletions

View File

@ -804,6 +804,11 @@ reference stream. The default value is @code{auto}.
Override the inner container format, by default it is guessed by the filename Override the inner container format, by default it is guessed by the filename
extension. extension.
@item segment_format_options @var{options_list}
Set output format options using a :-separated list of key=value
parameters. Values containing the @code{:} special character must be
escaped.
@item segment_list @var{name} @item segment_list @var{name}
Generate also a listfile named @var{name}. If not specified no Generate also a listfile named @var{name}. If not specified no
listfile is generated. listfile is generated.
@ -958,6 +963,12 @@ generated segments to @file{out.list}:
ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nut ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nut
@end example @end example
@item
Segment input and set output format options for the output segments:
@example
ffmpeg -i in.mkv -f segment -segment_time 10 -segment_format_options movflags=+faststart out%03d.mp4
@end example
@item @item
As the example above, but segment the input file according to the split As the example above, but segment the input file according to the split
points specified by the @var{segment_times} option: points specified by the @var{segment_times} option:

View File

@ -73,6 +73,8 @@ typedef struct {
AVOutputFormat *oformat; AVOutputFormat *oformat;
AVFormatContext *avf; AVFormatContext *avf;
char *format; ///< format to use for output segment files char *format; ///< format to use for output segment files
char *format_options_str; ///< format options to use for output segment files
AVDictionary *format_options;
char *list; ///< filename for the segment list file char *list; ///< filename for the segment list file
int list_flags; ///< flags affecting list generation int list_flags; ///< flags affecting list generation
int list_size; ///< number of entries for the segment list file int list_size; ///< number of entries for the segment list file
@ -563,6 +565,7 @@ static int seg_write_header(AVFormatContext *s)
{ {
SegmentContext *seg = s->priv_data; SegmentContext *seg = s->priv_data;
AVFormatContext *oc = NULL; AVFormatContext *oc = NULL;
AVDictionary *options = NULL;
int ret; int ret;
seg->segment_count = 0; seg->segment_count = 0;
@ -594,6 +597,15 @@ static int seg_write_header(AVFormatContext *s)
} }
} }
if (seg->format_options_str) {
ret = av_dict_parse_string(&seg->format_options, seg->format_options_str, "=", ":", 0);
if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Could not parse format options list '%s'\n",
seg->format_options_str);
goto fail;
}
}
if (seg->list) { if (seg->list) {
if (seg->list_type == LIST_TYPE_UNDEFINED) { if (seg->list_type == LIST_TYPE_UNDEFINED) {
if (av_match_ext(seg->list, "csv" )) seg->list_type = LIST_TYPE_CSV; if (av_match_ext(seg->list, "csv" )) seg->list_type = LIST_TYPE_CSV;
@ -645,7 +657,14 @@ static int seg_write_header(AVFormatContext *s)
goto fail; goto fail;
} }
if ((ret = avformat_write_header(oc, NULL)) < 0) { av_dict_copy(&options, seg->format_options, 0);
ret = avformat_write_header(oc, &options);
if (av_dict_count(options)) {
av_log(s, AV_LOG_ERROR,
"Some of the provided format options in '%s' are not recognized\n", seg->format_options_str);
}
av_dict_free(&options);
if (ret < 0) {
avio_close(oc->pb); avio_close(oc->pb);
goto fail; goto fail;
} }
@ -799,6 +818,7 @@ fail:
if (seg->list) if (seg->list)
avio_close(seg->list_pb); avio_close(seg->list_pb);
av_dict_free(&seg->format_options);
av_opt_free(seg); av_opt_free(seg);
av_freep(&seg->times); av_freep(&seg->times);
av_freep(&seg->frames); av_freep(&seg->frames);
@ -820,6 +840,7 @@ fail:
static const AVOption options[] = { static const AVOption options[] = {
{ "reference_stream", "set reference stream", OFFSET(reference_stream_specifier), AV_OPT_TYPE_STRING, {.str = "auto"}, CHAR_MIN, CHAR_MAX, E }, { "reference_stream", "set reference stream", OFFSET(reference_stream_specifier), AV_OPT_TYPE_STRING, {.str = "auto"}, CHAR_MIN, CHAR_MAX, E },
{ "segment_format", "set container format used for the segments", OFFSET(format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, { "segment_format", "set container format used for the segments", OFFSET(format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
{ "segment_format_options", "set list of options for the container format used for the segments", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
{ "segment_list", "set the segment list filename", OFFSET(list), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, { "segment_list", "set the segment list filename", OFFSET(list), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
{ "segment_list_flags","set flags affecting segment list generation", OFFSET(list_flags), AV_OPT_TYPE_FLAGS, {.i64 = SEGMENT_LIST_FLAG_CACHE }, 0, UINT_MAX, E, "list_flags"}, { "segment_list_flags","set flags affecting segment list generation", OFFSET(list_flags), AV_OPT_TYPE_FLAGS, {.i64 = SEGMENT_LIST_FLAG_CACHE }, 0, UINT_MAX, E, "list_flags"},

View File

@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 56 #define LIBAVFORMAT_VERSION_MAJOR 56
#define LIBAVFORMAT_VERSION_MINOR 4 #define LIBAVFORMAT_VERSION_MINOR 4
#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_MICRO 101
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \ LIBAVFORMAT_VERSION_MINOR, \