[ffmpeg]ffmpeg中的flv文件格式解析的实现
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/
热门文章推荐
- [FFmpeg]ffmpeg各类参数说明与使用示例
- [FFmpeg]ffmpeg命令参数详解(帮助说明)强大所有参数
- [ffmpeg]FFmpeg参数命令及用法整理(很全面详细)
- [FFmpeg]图文介绍windows下实现编译ffmpeg工程的详细步骤
- [ffmpeg]ffmpeg使用参数的中文说明
- [ffmpeg]如何使用ffmpeg下载分段并加密的m3u8视频流
- [FFmpeg]php下用ffmpeg扩展实现视频转换截图
- [FFmpeg]ffmpeg支持的格式全解析