Я использовал коды FFMPEg в своем приложении, где мне нужно получить FLV-пакеты для моей программы. Для этого я использую avcodec_encode_video2(). Моя проблема заключается в том, что функция создает пакет AVPacket, который не поддерживает полный формат FLV, а только его тело. Но мне нужен еще его заголовок. Обычно используется другая функция (av_write_frame()). Я не могу использовать av_write_frame() в своем приложении, потому что это не соответствует моему требованию. Поэтому, возможно, кто-нибудь знает функцию в библиотеке ffmpeg, которая может добавить заголовок FLV к созданным пакетам avcodec_encode_video2().FFMPEG: заголовок FLV для AVPacket
0
A
ответ
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};
спасибо, этот заголовок для FLV-файла, мне нужно для пакета FLV: Type, BodyLength, Timestamp, TimestampExtended, StreamId, Body (http://osflash.org/flv#flv_format). В ffmpeg есть flv_write_packet (AVFormatContext * s, AVPacket * pkt), который создает этот заголовок –
Ах, извините за недоразумение :) С технической точки зрения, я описал вам заголовок, а вместо этого вы используете FLV-теги. – SirDarius