2012-05-25 5 views
0

Я использовал коды FFMPEg в своем приложении, где мне нужно получить FLV-пакеты для моей программы. Для этого я использую avcodec_encode_video2(). Моя проблема заключается в том, что функция создает пакет AVPacket, который не поддерживает полный формат FLV, а только его тело. Но мне нужен еще его заголовок. Обычно используется другая функция (av_write_frame()). Я не могу использовать av_write_frame() в своем приложении, потому что это не соответствует моему требованию. Поэтому, возможно, кто-нибудь знает функцию в библиотеке ffmpeg, которая может добавить заголовок FLV к созданным пакетам avcodec_encode_video2().FFMPEG: заголовок FLV для AVPacket

ответ

0

Сам FLV сам по себе относительно прост.

Это может быть modelized со следующим кодом:

/* 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}; 
+0

спасибо, этот заголовок для FLV-файла, мне нужно для пакета FLV: Type, BodyLength, Timestamp, TimestampExtended, StreamId, Body (http://osflash.org/flv#flv_format). В ffmpeg есть flv_write_packet (AVFormatContext * s, AVPacket * pkt), который создает этот заголовок –

+0

Ах, извините за недоразумение :) С технической точки зрения, я описал вам заголовок, а вместо этого вы используете FLV-теги. – SirDarius