libavformat\flvenc.c
static int flv_write_header(AVFormatContext *s)
{
int i;
AVIOContext *pb = s->pb;
FLVContext *flv = s->priv_data;
//FLV 文件的前3个字节为固定的‘F’‘L’‘V’,用来标识这个文件是FLV格式
avio_write(pb, "FLV", 3);
//第4个字节表示flv版本号.当前版本号为1
avio_w8(pb, 1);
//第5个字节中的第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)
avio_w8(pb, FLV_HEADER_FLAG_HASAUDIO * !!flv->audio_par +
FLV_HEADER_FLAG_HASVIDEO * !!flv->video_par);
//接下来四个字节是FLV头长度,版本1的值固定为9,到这里FLV头写入结束
avio_wb32(pb, 9);
//这里是上一个Tag的长度,对于FLV头来说,9个字节是不包含Tag的,因此长度是0
avio_wb32(pb, 0);
for (i = 0; i < s->nb_streams; i++)
if (s->streams[i]->codecpar->codec_tag == 5) {
avio_w8(pb, 8); // message type
avio_wb24(pb, 0); // include flags
avio_wb24(pb, 0); // time stamp
avio_wb32(pb, 0); // reserved
avio_wb32(pb, 11); // size
flv->reserved = 5;
}
if (flv->flags & FLV_NO_METADATA) {
pb->seekable = 0;
} else {
write_metadata(s, 0);
}
for (i = 0; i < s->nb_streams; i++) {
flv_write_codec_header(s, s->streams[i]->codecpar, 0);
}
flv->datastart_offset = avio_tell(pb);
return 0;
}
标签:write,FFmpeg,avio,FLV,pb,源码,flv,字节
From: https://blog.51cto.com/fengyuzaitu/8935221