[FFmpeg-devel] [PATCH] [HLS] Add LANGUAGE attribute to #EXT-X-MEDIA tag for audio-only variant streams.

Philippe Symons philippe.symons at gmail.com
Thu Nov 15 01:29:00 EET 2018


Hello everyone,

Here is the new version of the patch in which the comments on the curly
braces have been resolved as well.

I hope it's okay now.

Best regards,

Philippe Symons

Op do 15 nov. 2018 om 00:13 schreef Philippe Symons <
philippe.symons at gmail.com>:

> Hold on, I just noticed the feedback on the curly braces. I'll create a
> new version of the patch to resolve this as well.
>
> Op wo 14 nov. 2018 om 23:49 schreef Philippe Symons <
> philippe.symons at gmail.com>:
>
>> Hello,
>>
>> I've created a new version of the patch in which the second empty line
>> was removed. I couldn't find any other feedback inline in your response, so
>> that's all I changed.
>>
>> Best regards,
>>
>> Philippe Symons
>>
>>
>> Op di 13 nov. 2018 om 03:29 schreef Liu Steven <lq at chinaffmpeg.org>:
>>
>>>
>>>
>>> > 在 2018年11月13日,上午6:36,Philippe Symons <philippe.symons at gmail.com> 写道:
>>> >
>>> > Hello everyone,
>>> >
>>> > This is my first patch to FFMpeg or any open-source project for that
>>> > matter. In this patch, I've added the LANGUAGE attribute to the
>>> > #EXT-X-MEDIA tag for for audio only variant streams for HLS streams.
>>> >
>>> > This attribute will be added to the output in
>>> > avformats' ff_hls_write_audio_rendition() function, if the language
>>> code
>>> > can be found in the metadata of the variant stream.
>>> >
>>> > The reason why I implemented this, was because I was working with a
>>> player
>>> > which needs this attribute to determine the language of the audio
>>> stream.
>>> > After asking the question on StackOverflow (
>>> >
>>> https://stackoverflow.com/questions/53205283/ffmpeg-hls-multiple-audio-languages-with-var-stream-map-ext-x-mediatype-doesn/53206492#53206492
>>> ),
>>> > I noticed that it wasn't implemented.
>>> >
>>> > I've tested these changes with the following command:
>>> >
>>> > ffmpeg -re -i /home/philippe/Videos/example.ts -map 0:v -c:v copy -map
>>> 0:a
>>> > -c:a copy -f hls -hls_time 6 -hls_list_size 10 -hls_flags
>>> > delete_segments+program_date_time -hls_segment_filename
>>> > "/var/www/html/live/stream_%v_%d.ts" -var_stream_map "v:0,agroup:lang
>>> > a:0,agroup:lang a:1,agroup:lang a:2,agroup:lang a:
>>> > 3,agroup:lang" -master_pl_name master.m3u8
>>> /var/www/html/live/stream-%v.m3u8
>>> >
>>> > Looking forward to your feedback. I hope it's okay.
>>> >
>>>
>>> Signed-off-by: Philippe Symons <philippe.symons at gmail.com>
>>> ---
>>>  libavformat/dashenc.c     |  2 +-
>>>  libavformat/hlsenc.c      | 24 ++++++++++++++++++++++--
>>>  libavformat/hlsplaylist.c |  6 +++++-
>>>  libavformat/hlsplaylist.h |  2 +-
>>>  4 files changed, 29 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
>>> index f8b3d106d5..ca5ef01e3f 100644
>>> --- a/libavformat/dashenc.c
>>> +++ b/libavformat/dashenc.c
>>> @@ -897,7 +897,7 @@ static int write_manifest(AVFormatContext *s, int
>>> final)
>>>              if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
>>>                  continue;
>>>              get_hls_playlist_name(playlist_file, sizeof(playlist_file),
>>> NULL, i);
>>> -            ff_hls_write_audio_rendition(c->m3u8_out, (char
>>> *)audio_group,
>>> +            ff_hls_write_audio_rendition(c->m3u8_out, (char
>>> *)audio_group, NULL,
>>>                                           playlist_file, i, is_default);
>>>              max_audio_bitrate = FFMAX(st->codecpar->bit_rate +
>>>                                        os->muxer_overhead,
>>> max_audio_bitrate);
>>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>>> index e0048aa9d8..b31daa108e 100644
>>> --- a/libavformat/hlsenc.c
>>> +++ b/libavformat/hlsenc.c
>>> @@ -1205,7 +1205,6 @@ static int create_master_playlist(AVFormatContext
>>> *s,
>>>      }
>>>
>>>      set_http_options(s, &options, hls);
>>> -
>>>      ret = hlsenc_io_open(s, &hls->m3u8_out, hls->master_m3u8_url,
>>> &options);
>>>      av_dict_free(&options);
>>>      if (ret < 0) {
>>> @@ -1228,12 +1227,33 @@ static int
>>> create_master_playlist(AVFormatContext *s,
>>>
>>>      /* For audio only variant streams add #EXT-X-MEDIA tag with
>>> attributes*/
>>>      for (i = 0; i < hls->nb_varstreams; i++) {
>>> +        AVFormatContext* var_context;
>>> +        char* language = NULL;
>>> +
>>>          vs = &(hls->var_streams[i]);
>>> +        var_context = vs->avf;
>>>
>>>          if (vs->has_video || vs->has_subtitle || !vs->agroup)
>>>              continue;
>>>
>>>          m3u8_name_size = strlen(vs->m3u8_name) + 1;
>>> +
>>> +        /*
>>> +         * Try to obtain the language code of the audio stream.
>>> +         * -if available- it will be used to write the LANGUAGE
>>> +         * attribute in the #EXT-X-MEDIA tag
>>> +         */
>>> +        if(var_context && var_context->nb_streams > 0)
>>> +        {
>>> if (var_context && var_context->nb_streams > 0) {
>>> +            AVDictionary* meta_dict = vs->streams[0]->metadata;
>>> +            AVDictionaryEntry *langEntry = av_dict_get(meta_dict,
>>> "language", NULL, 0);
>>> +            if(langEntry)
>>> +            {
>>>  if (langEntry) {
>>> +                language = langEntry->value;
>>> +            }
>>> +        }
>>> +
>>> +
>>>
>>> two empty line?
>>>          m3u8_rel_name = av_malloc(m3u8_name_size);
>>>          if (!m3u8_rel_name) {
>>>              ret = AVERROR(ENOMEM);
>>> @@ -1247,7 +1267,7 @@ static int create_master_playlist(AVFormatContext
>>> *s,
>>>              goto fail;
>>>          }
>>>
>>> -        ff_hls_write_audio_rendition(hls->m3u8_out, vs->agroup,
>>> m3u8_rel_name, 0, 1);
>>> +        ff_hls_write_audio_rendition(hls->m3u8_out, vs->agroup,
>>> language, m3u8_rel_name, 0, 1);
>>>
>>>          av_freep(&m3u8_rel_name);
>>>      }
>>> diff --git a/libavformat/hlsplaylist.c b/libavformat/hlsplaylist.c
>>> index efcbff0009..42c7cf5727 100644
>>> --- a/libavformat/hlsplaylist.c
>>> +++ b/libavformat/hlsplaylist.c
>>> @@ -35,12 +35,16 @@ void ff_hls_write_playlist_version(AVIOContext *out,
>>> int version) {
>>>      avio_printf(out, "#EXT-X-VERSION:%d\n", version);
>>>  }
>>>
>>> -void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup,
>>> +void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup, char*
>>> language,
>>>                                    char *filename, int name_id, int
>>> is_default) {
>>>      if (!out || !agroup || !filename)
>>>          return;
>>>
>>>      avio_printf(out, "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"group_%s\"",
>>> agroup);
>>> +
>>> +    if(language)
>>> +        avio_printf(out, ",LANGUAGE=\"%s\"", language);
>>> +
>>>      avio_printf(out, ",NAME=\"audio_%d\",DEFAULT=%s,URI=\"%s\"\n",
>>> name_id,
>>>                       is_default ? "YES" : "NO", filename);
>>>  }
>>> diff --git a/libavformat/hlsplaylist.h b/libavformat/hlsplaylist.h
>>> index 5054b01c8f..faf1ccdd02 100644
>>> --- a/libavformat/hlsplaylist.h
>>> +++ b/libavformat/hlsplaylist.h
>>> @@ -37,7 +37,7 @@ typedef enum {
>>>  } PlaylistType;
>>>
>>>  void ff_hls_write_playlist_version(AVIOContext *out, int version);
>>> -void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup,
>>> +void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup, char*
>>> language,
>>>                                    char *filename, int name_id, int
>>> is_default);
>>>  void ff_hls_write_stream_info(AVStream *st, AVIOContext *out,
>>>                                int bandwidth, char *filename, char
>>> *agroup,
>>> --
>>> 2.17.1
>>>
>>>
>>>
>>>
>>>
>>>
>>> > Best regards,
>>> >
>>> > Philippe Symons
>>> >
>>> <0001-HLS-Add-LANGUAGE-attribute-to-EXT-X-MEDIA-tag-for-au.patch>_______________________________________________
>>> > ffmpeg-devel mailing list
>>> > ffmpeg-devel at ffmpeg.org
>>> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>>
>>>
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-HLS-Add-LANGUAGE-attribute-to-EXT-X-MEDIA-tag-for.patch
Type: text/x-patch
Size: 4771 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181115/e3a5c0d1/attachment.bin>


More information about the ffmpeg-devel mailing list