lavf/segment: add segment_format_options option
This commit is contained in:
parent
2c5c37ade1
commit
4f5493fe23
@ -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:
|
||||||
|
@ -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"},
|
||||||
|
@ -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, \
|
||||||
|
Loading…
Reference in New Issue
Block a user