·您当前的位置:首页 > 技术教程 > FFmpeg技术 >

[ffmpeg]ffmpeg中的flv文件格式解析的实现

时间:2015-04-22 10:41博客园
ffmpeg中的flv文件格式解析的实现,其中flv_read_header主要是从文件中读取一些头信息,同时作一些初始化化的工作

ffmpeg中的flv文件格式解析的实现:

其中flv_read_header主要是从文件中读取一些头信息,同时作一些初始化化的工作

static int flv_read_header(AVFormatContext *s,AVFormatParameters *ap)
{

         ……

    url_fskip(s->pb, 4); //CuPlayer.com提示将flv的头去掉。
    flags = get_byte(s->pb);//读出flv的video和audio flag信息。

         …… 
        if(flags & FLV_HEADER_FLAG_HASVIDEO){
        if(!create_stream(s, 0))  //创建视频流
            return AVERROR(ENOMEM);
    }
    if(flags & FLV_HEADER_FLAG_HASAUDIO){
        if(!create_stream(s, 1)) //创建音频流
            return AVERROR(ENOMEM);
    }

    offset = get_be32(s->pb); //CuPlayer.com提示获取文件头长度

        ……
}

其它tag的读取:

static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
{

     ……
for(;;url_fskip(s->pb, 4)){ /* pkt size is repeated at end. skip it */
    pos = url_ftell(s->pb);
    type = get_byte(s->pb); //获取tag的类型,前面已经提到flv的tag大概有以下三种 :FLV_TAG_TYPE_AUDIO = 0x08,FLV_TAG_TYPE_VIDEO = 0x09,FLV_TAG_TYPE_META  = 0x12,
    size = get_be24(s->pb);//CuPlayer.com提示获取tag的长度
    dts = get_be24(s->pb);
    dts |= get_byte(s->pb) << 24; //计算tag的timestamp也就是dts信息

    ……
    if (type == FLV_TAG_TYPE_AUDIO) { //CuPlayer.com提示判断是否为audio tag

       ……
         } else if (type == FLV_TAG_TYPE_VIDEO) {//判断是否为video tag

       ……
               if ((flags & 0xf0) == 0x50) /* video info / command frame */
            goto skip;
    } else {
        if (type == FLV_TAG_TYPE_META && size > 13+1+4)//判断是否为meta tag,如果是meta信息则会将信息存放在一个map表中。
         ……

}

http://www.cnblogs.com/qingquan/

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器