Itseez рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рд╣рдо рдПрдХ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдлреНрд▓реИрд╢ рдХрд╛рд░реНрдб рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред рдХрдард┐рдирд╛рдИ рдпрд╣ рдереА рдХрд┐ рд╕реАрдкреАрдпреВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦрдкрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡реАрдбрд┐рдпреЛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд░реАрдпрддрд╛ рдирд╣реАрдВ рдереА рдХрд┐ рдХрд┐рд╕ рдХреЛрдбреЗрдХ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдХрд┐рд╕ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрджрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд╕реЗ рдПрдлрдкреАрдПрд╕ (рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлреНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛) рдкреНрд░рднрд╛рд╡рд┐рдд рди рд╣реЛред RAW рд╕реЗ H.264 рддрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛрдбреЗрдХреНрд╕
рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рдмрд╛рдж (FFmpeg рдкрд░
OpenCV рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рд╣рдо рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рдЗрд╕рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдЪреНрдЪ рднрд╛рд░ рдкрд░, рдПрдлрдкреАрдПрд╕ 20 рд╕реЗ 5 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реЗ рдиреАрдЪреЗ рдЪрд▓рд╛ рдЧрдпрд╛, рдЬрдмрдХрд┐ рдЪрд┐рддреНрд░ 320x240 рдХреЗ рд╕рдВрдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рд╣реИред рдереЛрдбрд╝рд╛ рдЧреБрдЧрд▓реА рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ H.264 рдорд╛рдирдХ (рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдЦрд░реАрджрд╛ рдЧрдпрд╛ рдерд╛) рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдПрдирдХреЛрдбрд░ рд╣реИред рд╕рд╛рде рд╣реА, рдПрдиреНрдХреЛрдбрд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдУрдкрдирдореИрдХреНрд╕ рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП
рдУрдкрдирдореИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЗрдЦрди рдХреЛрдб рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдХрд▓рд╛, рд╡реИрд╕реЗ, рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ!
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдиреАрдЪреЗ рдПрдХ рдирдореВрдирд╛ рд╡реАрдбрд┐рдпреЛ рд╣реИ:
ред
OpenMAX (рдУрдкрди рдореАрдбрд┐рдпрд╛ рдПрдХреНрд╕реЗрд▓реЗрд░реЗрд╢рди) рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдУрдПрд╕ рдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛ рдХрд┐ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ "рдХреНрд▓реАрди" рдУрдкрдирдореИрдХреНрд╕ рдЖрдИрдПрд▓ (рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рд▓реЗрдпрд░) рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд░реЙрдбрдХреЙрдо рдЪрд┐рдк рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рдЕрдиреНрдп рдмреЛрд░реНрдб рдкрд░ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдУрдкрдирдореИрдХреНрд╕ рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - ilcientред
рд░рд╛рд╕реНрдкрд┐рдпрди рдордЯреНрдард╛ рд╡рд┐рддрд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдУрдкрдирдореИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЬреЛ / рдСрдкреНрдЯ / рд╡реАрд╕реА / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред OpenMAX рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП / opt / vc / src / hello_pi / libs / ilclient / subdirectory рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реЛрддрд╛ рд╣реИред рдпреЗ ilclient.c ilclient.h рдФрд░ ilcore.c рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред
рдЖрдЗрдП рдХрд╛рд░реНрдп рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдХреИрдорд░реЗ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рд╣реИ, рдПрдХрд▓-рдЪреИрдирд▓ (рдЬреЛ рдХрд┐, рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж), 320x240 рдХреЗ рд╕рдВрдХрд▓реНрдк рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдУрдкрдирд╕реАрд╡реА рд╕реЗ рдЖрдИрдкреНрд▓реЗрдореИрдЬ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдЪрд╡реА рдХрдВрдЯреЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ AVI рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдмрдЯреИрдХреНрд╢рдВрд╕ рдФрд░ рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рд╡реЗ рд╣рд▓ рдХрд┐рдП рдЧрдП рдереЗ:
- рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдЫрд╡рд┐ рдХреЛ рдХреБрдЫ рд░рдВрдЧ рдореЙрдбрд▓ рдореЗрдВ рд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП YUV420p, рд╣рдо FFmpeg рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрд╕реНрдХрд░рдг 0.7.1 рдХреЗ рд╕реЗрдЯ рд╕реЗ рд╕реНрд╡рд╕реНрдХреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
- рд╣рдо OpenMAX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдмрдлрд░ рдХреЛ рдПрдирдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ YUV420p рдореЗрдВ рдЫрд╡рд┐ рдпреБрдХреНрдд рдЗрдирдкреБрдЯ рдмрдлрд░ рдЗрдирдкреБрдЯ рдмрдлрд░ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ H.264 рдХреЛрдбреЗрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред
- рд╣рдо рдПрдХ рд╣реА FFmpeg рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ AVI рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рдВрдХреБрдЪрд┐рдд рдЫрд╡рд┐ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред
рддреЛ рдЕрдВрдХ рдкрд░:
рдкрд░рд┐рд╡рд░реНрддрд┐рдд
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрджрд░реНрдн рдФрд░ рджреЛ AVPicture рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдПрдХрд▓-рдЪреИрдирд▓ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рд╣реИ, рджреВрд╕рд░рд╛ YUV420p рдХреЗ рд▓рд┐рдП рд╣реИ:
#define WIDTH 320 #define HEIGHT 240 AVFrame *input_frame = avcodec_alloc_frame(); r = avpicture_alloc((AVPicture *) input_frame, PIX_FMT_GRAY8, WIDTH, HEIGHT); AVFrame *omx_input_frame = avcodec_alloc_frame(); r = avpicture_alloc((AVPicture *) omx_input_frame, PIX_FMT_YUV420P, WIDTH, HEIGHT); SwsContext *img_convert_ctx = sws_getContext(WIDTH, HEIGHT, PIX_FMT_GRAY8, WIDTH, HEIGHT, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
рд░реВрдкрд╛рдВрддрд░рдг, рдХреНрд░рдорд╢рдГ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
avpicture_fill ((AVPicture *) input_frame, (uint8_t *) frame->imageData, PIX_FMT_GRAY8, WIDTH, HEIGHT); buf->nFilledLen = avpicture_fill ((AVPicture *) omx_input_frame, buf->pBuffer, PIX_FMT_YUV420P, WIDTH, HEIGHT); sws_scale(img_convert_ctx, (const uint8_t* const*)input_frame->data, input_frame->linesize, 0, HEIGHT, omx_input_frame->data, omx_input_frame->linesize);
рдЬрд╣рд╛рдВ buf рдХреЛрдбреЗрдХ рдЗрдирдкреБрдЯ рдмрдлрд░ рд╣реИ, рдФрд░ рдлреНрд░реЗрдо IplImage * рдХреИрдорд░реЗ рд╕реЗ рд╣реИред
рдХреЛрдбрд┐рдВрдЧ
рдпрд╣рд╛рдБ рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдФрд░ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдирдХреЛрдбрд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ:
OMX_VIDEO_PARAM_PORTFORMATTYPE format; OMX_PARAM_PORTDEFINITIONTYPE def; COMPONENT_T *video_encode; ILCLIENT_T *client; OMX_BUFFERHEADERTYPE *buf;
рдпрд╣рд╛рдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ: рдЫрд╡рд┐ рдХреА рдКрдБрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ, рдПрдлрдкреАрдПрд╕ рдФрд░ рд░рдВрдЧ рдпреЛрдЬрдирд╛ред рдкреЛрд░реНрдЯ 200 рд╡рд┐рдбрд┐рдпреЛ_рдПрдиреНрдХреЛрдб рдШрдЯрдХ рдЪрд╛рд▓рдХ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдирдкреБрдЯ рдкреЛрд░реНрдЯ рд╣реИ, 201 рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рд╣реИред рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рди (рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ, рдСрдбрд┐рдпреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рдбрд┐рдХреЛрдбрд┐рдВрдЧ, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрджрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
memset(&format, 0, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE)); format.nSize = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE); format.nVersion.nVersion = OMX_VERSION; format.nPortIndex = VIDEO_ENCODE_PORT_OUT; format.eCompressionFormat = OMX_VIDEO_CodingAVC; r = OMX_SetParameter(ILC_GET_HANDLE(video_encode), OMX_IndexParamVideoPortFormat, &format); OMX_VIDEO_PARAM_BITRATETYPE bitrateType; memset(&bitrateType, 0, sizeof(OMX_VIDEO_PARAM_BITRATETYPE)); bitrateType.nSize = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE); bitrateType.nVersion.nVersion = OMX_VERSION; bitrateType.eControlRate = OMX_Video_ControlRateVariable; bitrateType.nTargetBitrate = BITRATE; bitrateType.nPortIndex = VIDEO_ENCODE_PORT_OUT; r = OMX_SetParameter(ILC_GET_HANDLE(video_encode), OMX_IndexParamVideoBitrate, &bitrateType); ilclient_change_component_state(video_encode, OMX_StateIdle);
рдКрдкрд░, рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдФрд░ рдмрд┐рдЯ рджрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдлреЙрд░реНрдореЗрдЯ редeCompressionFormat = OMX_VIDEO_CodingAVC рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЫрд╡рд┐ H.264 рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реЛрдЧреАред рдЗрд╖реНрдЯрддрдо рдмрд┐рдЯрд░реЗрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЧрдИ рдереА, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИ:
www.ezs3.com/public/What_bitrate_should_I_use_when_encoding_my_video_How_do_I_optimize_my_video_for_the_web.cfm ред
ilclient_enable_port_buffers(video_encode, VIDEO_ENCODE_PORT_IN, NULL, NULL, NULL); ilclient_enable_port_buffers(video_encode, VIDEO_ENCODE_PORT_OUT, NULL, NULL, NULL); ilclient_change_component_state(video_encode, OMX_StateExecuting);
рдЗрд╕рдХреЗ рдмрд╛рдж, рдмрдлрд╝рд░реНрд╕ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦреЗрдВред
рджрд░рдЕрд╕рд▓, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реА:
buf = ilclient_get_input_buffer(video_encode, VIDEO_ENCODE_PORT_IN, 1); OMX_EmptyThisBuffer(ILC_GET_HANDLE(video_encode), buf); out = ilclient_get_output_buffer(video_encode, VIDEO_ENCODE_PORT_OUT, 1); OMX_FillThisBuffer(ILC_GET_HANDLE(video_encode), out);
рд╡реАрдбрд┐рдпреЛ рд╕рд╣реЗрдЬреЗрдВ
рдпрд╣рд╛рдБ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ FFmpeg рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ:
AVCodecContext *cc; char *out_file_name;
рдЕрдЧрд▓рд╛, рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╣реЗрдбрд░ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦреЗрдВ:
avio_open(&oc->pb, out_file_name, URL_WRONLY); avformat_write_header(oc, NULL); if (oc->oformat->flags & AVFMT_GLOBALHEADER) oc->streams[0]->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; av_dump_format(oc, 0, out_file_name, 1);
рдПрдиреНрдХреЛрдбреЗрдб рдЫрд╡рд┐ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛:
AVPacket pkt; AVRational omxtimebase = { 1, FPS}; OMX_TICKS tick = out->nTimeStamp; av_init_packet(&pkt); pkt.stream_index = video_st->index; pkt.data= out->pBuffer; pkt.size= out->nFilledLen; if (out->nFlags & OMX_BUFFERFLAG_SYNCFRAME) pkt.flags |= AV_PKT_FLAG_KEY; pkt.pts = av_rescale_q(((((uint64_t)tick.nHighPart)<<32) | tick.nLowPart), omxtimebase, oc->streams[video_st->index]->time_base); pkt.dts = AV_NOPTS_VALUE; av_write_frame(oc, &pkt); out->nFilledLen = 0;
Av_rescale_q рдлрд╝рдВрдХреНрд╢рди рдХреЛрдбреЗрдХ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реНрд░реЗрдо рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
#include "opencv2/core/core_c.h" #include "opencv2/imgproc/imgproc_c.h" #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include "libavutil/opt.h" #include "libavutil/avutil.h" #include "libavutil/mathematics.h" #include "libavformat/avio.h" #include "bcm_host.h" #include "ilclient.h"
рддрджрдиреБрд╕рд╛рд░, рдЖрдкрдХреЛ FFmpeg рдФрд░ OpenCV рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓реЗрдВ "bcm_host.h" рдФрд░ "ilclient.h" рдкрде / рдСрдкреНрдЯ / vc / рдХреЗ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред ilclient.c рдФрд░ ilcore., рдЬрд┐рд╕рдореЗрдВ OpenMAX рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд╕реНрдерд┐рдд рд╣реИ, рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
-L/opt/vc/lib -lbcm_host -lopenmaxil -lbcm_host -lvcos -lvchiq_arm тАУlpthread
рдареАрдХ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдкрдХреЛ FFmpeg рдФрд░ OpenCV рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
-L/usr/local/lib -lavcodec -lavformat -lavutil -lswscale \ -L/usr/local/lib -lopencv_imgproc -lopencv_core
рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рдЬрдм рд╣рдорд╛рд░реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рд╕реЗрд╡ рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдПрдлрдкреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдкрд╣рд▓реЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛрдбреЗрдХреНрд╕ рдПрдлрдкреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп 40-60% рддрдХ рдЧрд┐рд░ рдЧрдпрд╛ рдерд╛ред рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ: