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.z...@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 <lingjiujia...@gmail.com>: > >> 2016-06-29 8:36 GMT+08:00 aihua zhao <aihua.halley.z...@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 <lingjiujia...@gmail.com>: >> > >> > > 2016-06-28 14:26 GMT+08:00 aihua zhao <aihua.halley.z...@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@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel