[Libav-user] Demuxing HLS without decoding the segments

Ahsan Saba saba.ahsan at aalto.fi
Wed Jul 23 15:33:28 CEST 2014


On Jul 23, 2014, at 2:19 AM, wm4 <nfxjfg at googlemail.com>
 wrote:

> On Tue, 22 Jul 2014 09:21:13 +0000
> Ahsan Saba <saba.ahsan at aalto.fi> wrote:
> 
>> Hi, 
>> 
>> I just started using libavformat and I am trying to receive an HLS stream. I don't want to decode the stream, I will only be looking at duration and timestamps of select segments to analyse the video segments. 
>> 
>> The problem is that I want libavformat to parse the m3u8 file and give me all the different variants and segments. So I use the following command to open the m3u8 link which is saved in src_url (from ffmpeg example codes) 
>> 
>>    if (avformat_open_input(&fmt_ctx, src_url, NULL, NULL) < 0) {
>>        fprintf(stderr, "Could not open source file %s\n", src_filename);
>>        exit(1);
>>    }
>> 
>> 
>> It turns out that this is what happens : main -> avformat_open_input -> hls_read_header -> avformat_find_stream_info and avformat_find_stream_info fails for the very first ts segment it tries. My understanding is that avformat_find_stream_info tries to decode part of the ts segment and fails because I am compiling without libx264 (my configure command is given at the end), is that right? 
> 
> libx264 doesn't do decoding...
> 
>> Is there a way that I can stop libavformat from actually trying to download and read the ts segments. I want the library to parse m3u8 and give me all the variant segments, then I want my application to decide which segments to download and demux (not decode). I would think there is a flag somewhere, but I can't seem to figure it out. Is this even possible to do? I have seen code that demuxes mov to extract only timestamps without decoding (of course that was not HLS), but I am stuck with the m3u8/mpegts combination. 
> 
> libavformat will read some data at start to analyze the codec
> parameters etc., and I don't think you can prevent this. Maybe you
> could just not call avformat_find_stream_info(), but I don't know if
> this is supported in any reasonable way.
> 
> If you don't want it to read the ts fragments, then what do you want?
> You could just parse the m3u8 file yourself, it's a relatively simple
> format.
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user

Hi, 

Yes, my mistake about libx264. It turns out that avformat_find_stream_info() starts working if I add --enable-decoder=h264 and --enable-decoder=aac to my configuration. 

I do want to download and demux the fragments, but not all of them. I was able to do that by setting discard flag for the AVStreams  to AVDISCARD_ALL for the streams I don't want.  It all seems so simple now.

I don't mind enabling those decoders and everything so far seems to work. Thanks a lot for your help :) 

Regards, 
Saba







More information about the Libav-user mailing list