[FFmpeg-devel] [PATCH] avformat/hlsenc: Dont write stream info for agroup

Brendan McGrath redmcg at redmandi.dyndns.org
Fri Jan 19 05:12:11 EET 2018


Thanks Karthick - I can confirm that your patch does solve the issue.

However - I noticed your patch does not include HEVC. I believe this 
format is now supported in HLS (and that several players including iOS 
11 now provide support).

On 19/01/18 00:41, Jeyapal, Karthick wrote:
> On 1/18/18 6:53 PM, Brendan McGrath wrote:
>> I tried your suggestion and it still didn't work. So I took another look at the spec and it looks like what was originally there was correct (as seen in the below example):
>> https://tools.ietf.org/html/rfc8216#section-8.6
>>
>> In that example - english-audio.m3u8 appears in both a MEDIA and STREAM-INF entry with the STREAM-INF entry including an AUDIO tag that references back to itself.
>>
>> So I believe this patch can be dropped.
>>
>> What I did discover was that it worked when I added a CODECS tag to the STREAM-INF variant of the audio stream. The spec just says:
>> Every EXT-X-STREAM-INF tag SHOULD include a CODECS attribute
>>
>> So I guess this is a bug in iOS.
> I agree. But, there is a patch availablehttps://patchwork.ffmpeg.org/patch/7000/  to add CODECS tag.
> You could check if applying that patch solves your issue.
>> On 18/01/18 21:59, Dixit, Vishwanath wrote:
>>> On 1/18/18 2:39 PM, Brendan McGrath wrote:
>>>> When using an 'agroup' within var_stream_map - the audio stream is
>>>> being added to the master playlist file as both an audio rendition
>>>> and an individual stream (with an AUDIO reference back to itself).
>>>>
>>>> This patch ensures an audio rendition does not also appear within
>>>> the stream info list.
>>>>
>>>> What follows is an example of the command to create this issue and
>>>> the contents of the master playlist before and after this patch is
>>>> applied:
>>>>
>>>> ffmpeg -i in.ts -b:a:0 128k -b:v:0 1800k -b:v:1 1024k -map 0:a \
>>>> -map 0:v -map 0:v -f hls -var_stream_map "a:0,agroup:audio_0 "\
>>>> "v:0,agroup:audio_0 v:1,agroup:audio_0" -master_pl_name \
>>>> tv_hls.m3u8 tv_hls_%v.m3u8
>>>>
>>>> Before:
>>>>    #EXTM3U
>>>>    #EXT-X-VERSION:3
>>>>    #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_audio_0",NAME="audio_0",DEFAULT=YES,URI="tv_hls_0.m3u8"
>>>>    #EXT-X-STREAM-INF:BANDWIDTH=140800,AUDIO="group_audio_0"
>>>>    tv_hls_0.m3u8
>>>>
>>>>    #EXT-X-STREAM-INF:BANDWIDTH=2120800,RESOLUTION=1920x1080,AUDIO="group_audio_0"
>>>>    tv_hls_1.m3u8
>>>>
>>>>    #EXT-X-STREAM-INF:BANDWIDTH=1267200,RESOLUTION=1920x1080,AUDIO="group_audio_0"
>>>>    tv_hls_2.m3u8
>>>>
>>>> After:
>>>>    #EXTM3U
>>>>    #EXT-X-VERSION:3
>>>>    #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_audio_0",NAME="audio_0",DEFAULT=YES,URI="tv_hls_0.m3u8"
>>>>    #EXT-X-STREAM-INF:BANDWIDTH=2120800,RESOLUTION=1920x1080,AUDIO="group_audio_0"
>>>>    tv_hls_1.m3u8
>>>>
>>>>    #EXT-X-STREAM-INF:BANDWIDTH=1267200,RESOLUTION=1920x1080,AUDIO="group_audio_0"
>>>>    tv_hls_2.m3u8
>>>>
>>>> Signed-off-by: Brendan McGrath<redmcg at redmandi.dyndns.org>
>>>> ---
>>>>
>>> Some use cases may need audio only variant streams. Ex: when bandwidth is too low. Also, I think the playback issue you are seeing, is because of AUDIO referencing back to itself, but, not because of audio only variant stream. So, instead of completely removing the audio only variant streams, you can just remove the self-referencing attribute (AUDIO=) from the #EXT-X-STREAM-INF tag’s attribute list, for the audio only variant streams.
>>> #EXTM3U
>>> #EXT-X-VERSION:3
>>> #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_audio_0",NAME="audio_0",DEFAULT=YES,URI="tv_hls_0.m3u8"
>>> #EXT-X-STREAM-INF:BANDWIDTH=140800
>>> tv_hls_0.m3u8
>>>
>>> #EXT-X-STREAM-INF:BANDWIDTH=2120800,RESOLUTION=1920x1080,AUDIO="group_audio_0"
>>> tv_hls_1.m3u8
>>>
>>> #EXT-X-STREAM-INF:BANDWIDTH=1267200,RESOLUTION=1920x1080,AUDIO="group_audio_0"
>>> tv_hls_2.m3u8
>>>
>>>
>>>> Pre-patch - the hls stream I was testing would not play on the iOS devices I was testing with.
>>>>
>>>> With the patch applied - they now play the stream
>>>>
>>>>    libavformat/hlsenc.c | 3 +++
>>>>    1 file changed, 3 insertions(+)
>>>>
>>>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>>>> index e36120c..a75853b 100644
>>>> --- a/libavformat/hlsenc.c
>>>> +++ b/libavformat/hlsenc.c
>>>> @@ -1172,6 +1172,9 @@ static int create_master_playlist(AVFormatContext *s,
>>>>        for (i = 0; i < hls->nb_varstreams; i++) {
>>>>            vs = &(hls->var_streams[i]);
>>>>    +        if (!vs->has_video && !vs->has_subtitle && vs->agroup)
>>>> +            continue;
>>>> +
>>>>            m3u8_name_size = strlen(vs->m3u8_name) + 1;
>>>>            m3u8_rel_name = av_malloc(m3u8_name_size);
>>>>            if (!m3u8_rel_name) {
>>> _______________________________________________
>>> 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  
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel




More information about the ffmpeg-devel mailing list