рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ: рдПрди .264 рд▓рд╛рдЗрд╡ рд╡реАрдбрд┐рдпреЛ рдПрдирдХреЛрдб рдХрд░реЗрдВ

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 рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдмрдЯреИрдХреНрд╢рдВрд╕ рдФрд░ рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рд╡реЗ рд╣рд▓ рдХрд┐рдП рдЧрдП рдереЗ:


рддреЛ рдЕрдВрдХ рдкрд░:

рдкрд░рд┐рд╡рд░реНрддрд┐рдд


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрджрд░реНрдн рдФрд░ рджреЛ 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; //  OMX_BUFFERHEADERTYPE *out; //  int r = 0; #define VIDEO_ENCODE_PORT_IN 200 #define VIDEO_ENCODE_PORT_OUT 201 #define BITRATE 400000 #define FPS 25 bcm_host_init(); client = ilclient_init(); OMX_Init(); ilclient_create_component(client, &video_encode, "video_encode", (ILCLIENT_CREATE_FLAGS_T)(ILCLIENT_DISABLE_ALL_PORTS | ILCLIENT_ENABLE_INPUT_BUFFERS | ILCLIENT_ENABLE_OUTPUT_BUFFERS)); memset(&def, 0, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); def.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); def.nVersion.nVersion = OMX_VERSION; def.nPortIndex = VIDEO_ENCODE_PORT_IN; OMX_GetParameter(ILC_GET_HANDLE(video_encode), OMX_IndexParamPortDefinition, &def); def.format.video.nFrameWidth = WIDTH; def.format.video.nFrameHeight = HEIGHT; def.format.video.xFramerate = FPS << 16; def.format.video.nSliceHeight = def.format.video.nFrameHeight; def.format.video.nStride = def.format.video.nFrameWidth; def.format.video.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar; r = OMX_SetParameter(ILC_GET_HANDLE(video_encode), OMX_IndexParamPortDefinition, &def); 

рдпрд╣рд╛рдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ: рдЫрд╡рд┐ рдХреА рдКрдБрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ, рдПрдлрдкреАрдПрд╕ рдФрд░ рд░рдВрдЧ рдпреЛрдЬрдирд╛ред рдкреЛрд░реНрдЯ 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; //    .avi AVOutputFormat *fmt; AVFormatContext *oc; AVStream *video_st; av_register_all(); fmt = av_guess_format(NULL, out_file_name, NULL); oc = avformat_alloc_context(); oc->debug = 1; oc->start_time_realtime = AV_NOPTS_VALUE; oc->start_time = AV_NOPTS_VALUE; oc->duration = 0; oc->bit_rate = 0; oc->oformat = fmt; snprintf(oc->filename, sizeof(out_file_name), "%s", out_file_name); video_st = avformat_new_stream(oc, NULL); cc = video_st->codec; cc->width = WIDTH; cc->height = HEIGHT; cc->codec_id = CODEC_ID_H264; cc->codec_type = AVMEDIA_TYPE_VIDEO; cc->bit_rate = BITRATE; cc->profile = FF_PROFILE_H264_HIGH; cc->level = 41; cc->time_base.den = FPS; cc->time_base.num = 1; video_st->time_base.den = FPS; video_st->time_base.num = 1; video_st->r_frame_rate.num = FPS; video_st->r_frame_rate.den = 1; video_st->start_time = AV_NOPTS_VALUE; cc->sample_aspect_ratio.num = video_st->sample_aspect_ratio.num; cc->sample_aspect_ratio.den = video_st->sample_aspect_ratio.den; 

рдЕрдЧрд▓рд╛, рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╣реЗрдбрд░ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦреЗрдВ:
 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% рддрдХ рдЧрд┐рд░ рдЧрдпрд╛ рдерд╛ред рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:

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


All Articles