[FFmpeg-devel] how to download specific track data of a m3u8 content?

Halley Zhao aihua.halley.zhao at gmail.com
Fri Jul 1 07:20:22 CEST 2016


I tried ffplay on Ubuntu15.10, not expected result. seems buggy:
  ffplay.c, 3160, got packet with stream_index: 0
  ffplay.c, 3160, got packet with stream_index: 2
  ffplay.c, 3160, got packet with stream_index: 4
  ffplay.c, 3160, got packet with stream_index: 0
  ffplay.c, 3160, got packet with stream_index: 2
  ffplay.c, 3160, got packet with stream_index: 4
  ffplay.c, 3160, got packet with stream_index: 0
  ffplay.c, 3160, got packet with stream_index: 2


2016-07-01 9:22 GMT+08:00 Halley Zhao <aihua.halley.zhao at gmail.com>:

> I tried it; but got unexpected result.
> the pkt of discarded stream (stream_index) is still got from
> av_read_frame().
>
> my code is here:
> https://github.com/halleyzhao/player-ffmpeg-yami/blob/m3u8/player.c
>
> ## the code piece is here:
>     #define MAX_TRACK_COUNT     10
>     uint32_t video_tracks[MAX_TRACK_COUNT], video_track_count = 0;
>     uint32_t audio_tracks[MAX_TRACK_COUNT], audio_track_count = 0;
>     for (i = 0; i < pFormat->nb_streams; i++) {
>         if (pFormat->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
>             video_tracks[video_track_count++] = i;
>         } else if (pFormat->streams[i]->codec->codec_type ==
> AVMEDIA_TYPE_AUDIO) {
>             audio_tracks[audio_track_count++] = i;
>         }
>         pFormat->streams[i]->discard = AVDISCARD_ALL;
>     }
>
>     if (video_track_count) {
>         video_track_index = 0;
>         video_stream_index = video_tracks[video_track_index];
>         pFormat->streams[video_stream_index]->discard = AVDISCARD_DEFAULT;
>     }
>     if (audio_track_count) {
>         audio_track_index = 0;
>         audio_stream_index = audio_tracks[audio_track_index];
>         pFormat->streams[audio_stream_index]->discard = AVDISCARD_DEFAULT;
>     }
> ## and the result is here: video track has index 0/2/4. when I set 0
> stream to AVDISCARD_DEFAULT and 2/4 to AVDISCARDALL, the pkt with
> stream_index 2/4 still reach me.
>   player.c, 114, got pkt with stream_index: 0
>   player.c, 114, got pkt with stream_index: 2
>   player.c, 114, got pkt with stream_index: 4
>   player.c, 114, got pkt with stream_index: 0
>   player.c, 114, got pkt with stream_index: 2
>   player.c, 114, got pkt with stream_index: 4
>   player.c, 114, got pkt with stream_index: 0
>   player.c, 114, got pkt with stream_index: 2
>   player.c, 114, got pkt with stream_index: 3
>   player.c, 114, got pkt with stream_index: 3
>   player.c, 114, got pkt with stream_index: 4
>   player.c, 114, got pkt with stream_index: 5
>   player.c, 114, got pkt with stream_index: 5
>
> 2016-06-29 19:25 GMT+08:00 aihua zhao <aihua.halley.zhao at gmail.com>:
>
>> thanks, seems the right clue to follow.
>>
>> I don't know much about ffmpeg, after went through avplay.c. I think I
>> should do the following steps
>> 1. discard all stream by default.
>>   refer to decode_thread()
>>     for (i = 0; i < ic->nb_streams; i++)
>>         ic->streams[i]->discard = AVDISCARD_ALL;
>> 2. enable the desired stream only
>> refer to stream_component_open()
>>             ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;
>>
>> thanks for your help.
>>
>> 2016-06-29 10:01 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:
>>
>>> 2016-06-29 8:36 GMT+08:00 aihua zhao <aihua.halley.zhao at gmail.com>:
>>>
>>> > thanks.
>>> >
>>> > Yes, readahead the list is must.
>>> > but during playback, I found ffmpeg downloads each content of the list
>>> > -- av_read_frame() returns me each content with different stream_index.
>>> > I'm expecting av_read_frame() returns me the interested stream only.
>>> > I haven't found a way to do so; or said, is there ffmpeg interface to
>>> > specify a dedicate stream (stream_index) to download.
>>> >
>>> > i'm looking into hls.c; there is recheck_discard_flags(), seems it is
>>> > designed to do some policy like this.
>>> > but I haven't found one top level interface of ffmpeg for it.
>>> > recheck_discard_flags() is called once only during hls_read_packet()
>>> when
>>> > c->first_packet is set  -- this flag is set in hls_read_header() only.
>>> >
>>> >
>>> > 2016-06-28 22:22 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:
>>> >
>>> > > 2016-06-28 14:26 GMT+08:00 aihua zhao <aihua.halley.zhao at gmail.com>:
>>> > >
>>> > > > Hi Experts:
>>> > > >
>>> > > > I use ffmpeg to parse/demux media content, and created a player
>>> basing
>>> > on
>>> > > > it.
>>> > > >
>>> > > > here is a m3u8 content:
>>> > > >
>>> > > >
>>> > >
>>> >
>>> http://asp.cntv.lxdns.com/asp/hls/main/0303000a/3/default/438eb7a818b246c187e72f1cd4e1bc4c/main.m3u8
>>> > > > <
>>> > > >
>>> > >
>>> >
>>> http://asp.cntv.lxdns.com/asp/hls/main/0303000a/3/default/438eb7a818b246c187e72f1cd4e1bc4c/main.m3u8?maxbr=1200
>>> > > > >
>>> > > > there are three video track in it.
>>> > > >
>>> > > > I found all video/audio tracks are downloaded during playback, and
>>> I
>>> > can
>>> > > > switch different track on the fly.
>>> > > > however, it consumes much bandwidth since all tracks are
>>> downloaded.
>>> > > >
>>> > > > even when I append bandwidth to the url; still the same result:
>>> > > >
>>> > > >
>>> > >
>>> >
>>> http://asp.cntv.lxdns.com/asp/hls/main/0303000a/3/default/438eb7a818b246c187e72f1cd4e1bc4c/main.m3u8?maxbr=1200
>>> > > >
>>> > > > Is there any way to download the specified track only to save
>>> > bandwidth?
>>> > > >
>>> > > > thanks
>>> > > >
>>> > >
>>> > > Hi Aihua Zhao,
>>> > >
>>> > >       If you haven't read the m3u8 file and parse the playlist, and
>>> read
>>> > > the sub m3u8 playlist, how do you get the info of the mpegts?
>>> > >
>>> > >       So it's must readahead the list and list all of the track for
>>> > choose.
>>> > you mean the function looks like "stream_cycle_channel" in ffplay?
>>> >
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>
>>
>


More information about the ffmpeg-devel mailing list