FFmpeg рдПрдХ рдЧреНрд░реИрдВрдб рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдЬреЛ рдПрдХ рддрд░рд╣ рдХрд╛ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдЗрдирд╕рд╛рдЗрдХреНрд▓реЛрдкреАрдбрд┐рдпрд╛ рд╣реИред FFmpeg рд╕реЗ рдЖрдк рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдХрднреА-рдХрднреА FFmpeg рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдорд╛рдирдХ рддрд░реАрдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реИред рд▓реЗрдЦ рдПрдХ рдирдП рдХреЛрдбреЗрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИред рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ FFmpeg рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдХреЛрдбреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ FFmpeg рдХреЛрдбреЗрдХ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдЙрдирдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ FFmpeg рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, FFmpeg рдХреА рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдФрд░ FFmpeg API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдиреБрднрд╡ рднреА рд╣реИред рд╡рд┐рд╡рд░рдг FFmpeg 4.2 "Ada", рдЕрдЧрд╕реНрдд 2019 рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛ рдкрд░рд┐рдЪрдп
рдХреЛрдбреЗрдХ (рдХреЛрдбреЗрдХ, рд╢рдмреНрдж рдХреЙрдбрд░ рдФрд░ рдбреАрдХреЛрдбрд░ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рдЖрддрд╛ рд╣реИ) рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рд╣реИ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдореАрдбрд┐рдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд / рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдЕрд░реНрде рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╣реИред рд╕рдВрдкреАрдбрд╝рди / рд╡рд┐рдШрдЯрди рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдЕрдХреНрд╕рд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рдХреЛрдбреЗрдХ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдорддрд▓рдм рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡реЗ рднреА рдХреЛрдбреЗрдХ рдкреНрд░рд╛рд░реВрдк рдХрд╣рддреЗ рд╣реИрдВ), рд╕рдВрдкреАрдбрд╝рди / рдЕрдкрдШрдЯрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдзрдиреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ FFmpeg рдореЗрдВ рдХреЛрдбреЗрдХ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
1. рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рди
FFmpeg рдХреЛрдбреЗрдХреНрд╕ рдХреЛ libavcodec рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
1.1ред рдХреЛрдбреЗрдХ рдЖрдИрдбреА
enum AVCodecID
libavcodec/avcodec.h
enum AVCodecID
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЧрдгрдирд╛ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рд╛рд░реВрдк рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЧрдгрдирд╛ рдХреЗ рддрддреНрд╡ AV_CODEC_ID_XXX
рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ XXX
рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдо рд╣реИред рдпрд╣рд╛рдБ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ: AV_CODEC_ID_H264
, AV_CODEC_ID_AAC
ред рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, AVCodecDescriptor
рд╕рдВрд░рдЪрдирд╛ ( libavcodec/avcodec.h
рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
typedef struct AVCodecDescriptor { enum AVCodecID id; enum AVMediaType type; const char *name; const char *long_name;
рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рдореБрдЦ рд╕рджрд╕реНрдп id
, рдмрд╛рдХреА рд╕рджрд╕реНрдп рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдореАрдбрд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ ( type
рд╕рджрд╕реНрдп) рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо ( name
рд╕рджрд╕реНрдп) рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред AVCodecDescriptor
рдПрдХ рдкреНрд░рдХрд╛рд░ рдлрд╝рд╛рдЗрд▓ libavcodec/codec_desc.c
AVCodecDescriptor
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд░рдгреА рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ id
рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрддреНрд╡реЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const AVCodecDescriptor* avcodec_descriptor_get(enum AVCodecID id); const AVCodecDescriptor* avcodec_descriptor_get_by_name(const char *name); enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); const char* avcodec_get_name(enum AVCodecID id);
1.2ред рдХреЛрдбреЗрдХ
рдХреЛрдбреЗрдХ рд╕реНрд╡рдпрдВ - рдореАрдбрд┐рдпрд╛ рдбреЗрдЯрд╛ рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ, AVCodec
рд╕рдВрд░рдЪрдирд╛ ( libavcodec/avcodec.h
рдореЗрдВ рдШреЛрд╖рд┐рдд) рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдиреАрдЪреЗ рдкреВрд░реНрдг рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
typedef struct AVCodec { const char *name; const char *long_name; enum AVMediaType type; enum AVCodecID id;
рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рджрд╕реНрдп id
, рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдореАрдбрд┐рдпрд╛ рдХреЗ type
( type
) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рджрд╕реНрдп рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдореВрд▓реНрдп AVCodecDescriptor
рд╕реЗ рдЙрд╕реА рд╕рджрд╕реНрдп рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдбреЗрдХреНрд╕ рдХреЛ рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдПрдиреНрдХреЛрдбрд░реНрд╕, рдЬреЛ рдореАрдбрд┐рдпрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдпрд╛ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдбрд┐рдХреЛрдбрд░реНрд╕, рдЬреЛ рд╡рд┐рдкрд░реАрдд рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ - рдбрд┐рдХрдореНрдкреНрд░реЗрд╕ рдпрд╛ рдбрд┐рдХреЛрдбред (рдХрднреА-рдХрднреА рд░реВрд╕реА рдЧреНрд░рдВрдереЛрдВ рдореЗрдВ, рд╢рдмреНрдж рдХреЗ рдмрдЬрд╛рдп, рдПрдиреНрдХреЛрдбрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдкреЗрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдПрдирдХреЛрдбрд░ред) AVCodec
рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЛрдбреЗрдХ рд╢реНрд░реЗрдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢реНрд░реЗрдгреА рдХреЛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди av_codec_is_encoder()
рдФрд░ av_codec_is_decoder()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╣ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдХрдИ рдХреЛрдбреЗрдХреНрд╕ рдореЗрдВ рдПрдХ рд╣реА рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд╛рдо (рд╕рджрд╕реНрдп name
) рд╕реЗ рднрд┐рдиреНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдПрдиреНрдХреЛрдбрд░ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдореЗрдВ рдПрдХ рд╣реА рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╣реЛрдирд╛ рдПрдХ рд╣реА рдирд╛рдо, рдЬреЛ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпреЗ рдорд┐рд▓рд╛рди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ)ред рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреБрдЫ рднреНрд░рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдирд╛рдо рдХрд┐рд╕ рдЗрдХрд╛рдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЖрдкрдХреА рд╢реНрд░реЗрдгреА рдХреЗ рднреАрддрд░, рдирд╛рдоред рдХреЛрдбреЗрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрдВрдЬреАрдХреГрдд рдХреЛрдбреЗрдХреНрд╕ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп рд╣реИрдВ:
AVCodec* avcodec_find_encoder_by_name(const char *name); AVCodec* avcodec_find_decoder_by_name(const char *name); AVCodec* avcodec_find_encoder(enum AVCodecID id); AVCodec* avcodec_find_decoder(enum AVCodecID id);
рдЪреВрдВрдХрд┐ рдХрдИ рдХреЛрдбрдХ рд╕рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рджреЛ рдлрд╝рдВрдХреНрд╢рди рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛрдбреЗрдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рднреА рдкрдВрдЬреАрдХреГрдд рдХреЛрдбреЗрдХреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
ffmpeg -codecs >codecs.txt
рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, codecs.txt
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпрд╣ рд╕реВрдЪреА рд╣реЛрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдХреЙрд░реНрдб (рд▓рд╛рдЗрди) рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ AV_CODEC_ID_H264
:
DEV.LS
h264
H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
(decoders: h264 h264_qsv h264_cuvid)
(encoders: libx264 libx264rgb h264_amf h264_nvenc h264_qsv nvenc nvenc_h264)
рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рд╣реИрдВ рдЬреЛ рдЗрд╕ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ: D
- рдбрд┐рдХреЛрдбрд░ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ, E
- рдПрдиреНрдХреЛрдбрд░ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ, V
- рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, L
- рджреЛрд╖рдкреВрд░реНрдг рд╕рдВрдкреАрдбрд╝рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, S
- рджреЛрд╖рд░рд╣рд┐рдд рд╕рдВрдкреАрдбрд╝рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдирд╛рдо ( h264
) рдЖрддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рд▓рдВрдмрд╛ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдо ( H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
) рдЖрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрдВрдЬреАрдХреГрдд рдбрд┐рдХреЛрдбрд░реНрд╕ рдФрд░ рдПрдирдХреЛрдбрд░ рдХреЗ рдирд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред
2. FFmpeg рдореЗрдВ рдПрдХ рдирдпрд╛ рдХреЛрдбреЗрдХ рдЬреЛрдбрд╝рдирд╛
рд╣рдо рдПрдХ рдСрдбрд┐рдпреЛ рдХреЛрдбреЗрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ FFmpeg рдореЗрдВ рдПрдХ рдирдпрд╛ рдХреЛрдбреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо FROX
ред
рдЪрд░рдг 1. enum AVCodecID
рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВред
рдпрд╣ рд╕реВрдЪреА libavcodec/avcodec.h
ред рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдПрдХ рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рдореМрдЬреВрджрд╛ рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдореМрдЬреВрджрд╛ рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рди рдмрджрд▓реЗрдВ;
- рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХреЛрдбреЗрдХреНрд╕ рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рдПрдХ рдирдпрд╛ рдорд╛рди рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рддрддреНрд╡ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ AV_CODEC_ID_FROX
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред AV_CODEC_ID_PCM_S64LE
рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд░рдЦреЗрдВ рдФрд░ 0x10700
рдорд╛рди 0x10700
ред
рдЪрд░рдг 2ред рдЖрдЗрдЯрдо рдХреЛ codec_descriptors
рд╕рд░рдгреА (рдлрд╝рд╛рдЗрд▓ libavcodec/codec_desc.c
) рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
static const AVCodecDescriptor codec_descriptors[] = {
рдЖрдкрдХреЛ рддрддреНрд╡ рдХреЛ "рд╕рд╣реА" рд╕реНрдерд╛рди рдкрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, id
рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреА рдПрдХрд░реВрдкрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЪрд░рдг 3. рдПрдиреНрдХреЛрдбрд░ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП AVCodec
рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХреЛрдбреЗрдХ рдФрд░ рдХрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рдЗрди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЕрддреНрдпрдВрдд рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдмрд╛рдж рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдХреЛрдб рдХреЛ рдлрд╛рдЗрд▓ libavcodec/frox.c
#include "avcodec.h"
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдирдХреЛрдбрд░ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдХрд╛ рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рд╣реИ - FroxContext
, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдПрдирдХреЛрдбрд░ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ AVCodec
рдЙрджрд╛рд╣рд░рдг рдХреЗ AVCodec
рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЪрд░рдг 4. рдкрдВрдЬреАрдХрд░рдг рд╕реВрдЪреА рдореЗрдВ AVCodec
рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗрдВред
рдлрд╝рд╛рдЗрд▓ libavcodec/allcodecs.c
ред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рднреА рдкрдВрдЬреАрдХреГрдд рдХреЛрдбреЗрдХреНрд╕ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдбреЗрдХреНрд╕ рдЬреЛрдбрд╝реЗрдВ:
extern AVCodec ff_frox_decoder; extern AVCodec ff_frox_encoder;
рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, configure
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрд╕реА рд╕рднреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдвреВрдВрдврддреА рд╣реИ рдФрд░ libavcodec/codec_list.c
рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ libavcodec/allcodecs.c
рдореЗрдВ рдШреЛрд╖рд┐рдд libavcodec/allcodecs.c
рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА libavcodec/allcodecs.c
ред рдлрд╝рд╛рдЗрд▓ libavcodec/codec_list.c
рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:
static const AVCodec * const codec_list[] = {
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, configure
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, config.h
рдлрд╝рд╛рдЗрд▓ config.h
, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдкрд╛рддреЗ рд╣реИрдВ
#define CONFIG_FROX_DECODER 1 #define CONFIG_FROX_ENCODER 1
рдЪрд░рдг 5. libavcodec/Makefile
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
libavcodec/Makefile
ред рд╣рдо рдЕрдиреБрднрд╛рдЧ # decoders/encoders
рдкрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
OBJS-$(CONFIG_FROX_DECODER) += frox.o OBJS-$(CONFIG_FROX_ENCODER) += frox.o
рдЪрд░рдг 6. рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдФрд░ рдбрд┐рдореНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд░ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ (muxer) рдФрд░ demultiplexer (demuxer) рдХреЛ рдирдП рдХреЛрдбрдХ рдХреЛ "рдЬрд╛рдирдирд╛" рдЪрд╛рд╣рд┐рдПред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕ рдХреЛрдбреЗрдХ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдкрдврд╝рддреЗ рд╕рдордп, рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдХреЛрдбреЗрдХ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдЖрдкрдХреЛ matroska
рдкреНрд░рд╛рд░реВрдк ( *.mkv
) рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
1. рдлрд╝рд╛рдЗрд▓ libavformat/matroska.c
, рдирдП рдХреЛрдбреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рддрддреНрд╡ рдХреЛ libavformat/matroska.c
рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
const CodecTags ff_mkv_codec_tags[] = {
рд╕реНрдЯреНрд░рд┐рдВрдЧ "A_FROX"
рдФрд░ рд╕реВрдЪрдирд╛ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдлрд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ, рдпрд╣ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЬрдм рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреАрдореБрд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Demultiplexer codec_id
рд╕рдВрд░рдЪрдирд╛ рдХреЗ codec_id
рд╕рджрд╕реНрдп рдХреЛ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕реВрдЪрдХ AVStream
рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИред
2. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ libavformat/matroskaenc.c
, additional_audio_tags
libavformat/matroskaenc.c
рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ:
static const AVCodecTag additional_audio_tags[] = {
рддреЛ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, configure
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ libavcodec/codec_list.c
рдФрд░ config.h
рдореЗрдВ рдмрдиреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рд╕рдВрдХрд▓рди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
make clean
make
рдпрджрд┐ рд╕рдВрдХрд▓рди ffmpeg.exe
рдЪрд▓рд╛ ffmpeg.exe
, рддреЛ ffmpeg
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп (рдпрд╛ ffmpeg.exe
, рдпрджрд┐ рд▓рдХреНрд╖реНрдп OS Windows рд╣реИ) рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
./ffmpeg -codecs >codecs.txt
рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ FFmpeg рд╣рдорд╛рд░реЗ рдирдП рдХреЛрдбреЗрдХреНрд╕ "рджреЗрдЦрддрд╛ рд╣реИ", рд╣рдо codecs.txt
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкрд╛рддреЗ рд╣реИрдВ
DEA..S frox FROX audio (decoders: frox_dec) (encoders: frox_enc)
3. рд╕рдВрджрд░реНрдн рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг
рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреНрдпрд╛ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
3.1ред рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн
рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдирдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдорд░реНрдерди рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдХреЛрдбрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрдо рдмрд╛рд░ред рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ AVClass
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рд╕реНрд╡рдпрдВ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗред
#include "libavutil/opt.h" typedef struct FroxContext { const AVClass *av_class; int frox_int; char *frox_str; uint8_t *frox_bin; int bin_size; } FroxContext;
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ AVOption
рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
static const AVOption frox_options[] = { { "frox_int", "This is a demo option of int type.", offsetof(FroxContext, frox_int), AV_OPT_TYPE_INT, { .i64 = -1 }, 1, SHRT_MAX }, { "frox_str", "This is a demo option of string type.", offsetof(FroxContext, frox_str), AV_OPT_TYPE_STRING }, { "frox_bin", "This is a demo option of binary type.", offsetof(FroxContext, frox_bin), AV_OPT_TYPE_BINARY }, { NULL }, };
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдирд╛рдо, рд╡рд┐рд╡рд░рдг, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдСрдлрд╕реЗрдЯ, рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ AVClass
рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
static const AVClass frox_class = { .class_name = "FroxContext", .item_name = av_default_item_name, .option = frox_options, .version = LIBAVUTIL_VERSION_INT, };
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдмрдВрдзрд┐рдд AVCodec
рд╕рджрд╕реНрдп рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
AVCodec ff_frox_decoder = {
рдЕрдм рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
AVCodecContext
рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг AVCodecContext
рдФрд░ codec
рд╕рджрд╕реНрдп рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛, codec->priv_data_size
рдЖрдзрд╛рд░ рдкрд░, рдЖрд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдХреЛ codec->priv_class
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП FroxContext
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ codec->priv_class
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг codec->priv_class
рдкрд╣рд▓реЗ рд╕рджрд╕реНрдп рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ av_opt_set_defaults()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ред FroxContext
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ priv_data
рд╕рдВрд░рдЪрдирд╛ рдХреЗ priv_data
рд╕рджрд╕реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред
рдПрдлрдПрдлрдПрдордкреАрдИ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
const AVCodec *codec;
рдПрдХ рдЕрдиреНрдп рддрд░реАрдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм avcodec_open2()
рджреЗрдЦреЗрдВ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
const AVOption* av_opt_next(const void* ctx, const AVOption* prev);
рдЖрдк рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдХреЛрдбреЗрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ codec_ctx->codec->priv_class
рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рд╕реЗрдЯ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╕рдВрджрд░реНрдн рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░реЗрдЧрд╛ред
3.2ред рдХрд╛рд░реНрдпреЛрдВ
рдЖрдЗрдП рдЕрдм рд╣рдо рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдбрдХ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рд╣рдореЗрд╢рд╛ рдПрдХ FroxContext
рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ FroxContext
ред
AVCodecContext *codec_ctx;
рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ frox_decode_init()
рдФрд░ frox_encode_init()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
int avcodec_open2( AVCodecContext *codec_ctx, const AVCodec *codec, AVDictionary **options);
рдЙрдиреНрд╣реЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдбреЗрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ AVCodecContext
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреБрдЫ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдбрд┐рдпреЛ frame_size
рд▓рд┐рдП frame_size
ред
frox_decode_close()
рдФрд░ frox_encode_close()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
int avcodec_close(AVCodecContext *codec_ctx);
рдЙрдиреНрд╣реЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
int frox_decode( AVCodecContext *codec_ctx, void *outdata, int *outdata_size, AVPacket *pkt);
рдЙрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд┐рдХреЛрдбрд┐рдВрдЧ;
- рдЖрдЙрдЯрдкреБрдЯ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХрд╛ рдЖрд╡рдВрдЯрди;
- рдмрдлрд░ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХреИрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВред AVFrame
рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ AVFrame
рдХреЛ AVFrame
, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
AVFrame* frm = outdata;
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдлреНрд░реЗрдо рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AVFrame
рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЖрд░рдореНрдн рдХрд░реЗрдВ рдЬреЛ рдлреНрд░реЗрдо рдмрдлрд░ рдЖрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВред рдСрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП, рдпрд╣ nb_samples
, channel_layout
, format
(рд╡реАрдбрд┐рдпреЛ рдХреА width
, height
, format
) рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
int av_frame_get_buffer(AVFrame* frm, int alignment);
рдлрд╝реНрд░реЗрдо рдХрд╛ рдкреЙрдЗрдВрдЯрд░, рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд outdata
рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реВрдиреНрдп рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдлреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдбреЗрдХ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрддрд╛ рд╣реИ), рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдмрдлрд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
void av_frame_unref(AVFrame* frm);
frox_decode()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ frox_decode()
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЯ рд╕реЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдлрд╝реНрд░реЗрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ outdata_size
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЪрд░ outdata_size
рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЗрд╕ рдЪрд░ рдХрд╛ рдорд╛рди 0
рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
int frox_encode( AVCodecContext *codec_ctx, AVPacket *pkt, const AVFrame *frame, int *got_pkt_ptr);
рдЙрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдбрд┐рдВрдЧ;
- рдЖрдЙрдЯрдкреБрдЯ рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХрд╛ рдЖрд╡рдВрдЯрди;
- рдкреИрдХреЗрдЯ рдмрдлрд░ рдХреЛ рдПрдиреНрдХреЛрдбреЗрдб рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░реЗрдВред
рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
int av_new_packet(AVPacket *pkt, int pack_size);
рдкреИрд░рд╛рдореАрдЯрд░ pkt
рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдиреНрдХреЛрдбреЗрдб рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рджреВрд╕рд░рд╛ рд╣реИред рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдбреЗрдХ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрддрд╛ рд╣реИ), рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдмрдлрд╝рд░реНрд╕ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
void av_packet_unref(AVPacket *pkt);
рдпрджрд┐ рдкреИрдХреЗрдЬ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ got_pkt_ptr
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдЪрд░ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЗрд╕ рдЪрд░ рдХрд╛ рдорд╛рди 0
рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдбред
рдХреЛрдбреЗрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
static int frox_decode_close(AVCodecContext *codec_ctx) { av_log(codec_ctx, AV_LOG_INFO, "FROX decode close\n");
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд▓реЙрдЧ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╕рдордп, рдХреЛрдбреЗрдХ рдирд╛рдо рдХреЛ рд╕рдВрджрд░реНрдн рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
3.3ред рд╕рдордп рдЯрд┐рдХрдЯ
FFmpeg рдореЗрдВ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдордп рдЖрдзрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, AVRational
рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рдкрд░рд┐рдореЗрдп рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдХрдВрдб рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (C ++ 11 рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1/1000 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред) рдлрд╝реНрд░реЗрдо рдФрд░ рдкреИрдХреЗрдЯ рдореЗрдВ рдЯрд╛рдЗрдк int64_t
рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдорд╛рдиреЛрдВ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдордп рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рд╕рдордп рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдлреНрд░реЗрдо, рдЬреЛ рдХрд┐ рдПрдХ AVFrame
рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдореЗрдВ рдПрдХ рд╕рджрд╕реНрдп pts
(рдкреНрд░рд╕реНрддреБрддрд┐ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк) рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдорд╛рди рдлреНрд░реЗрдо рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рджреГрд╢реНрдп рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдордп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреИрдХреЗрдЬ, рдЬреЛ рдХрд┐ рдПрдХ AVPacket
рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдореЗрдВ рд╕рджрд╕реНрдп pts
(рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк) рдФрд░ dts
(рдбреАрдХрдВрдкреНрд░реЗрд╕рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк) рд╣реИрдВред рдореВрд▓реНрдп dts
рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЯ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдордп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд░рд▓ рдХреЛрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ pts
рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ рдХреЛрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреА-рдлреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп h264
рд▓рд┐рдП), рдЕрд░реНрдерд╛рдд, рдкреИрдХреЗрдЯ рдХреЛ рдЧрд▓рдд рдХреНрд░рдо рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЯрд╛рдЗрдо рдпреВрдирд┐рдЯ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдФрд░ рдХреЛрдбреЗрдХ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, AVStream
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╣реА рд╕рджрд╕реНрдп рд╣реИ - time_base
, рдЙрд╕реА рд╕рджрд╕реНрдп рдХреЗ рдкрд╛рд╕ AVCodecContext
рд╕рдВрд░рдЪрдирд╛ рд╣реИред
av_read_frame()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдкреИрдХреЗрдЯ рдХрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рдордп рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреЛрдбреЗрдХ рдХреА рдЯрд╛рдЗрдо рдпреВрдирд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдПрдХ рдорд╛рдирдХ рдореВрд▓реНрдп рд╣реИ - рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рдЙрд▓рдЯрд╛ред рдбрд┐рдХреЛрдбрд░ рдХреЛ рдкреИрдХреЗрдЯ рдХреЗ рдЯрд╛рдЗрдо рд╕реНрдЯреИрдореНрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рдЗрдо рд╕реНрдЯреИрдореНрдк рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред FFmpeg рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЗрдмрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ best_effort_timestamp
рд╕рдВрд░рдЪрдирд╛ рдХреЗ best_effort_timestamp
рд╕рджрд╕реНрдп рдХреЛ best_effort_timestamp
рд╣реИред рдпреЗ рд╕рднреА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЙрд╕ рдзрд╛рд░рд╛ рдХреЗ рд╕рдордп рдХреА рдЗрдХрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╕реЗ рдкреИрдХреЗрдЯ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдирдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдордп рдХреА рдЗрдХрд╛рдИ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ, рдЖрдкрдХреЛ avcodec_open2()
рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ time_base
рд╕рдВрд░рдЪрдирд╛ рдХреЗ time_base
рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдорддреМрд░ рдкрд░ рдЗрдирдХреЛрдбрд┐рдВрдЧ рдлреНрд░реЗрдо рдХреЗ рд╕рдордп рдЯрд┐рдХрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдордп рдХреА рдЗрдХрд╛рдИ рд▓реЗрдВред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реАрдбрд┐рдпреЛ рдПрдирдХреЛрдбрд░ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддреЗ рд╣реИрдВ, рдСрдбрд┐рдпреЛ рдПрдирдХреЛрдбрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ - рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рд╡реНрдпреБрддреНрдХреНрд░рдоред рдХреНрдпрд╛ рдХреЛрдИ рдХреЛрдбреЗрдХ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдпреВрдирд┐рдЯ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, avcodec_open2()
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрд╢рд╛ time_base
рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдпрд╣ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреЛрдбреЗрдХ рдХреЗ рдЯрд╛рдЗрдо рдпреВрдирд┐рдЯ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдлреНрд░реЗрдо рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд░реЗрдВред рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЖрдкрдХреЛ рдкреИрдХреЗрдЬ рдХреЗ dts
рдФрд░ dts
рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдПрдХ рдкреИрдХреЗрдЯ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдбреЗрдХ рдЯрд╛рдЗрдо рдпреВрдирд┐рдЯ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдЯрд╛рдЗрдо рдпреВрдирд┐рдЯ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЯ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
void av_packet_rescale_ts( AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
рдкреИрдХреЗрдЯ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ dts
рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рд╡реГрджреНрдзрд┐ рд╣реЛ, рдЕрдиреНрдпрдерд╛ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛ред (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, av_interleaved_write_frame()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред)
3.4ред рдХреЛрдбреЗрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдп
рдЬрдм рдЖрдк рдХрд┐рд╕реА AVCodec
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкрдВрдЬреАрдХреГрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ AVCodec
рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рджрд╕реНрдп рд╣реИрдВ:
typedef struct AVCodec {
рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛ рдХреЛрдбреЗрдХ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рдХреЛрдбреЗрдХ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛
void avcodec_flush_buffers(AVCodecContext *codec_ctx);
рдпрд╣ рдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╡рд░реНрддрдорд╛рди рдкреНрд▓реЗрдмреИрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрдмрд░рди рдмрджрд▓рдирд╛ред
4. рдХреЛрдбреЗрдХ рдХреЗ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
4.1ред рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХрдиреЗрдХреНрд╢рди
рдХреЛрдбреЗрдХ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдЧрдарди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: FFmpeg рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХреЛрдбреЗрдХ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдФрд░ FFmpeg рдХреЗ рдмрд╛рд╣рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ (рдПрдХ рддрд░рд╣ рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕) рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
. рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:
- , FFmpeg ;
- C, , C++;
- framework, FFmpeg.
, FFmpeg ┬л┬╗, FFmpeg API. ┬л┬╗ FFmpeg ( , ), . тАФ . .
typedef int(*dec_extern_t)(const void*, int, void*); static int frox_decode( AVCodecContext* codec_ctx, void* outdata, int *outdata_size, AVPacket* pkt) { int ret = -1; void* out_buff;
FFmpeg API ( C++) .
extern "C" { int DecodeFroxData(const void* buff, int size, void* outBuff); typedef int(*dec_extern_t)(const void*, int, void*); #include <libavcodec/avcodec.h> #include <libavutil/opt.h> } // ... AVCodecContext* ctx; // ... dec_extern_t dec = DecodeFroxData; void* pv = &dec; auto pb = static_cast<const uint8_t*>(pv); auto sz = sizeof(dec); av_opt_set_bin(ctx->priv_data, "frox_bin", pb, sz, 0);
4.2.
тАФ . , . , . , , FFmpeg , ┬л┬╗ , . . , . FFmpeg API - , , . . , . PC (Windows) DirectShow AVI . PC - DirectShow. 32- FourCC. ( biCompression
BITMAPINFOHEADER
.) , DirectShow , PC -. FFmpeg , , , codec_tag
AVCodecParameters
FourCC, . FFmpeg API , . FFmpeg FFmpeg API.
, *.mkv
FFmpeg ( ENCODER
).
рдирд┐рд╖реНрдХрд░реНрд╖
, , FFmpeg: , changelog, .. ┬л┬╗ FFmpeg, , .
рд╕рд╛рдзрди
FFmpeg
[1] FFmpeg тАФ
[2] FFmpeg тАФ
[3] FFmpeg тАФ
[4] FFmpeg тАФ Ubuntu
[5] FFmpeg Compilation Guide
[6] Compilation of FFmpeg 4.0 in Windows 10
FFmpeg API
[7] ffmpeg
[8] FFmpeg codec HOWTO
[9] FFmpeg video codec tutorial