[Libav-user] FLV muxer and AVC decoder configuration record

Michael Chisholm chisholm at mitre.org
Mon Oct 3 22:40:40 CEST 2011


On 9/15/2011 1:58 PM, Michael Chisholm wrote:
> I am using ffmpeg 0.6.3; I can upgrade if necessary.
>
> My problem is that the FLV muxer, as far as I can tell, is putting an
> empty decoder config record into the stream.  I tried just transcoding a
> file using the ffmpeg commandline tool:
>
> ffmpeg -i ../../test/somefile.mpg -vcodec libx264 -f flv -fpre
> ../share/ffmpeg/libx264-default.ffpreset ../../somefile_h264.flv
>
> and I have my own little file analyzer I wrote that dumps info about flv
> files.  It shows the following for the first few tags:
>
> Tag type: script
>     dataSize for this tag = 159
>     timestamp = 0
> Tag type: video
>     dataSize for this tag = 5
>     timestamp = 0
>     Frame type: keyframe
>     CodecID: AVC
>     AVC packet details:
>       Packet type: AVC sequence header
>       Sequence header hex dump (0 bytes):
> Tag type: video
>     dataSize for this tag = 1839
>     timestamp = 0
>     Frame type: keyframe
>     CodecID: AVC
>     AVC packet details:
>       Packet type: AVC NAL unit
>       Composition time offset: 33
> Tag type: video
>     dataSize for this tag = 2625
>     timestamp = 33
>     Frame type: inter frame
>     CodecID: AVC
>     AVC packet details:
>       Packet type: AVC NAL unit
>       Composition time offset: 33
>
> etc...
>
> Notice that the "AVC sequence header" packet in the second tag has no
> data.  This also happens with the actual tool I'm building, which uses
> libav* programmatically to transcode video to flash that can be played
> in a flash plugin in a web browser.  I've never seen anything play in
> the plugin, and I've read that the plugin requires this decoder
> configuration record in order to work.
>
> So my question is: does libav* support complete creation of this decoder
> config record?  Or is it written to always output an empty one?
>

Well I've partially figured this out.  Libav* does support creating that 
record, but the commandline tool sometimes creates it and sometimes 
doesn't.  I don't know when it does and doesn't; as noted above, it 
didn't when I tried it.  A colleague tried it with a different 
commandline, and got the config record.

As far as the libav* implementation, it appears that in order for that 
record to be created, some metadata has to be set up with the codec 
before the stream header is written.  And that metadata isn't set up 
unless you set the flag CODEC_FLAG_GLOBAL_HEADER on the codec *before* 
it is opened.

The following is the code that I originally got from some sample code 
(the "flv" format is one of those which has the AVFMT_GLOBALHEADER flag 
set, so this works):

   // some formats want stream headers to be separate
   if(formatCtx_->oformat->flags & AVFMT_GLOBALHEADER)
       codecCtx_->flags |= CODEC_FLAG_GLOBAL_HEADER;

but it was never clear to me whether I really needed this, who used it, 
and when.  I had just pasted it in at the bottom of my muxer (and codec) 
init code, for lack of a better place.  All I had to do was move it 
above the avcodec_open() function call, and voila, the decoder config 
record was created and video played.

Andy


More information about the Libav-user mailing list