FFmpeg рдореЗрдВ рдХреЛрдбреЗрдХ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ


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; // ... } AVCodecDescriptor; 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рдореБрдЦ рд╕рджрд╕реНрдп 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; // ... } AVCodec; 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рджрд╕реНрдп 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 ред рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


  1. рдПрдХ рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рдореМрдЬреВрджрд╛ рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
  2. рдореМрдЬреВрджрд╛ рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рди рдмрджрд▓реЗрдВ;
  3. рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХреЛрдбреЗрдХреНрд╕ рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рдПрдХ рдирдпрд╛ рдорд╛рди рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред

рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рддрддреНрд╡ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ AV_CODEC_ID_FROX рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред AV_CODEC_ID_PCM_S64LE рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд░рдЦреЗрдВ рдФрд░ 0x10700 рдорд╛рди 0x10700 ред


рдЪрд░рдг 2ред рдЖрдЗрдЯрдо рдХреЛ codec_descriptors рд╕рд░рдгреА (рдлрд╝рд╛рдЗрд▓ libavcodec/codec_desc.c ) рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред


 static const AVCodecDescriptor codec_descriptors[] = { // ... { .id = AV_CODEC_ID_FROX, .type = AVMEDIA_TYPE_AUDIO, .name = "frox", .long_name = NULL_IF_CONFIG_SMALL("FROX audio"), .props = AV_CODEC_PROP_LOSSLESS, }, // ... }; 

рдЖрдкрдХреЛ рддрддреНрд╡ рдХреЛ "рд╕рд╣реА" рд╕реНрдерд╛рди рдкрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, id рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреА рдПрдХрд░реВрдкрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЪрд░рдг 3. рдПрдиреНрдХреЛрдбрд░ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП AVCodec рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХреЛрдбреЗрдХ рдФрд░ рдХрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рдЗрди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЕрддреНрдпрдВрдд рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдмрд╛рдж рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдХреЛрдб рдХреЛ рдлрд╛рдЗрд▓ libavcodec/frox.c


 #include "avcodec.h" // context typedef struct FroxContext { // ... } FroxContext; // decoder static int frox_decode_init(AVCodecContext *codec_ctx) { return -1; } static int frox_decode_close(AVCodecContext *codec_ctx) { return -1; } static int frox_decode(AVCodecContext *codec_ctx, void* outdata, int *outdata_size, AVPacket *pkt) { return -1; } AVCodec ff_frox_decoder = { .name = "frox_dec", .long_name = NULL_IF_CONFIG_SMALL("FROX audio decoder"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_FROX, .priv_data_size = sizeof(FroxContext), .init = frox_decode_init, .close = frox_decode_close, .decode = frox_decode, .capabilities = AV_CODEC_CAP_LOSSLESS, .sample_fmts = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_NONE}, .channel_layouts = (const int64_t[]) {AV_CH_LAYOUT_MONO, 0 }, }; // encoder static int frox_encode_init(AVCodecContext *codec_ctx) { return -1; } static int frox_encode_close(AVCodecContext *codec_ctx) { return -1; } static int frox_encode(AVCodecContext *codec_ctx, AVPacket *pkt, const AVFrame *frame, int *got_pkt_ptr) { return -1; } AVCodec ff_frox_encoder = { .name = "frox_enc", .long_name = NULL_IF_CONFIG_SMALL("FROX audio encoder"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_FROX, .priv_data_size = sizeof(FroxContext), .init = frox_encode_init, .close = frox_encode_close, .encode2 = frox_encode, .sample_fmts = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE}, .channel_layouts = (const int64_t[]) {AV_CH_LAYOUT_MONO, 0 }, }; 

рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдирдХреЛрдбрд░ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдХрд╛ рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рд╣реИ - 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[] = { // ... &ff_frox_encoder, // ... &ff_frox_decoder, // ... NULL }; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 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", AV_CODEC_ID_FROX}, // ... }; 

рд╕реНрдЯреНрд░рд┐рдВрдЧ "A_FROX" рдФрд░ рд╕реВрдЪрдирд╛ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдлрд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ, рдпрд╣ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЬрдм рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреАрдореБрд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Demultiplexer codec_id рд╕рдВрд░рдЪрдирд╛ рдХреЗ codec_id рд╕рджрд╕реНрдп рдХреЛ рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕реВрдЪрдХ AVStream рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИред


2. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ libavformat/matroskaenc.c , additional_audio_tags libavformat/matroskaenc.c рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ:


 static const AVCodecTag additional_audio_tags[] = { // ... { AV_CODEC_ID_FROX, 0XFFFFFFFF }, // ... }; 

рддреЛ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, 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 = { // ... .priv_data_size = sizeof(FroxContext), .priv_class = &frox_class, // ... }; AVCodec ff_frox_encoder = { // ... .priv_data_size = sizeof(FroxContext), .priv_class = &frox_class, // ... }; 

рдЕрдм рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп


 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; // ... AVCodecContext *codec_ctx = avcodec_alloc_context3(codec); // ... av_opt_set(codec_ctx->priv_data, "frox_str", "meow", 0); av_opt_set_int(codec_ctx->priv_data, "frox_int", 42, 0); 

рдПрдХ рдЕрдиреНрдп рддрд░реАрдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм 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; // ... FroxContext* frox_ctx = codec_ctx->priv_data; 

рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ 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); 

рдЙрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


  1. рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд┐рдХреЛрдбрд┐рдВрдЧ;
  2. рдЖрдЙрдЯрдкреБрдЯ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХрд╛ рдЖрд╡рдВрдЯрди;
  3. рдмрдлрд░ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХреИрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВред 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); 

рдЙрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


  1. рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдбрд┐рдВрдЧ;
  2. рдЖрдЙрдЯрдкреБрдЯ рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХрд╛ рдЖрд╡рдВрдЯрди;
  3. рдкреИрдХреЗрдЯ рдмрдлрд░ рдХреЛ рдПрдиреНрдХреЛрдбреЗрдб рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░реЗрдВред

рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


 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 (*init_static_data)(AVCodec *codec); void (*flush)(AVCodecContext *codec_ctx); // ... } AVCodec; 

рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛ рдХреЛрдбреЗрдХ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рджреВрд╕рд░рд╛ рдХреЛрдбреЗрдХ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛


 void avcodec_flush_buffers(AVCodecContext *codec_ctx); 

рдпрд╣ рдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╡рд░реНрддрдорд╛рди рдкреНрд▓реЗрдмреИрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрдмрд░рди рдмрджрд▓рдирд╛ред



4. рдХреЛрдбреЗрдХ рдХреЗ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



4.1ред рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХрдиреЗрдХреНрд╢рди


рдХреЛрдбреЗрдХ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдЧрдарди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: FFmpeg рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХреЛрдбреЗрдХ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдФрд░ FFmpeg рдХреЗ рдмрд╛рд╣рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ (рдПрдХ рддрд░рд╣ рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕) рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред


. рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:


  1. , FFmpeg ;
  2. C, , C++;
  3. 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; //      out_buff FroxContext *fc = codec_ctx->priv_data; if (fc->bin_size > 0) { if (fc->bin_size == sizeof(dec_extern_t)) { dec_extern_t edec; memcpy(&edec, fc->frox_bin, fc->bin_size); ret = (*edec)(pkt->data, pkt->size, out_buff); if (ret >= 0) { //     out_buff   } } else { /*  */ } } else { /*    */ } // ... return ret; } 

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




Source: https://habr.com/ru/post/hi480714/


All Articles