FFMPEG:AVPacket的FLV报头

FFMPEG:AVPacket的FLV报头,ffmpeg,flv,Ffmpeg,Flv,我在我的应用程序中使用了FFMPEg代码,我需要为我的程序获取FLV数据包。为此,我使用avcodec_encode_video2()。我的问题是该函数创建的AVPacket数据包并没有保留完整的FLV格式,只有它的主体。但我仍然需要它的标题。通常由另一个函数(av_write_frame())实现。我不能在我的应用程序中使用av_write_frame(),因为它不符合我的要求。因此,也许有人知道ffmpeg库中的一个函数,它可以通过avcodec_encode_video2()将FLV头添加

我在我的应用程序中使用了FFMPEg代码,我需要为我的程序获取FLV数据包。为此,我使用avcodec_encode_video2()。我的问题是该函数创建的AVPacket数据包并没有保留完整的FLV格式,只有它的主体。但我仍然需要它的标题。通常由另一个函数(av_write_frame())实现。我不能在我的应用程序中使用av_write_frame(),因为它不符合我的要求。因此,也许有人知道ffmpeg库中的一个函数,它可以通过avcodec_encode_video2()将FLV头添加到创建的数据包中。

FLV头本身相对简单

可以使用以下代码对其进行建模:

/* FLV file header */
#define FLV_SIGNATURE       "FLV"
#define FLV_VERSION         ((uint8)0x01)

#define FLV_FLAG_VIDEO      ((uint8)0x01)
#define FLV_FLAG_AUDIO      ((uint8)0x04)

typedef struct __flv_header {
    uint8_t         signature[3]; /* always "FLV" */
    uint8_t         version; /* should be 1 */
    uint8_t         flags;
    uint32_t        offset; /* always 9 */
} flv_header;
flags
字段是一个位掩码,用于告诉文件是包含视频流、音频流还是两个流。例如,如果文件包含音频和视频,则其值将为5

请注意,
偏移量
字段是用大端单位编码的,在小端单位上,它由值150994944表示

如果您不希望使用这种结构,并且有一种直接写入缓冲区的方法,您可以这样创建它:

uint_8 buffer[9] = {0x46, 0x4c, 0x56, 0x01, 0x05, 0x00, 0x00, 0x00, 0x09};

谢谢,这个头是FLV文件,我需要FLV包:类型,BodyLength,Timestamp,TimestampExtended,StreamId,Body()。ffmpeg中有flv_write_packet(AVFormatContext*s,AVPacket*pkt),它创建了这个标题。很抱歉误解:)技术上,我描述了标题,你想要的是flv标签。