FFMPEG:AVPacket 的 FLV header

标签 ffmpeg flv

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

最佳答案

FLV header 本身相对简单。

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

/* 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字段以大端编码,在小端平台上由值 150994944 表示。

如果你不想使用这样的结构,并且有办法直接写一个缓冲区,你可以这样创建它:
uint_8 buffer[9] = {0x46, 0x4c, 0x56, 0x01, 0x05, 0x00, 0x00, 0x00, 0x09};

关于FFMPEG:AVPacket 的 FLV header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10754047/

相关文章:

javascript - Node.js ffmpeg 从 2 个或更多 jpg 图像创建 mp4 视频

ffmpeg 转换突然停止

ffmpeg - 如何从 flv 文件中删除元数据?

ffmpeg 每分钟截取一个flv文件

ios - MobileVLCKit 不编译

html - 在 ASP.NET MVC 网站上嵌入视频

ffmpeg - 如何使用较旧的 NVEnc 编译 FFMpeg?

video - ISO BMFF 和其他 mp4 格式有什么区别?

php - -vf 无法被 php exec() 函数识别

php - 使用 FFmpeg 提取 FLV 帧 - 支持的格式