H264 + AAC封装FLV

H264 + AAC封装FLV

FLV格式解析

FLV文件格式

FLV包含一个File Header以及File Body组成,其中File Body由无数个tag组成,结构如图
在这里插入图片描述

FLV Header

FLV Header 由9个字节组成结构如下:

在这里插入图片描述

  • 第1-3字节:1-3字节为文件标识,标识"FLV"0x46 0x4C 0x56
  • 第4字节:第4个字节位版本,总为1
  • 第5字节:第5个字节的前5位保留,必须为0,第6位标识是否有音频,第7位保留为0,第8位标识是否有视频
  • 第6-9字节:第6-9个字节为UI32类型的值,表示从File Header开始到File Body开始的字节数,版本1中总为9

对应数据结构如下:

	
    
struct FlVHeader 
{
    unsigned char tag_f;
    unsigned char tag_l;
    unsigned char tag_v;
    unsigned char version;
    unsigned char streamInfo;
    unsigned char DataOffset[4];

    FlVHeader()
    {
        tag_f       = 'F';
        tag_l       = 'L';
        tag_v       = 'V';
        version     = 0x01;
        streamInfo  = 0x05; //有音频也有视频

        memset(DataOffset, 0, 4);
        DataOffset[3] = 0x09;
    }
};

FLV Body

Tag Header

FLV tag 包含Tag 头(Tag Header)以及Tag 数据(Tag Body)两个部分,Tag Header由11个字节组成结构如图:

在这里插入图片描述

  • type : 音频(0x08)、视频(0x09)和script data(0x12)
  • tag size : 3个字节标识该tag data部分size
  • time : 3个字节标识时间戳字段(毫秒)
  • timeEx : 如果时间戳超过3个字节标识的范围,可以用timeEX标识时间戳的高位
Audio Tag Data

音频Tag Data 第一个字节标识音频数据的格式,之后就是编码完成之后的AAC音频数据,每个AAC音频数据采样数为1024:

  • 第1个字节的前4位的数值表示了音频数据格式
  • 第1个字节的第5-6位的数值表示采样率
  • 第1个字节的第7位表示采样精度
  • 第1个字节的第8位表示音频类型

生成音频格式函数如下:



uint8_t createFLVTagAudioInfo(int audioCodec, int sampleRate, int channels, int sampleSize)
{
    uint8_t soundRate = 0;
    if (sampleRate <= 8 * 1000)
    	soundRate = FLV_SAMPLERATE_SPECIAL;
    else if (sampleRate > 8 * 1000 && sampleRate <= 20 * 1000)
    	soundRate = FLV_SAMPLERATE_11025HZ;
    else if (sampleRate > 20 * 1000 && sampleRate <= 30 * 1000)
    	soundRate = FLV_SAMPLERATE_22050HZ;
    else if (sampleRate > 30 * 1000)
   		soundRate = FLV_SAMPLERATE_44100HZ;

    uint8_t soundType = (1 == channels) ? 0 : 1;
    uint8_t soundBitsPerSample;
    
    if(sampleSize == 8)
    	soundBitsPerSample = FLV_SAMPLESSIZE_8BIT;
    else if(sampleSize == 16)
    	soundBitsPerSample = FLV_SAMPLESSIZE_16BIT;
    else if(sampleSize == 24)
    	soundBitsPerSample = FLV_SAMPLESSIZE_24BIT;
    
    uint8_t audioInfo = (audioCodec << FLV_AUDIO_CODECID_OFFSET) | (soundRate << FLV_AUDIO_SAMPLERATE_OFFSET) \
			| (soundBitsPerSample << FLV_AUDIO_SAMPLESSIZE_OFFSET) | soundType;

    return audioInfo;
}

Video Tag Data

和音频数据类似,也是第一个字节标识视频编码信息,第二个字节开始为视频数据:

  • 第1个字节的前4位的数值标识AVC帧类型
  • 第1个字节的后4位的数值表示视频编码类型id
数据打包

写FLV文件的时候先写入FLV Header,然后写入Script Tag(可以不用写),之后交叉写入VideoTag以及AudioTag,写入Video Tag以及Audio Tag的时机在于判断每个Tag的时间戳大小,优先写入时间戳小的Tag。

源代码详见:https://github.com/HejiangK/lib_flv_mux

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 海思H265 AAC生成FLV是指使用海思H265编码器和AAC音频编码器生成FLV格式的视频文件。H265和AAC是当今最先进和广泛使用的视频和音频编码标准,具有更高的视频和音频质量和更小的文件大小。 H265编码器是一种先进的视频编码器,也称为HEVC(High Efficiency Video Coding)。它是一种高效的视频压缩技术,可以将视频文件大小缩小一半或更多,而不会影响视频质量。因此,当使用海思H265编码器生成FLV文件时,您可以期望更小的文件大小和更好的视频质量。 AAC音频编码器是一种广泛使用的音频压缩技术,它提供更高的音频质量和更小的文件大小。使用AAC音频编码器生成FLV文件时,您可以期望更好的音频质量,更小的文件大小和更好的播放兼容性。 在生成FLV文件时,需要考虑视频和音频的编码参数和转封装的技术。使用海思H265和AAC编码器生成FLV文件可以通过调整编码参数和使用专业的转封装软件来实现。因此,您可以期望更高效的视频和音频数据传输以及更好的文件播放兼容性。 ### 回答2: 海思H.265和AAC是一种视频和音频编码格式,用于在数字视频或音频传输中实现高级别的压缩和高质量的解码效果。这种技术被广泛应用于数字媒体领域,如流媒体、视频会议、监控和广播。 生成FLV文件(Flash视频格式)的过程中,海思H.265和AAC技术可以帮助用户实现高效的数据传输和压缩,同时提供高质量的视频和音频解码。因为FLV是一种流式格式,需要在传输过程中实时解码和显示数据。海思H.265和AAC技术可以帮助确保视频数据和音频数据的完整性和准确性,并提供更快的解码速度和更高的画质。这对于视频直播、视音频文件存储和播放等应用是非常重要的。 总的来说,海思H.265和AAC技术的优势在于其高效率、高画质、高稳定性和高兼容性。这种技术已经成为数字媒体领域的重要组成部分,将继续在未来的数字媒体发展中发挥重要作用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值