0

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

4

1 回答 1

0

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。

请注意,该offset字段以 big-endian 编码,在 little-endian 平台上由值 150994944 表示。

如果你不想使用这样的结构,并且有办法直接写一个缓冲区,你可以这样创建它:

uint_8 buffer[9] = {0x46, 0x4c, 0x56, 0x01, 0x05, 0x00, 0x00, 0x00, 0x09};
于 2012-05-25T12:45:27.510 回答