[FFmpeg-devel] [PATCH 4/4] ffmpeg: add -amerge option to merge audio streams.

Matthieu Bouron matthieu.bouron at gmail.com
Mon Mar 26 17:09:38 CEST 2012


2012/3/24 Stefano Sabatini <stefasab at gmail.com>:
> On date Thursday 2012-03-22 16:50:41 +0100, Clément Bœsch encoded:
>> From: Clément Bœsch <clement.boesch at smartjog.com>
>>
>> Work done in collaboration with Matthieu Bouron <matthieu.bouron at smartjog.com>.
>> ---
>>  Changelog       |    1 +
>>  doc/ffmpeg.texi |   40 ++++++++++++++------
>>  ffmpeg.c        |  111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>>  3 files changed, 138 insertions(+), 14 deletions(-)
> [...]
>> +static int opt_amerge(OptionsContext *o, const char *opt, const char *arg)
>> +{
>> +#if !CONFIG_LAVFI_INDEV
>> +    av_log(NULL, AV_LOG_ERROR, "Audio merge is only supported with lavfi device enabled.\n");
>> +#else
>> +    int i, nb_astreams = 0;
>> +    const int auto_ist_pick = !o->nb_stream_maps;
>
>> +    char *afilter, lavfi_map_buf[32];
>> +    AVBPrint lavfi;
>
> nit++:
> lavfi         -> lavfi_graph_buf
> afilter       -> lavfi_graph_str
>
> or similiar looks more intelligible to me
>
>> +
>> +#define DO_MAP(stream_idx) do {                                             \
>> +    const int file_index = input_streams[stream_idx].file_index;            \
>> +    snprintf(lavfi_map_buf, sizeof(lavfi_map_buf), "%d:%d",                 \
>> +             file_index, stream_idx - input_files[file_index].ist_index);   \
>> +    parse_option(o, "map", lavfi_map_buf, options);                         \
>> +} while (0)
>> +
>> +    if (!nb_input_files) {
>> +        av_log(NULL, AV_LOG_FATAL, "No input specified before calling -amerge\n");
>> +        return AVERROR(EINVAL);
>> +    }
>> +
>> +    /* auto input stream pick mode if user has not specified any -map. This
>> +     * allows command line such as:
>> +     *   ffmpeg -i merge-my-audio-streams.mpg -c:v copy -amerge out.mpg */
>> +    if (auto_ist_pick) {
>> +
>> +        /* best video stream */
>> +        i = get_best_input_stream_index(AVMEDIA_TYPE_VIDEO);
>> +        if (i >= 0)
>> +            DO_MAP(i);
>> +
>> +        /* all audio streams (so they are all merged) */
>> +        for (i = 0; i < nb_input_streams; i++)
>> +            if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
>> +                DO_MAP(i);
>> +    }
>> +
>> +    /* prepare the audio sources based on all the audio mapped streams and
>> +     * disable the audio maps */
>> +    av_bprint_init(&lavfi, 256, 1);
>> +    for (i = 0; i < o->nb_stream_maps; i++) {
>> +        const StreamMap *map = &o->stream_maps[i];
>> +        const char *ifname = input_files[map->file_index].ctx->filename;
>> +        const InputStream *ist;
>> +
>> +        ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
>> +        if (map->disabled || map->protected || ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
>> +            continue;
>> +        av_bprintf(&lavfi, "\namovie=%s:si=%d [a%d];", ifname, map->stream_index, nb_astreams++);
>
> I see this is quite limited. Suppose that the user wants to specify a
> seek point or time, or in general codec/format options for the input
> file, this won't be possible. We can surely add such options to movie,
> but in general mapping ffmpeg options to *movie options will be a
> problem, and very hard to maintain, since they use rather different
> logics.

Hi,

The purpose of this option is to keep the command line simple (and so
quite limited) for basic operations, avoiding user to specify the
whole lavfi input and stream mapping.
Generating D10 MXF files (which require one audio streaming with 4 or
8 channels) is a good use case for this option.

>
> [...]
> --
> FFmpeg = Frenzy and Faithless Majestic Philosofic Eretic God
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list