{"id":305660,"date":"2020-06-20T15:00:31","date_gmt":"2020-06-20T15:00:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=305660"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=305660","title":{"rendered":"Android Camera2 API \u043e\u0442 \u0447\u0430\u0439\u043d\u0438\u043a\u0430, \u0447\u0430\u0441\u0442\u044c 6. \u0421\u0442\u0440\u0438\u043c \u0432\u0438\u0434\u0435\u043e \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/507152\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kc\/r8\/1j\/kcr81jq0kizdeipzvrz2kzp5_w4.png\"><\/div>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u0436\u0438\u0432\u043e\u0433\u043e\u00bb \u0432\u0438\u0434\u0435\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 H.264 \u043d\u0430 Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043d\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u043e\u0434 \u0432\u0438\u043d\u0434\u043e\u0439. \u0422\u0430\u043c \u043d\u0430\u0448 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u044b\u0432\u0430\u043b\u0441\u044f \u0438 \u043b\u0438\u0446\u0435\u0437\u0440\u0435\u043b\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e VLC \u043f\u043b\u0435\u0435\u0440\u0430. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 VLCJ CAPRICA \u0431\u043b\u0430\u0433\u043e\u043f\u043e\u043b\u0443\u0447\u043d\u043e \u0432\u043f\u0438\u0445\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u0432 \u043e\u043a\u043e\u0448\u043a\u0438 JAVA \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u0440\u0430\u0432\u0434\u0430, \u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d (VLC \u043f\u043b\u0435\u0435\u0440) \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u043b, \u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439. \u041d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u2014 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0434\u0430 \u0438 \u043b\u0430\u0434\u043d\u043e. <\/p>\n<p>  <s>\u041f\u043e\u0434\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0439<\/s> \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u043d\u043e\u0443\u0442\u0431\u0443\u043a, \u043b\u044d\u043f\u0442\u043e\u043f \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0440\u043e\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432\u0438\u0434\u0435\u043e \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0434\u0435\u0432\u0430\u0439\u0441\u0430\u043c\u0438 \u043d\u0435 \u0438\u0437-\u0437\u0430 \u0441\u0442\u043e\u043b\u0430, \u0430 \u0447\u0430\u0449\u0435 \u0432\u0430\u043b\u044f\u044f\u0441\u044c \u043d\u0430 \u0434\u0438\u0432\u0430\u043d\u0435, \u0441\u043e \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u043c \u0432 \u0440\u0443\u043a\u0430\u0445. \u0418 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0434\u0430\u0436\u0435 \u043d\u0430\u0448\u0435\u0439 \u0440\u043e\u0431\u043e\u0442\u0435\u043b\u0435\u0436\u043a\u043e\u0439 \u043d\u044b\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0442\u0443\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u043d\u0430\u0448 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0447\u0435\u0440\u0435\u0437 Camera2 API, \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e Surface, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e!<\/p>\n<p>  \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u2014 \u0432\u043f\u0435\u0440\u0451\u0434.<br \/>  <a name=\"habracut\"><\/a><br \/>   \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u043d\u0435 \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u044f, \u043f\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u043e\u0441\u043b\u0438\u043a\u0430 \u0418\u0430, \u043a \u043e\u0431\u0430\u043b\u0434\u0435\u0432\u0430\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438? \u041e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0440\u043e \u0440\u043e\u0431\u043e\u0442\u0435\u043b\u0435\u0436\u043a\u0443 \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 (\u044f \u0434\u0443\u043c\u0430\u044e \u0437\u0430 \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u043d\u0430 \u0443\u0436\u0435 \u0432\u0441\u0435\u043c \u0443\u0441\u043f\u0435\u043b\u0430 \u0438\u0437\u0440\u044f\u0434\u043d\u043e \u043d\u0430\u0434\u043e\u0435\u0441\u0442\u044c). \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043a\u043e\u0434\u0438\u0440\u0443\u044f-\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044f \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u0439 \u0432\u0438\u0434\u0435\u043e\u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0435\u0442\u0438. <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442:<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0434\u043e \u0435\u0449\u0451 \u0438 \u0430\u0443\u0434\u0438\u043e \u043a\u0430\u043d\u0430\u043b \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c.  <\/div>\n<\/p><\/div>\n<p>   \u0410 \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u043e\u043c \u0432\u0438\u0434\u0435\u043e (\u0431\u0435\u0437 \u0437\u0432\u0443\u043a\u0430). \u041d\u043e \u0442\u043e\u0436\u0435 \u0441 \u0431\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e, \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u044e \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u0442\u0435\u043b\u0430. \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0443 \u043d\u0435\u0439\u0440\u043e\u0431\u0438\u043e\u043b\u043e\u0433\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u0433\u043b\u0430\u0437 \u0442\u043e, \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u043e\u043c\u0443 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>  \u042d\u0442\u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0430\u0440\u044b VR-\u043e\u0447\u043a\u043e\u0432 \u0434\u043b\u044f \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0445 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u0432. \u041e\u0434\u043d\u0438 \u043e\u0447\u043a\u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0438 \u0434\u043e\u0440\u043e\u0433\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435\u2026 \u0414\u0430, \u0434\u0430\u0436\u0435 \u0437\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0441\u0442\u0430 \u0440\u0443\u0431\u043b\u0435\u0439 \u0441\u043e\u0439\u0434\u0443\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ja\/tm\/ni\/jatmni2lc5bwwzornbgx4vbvj2e.png\" alt=\"image\"><\/p>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0442\u044c \u0443 \u0441\u0432\u043e\u0435\u0439 \u0434\u0435\u0432\u0438\u0446\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 (\u0434\u0435\u0432\u0438\u0446\u0443) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <s>\u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u043e\u0433\u043e \u043a\u0440\u043e\u043b\u0438\u043a\u0430<\/s> \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443, \u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0440\u0430\u0437\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043c (VR \u043e\u0447\u043a\u0438 \u0436\u0435). \u0418 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0435\u0432\u0430\u0439\u0441\u0430 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432 \u0442\u0430\u043a\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0430\u0448 \u043f\u0430\u0440\u0442\u043d\u0435\u0440, \u0430 \u043e\u043d (\u043e\u043d\u0430), \u0432\u0438\u0434\u0438\u0442 \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u044b. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b, \u0432 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0435\u0441\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0438 \u0433\u043b\u0430\u0437\u0430, \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0443 \u0432\u0430\u0441 \u043d\u0435\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0435 (\u0435\u0451) \u0442\u0435\u043b\u043e. \u0414\u043b\u044f \u043d\u0435\u0432\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0435 \u043d\u0435\u043f\u0430\u0445\u0430\u043d\u043d\u043e\u0435, <s>\u043d\u0443 \u0438\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u043c\u0430\u0441\u0443\u0442\u0440\u044b \u0432\u0441\u044f\u043a\u043e\u0439.<\/s><\/p>\n<p>  \u0410 \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0433\u043b\u0430\u0437\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u0438\u043d\u0438\u0442 \u0432\u0430\u0448\u0438 \u043c\u043e\u0437\u0433\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u0443\u0448\u0430\u0440\u0438\u044f.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043f\u043e\u0439\u043b\u0435\u0440<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u0438\u043d\u0438\u0442. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0440\u0430\u0437 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u0432\u0438\u0434\u0435\u0442\u044c \u0442\u043e \u043e\u0434\u043d\u043e, \u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435). \u041d\u043e \u0432\u043e\u0442, \u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e (\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438), \u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.  <\/div>\n<\/p><\/div>\n<p>   \u0412\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0438\u0447\u0435\u043c \u0442\u0430\u043a\u0438\u043c \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u0447\u0430\u0442\u0438\u043a \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0438 \u0437\u0432\u043e\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0432\u043e\u0435\u0439 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0435\u0442\u043a\u0438 (\u043a\u0430\u043a \u043c\u044b \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435). \u041d\u043e, \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0448\u0442\u0443\u043a \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u0438\u0434\u0435\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u043d\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435.<\/p>\n<p>  \u0410 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043d, \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0432 \u043a\u043b\u0430\u0441\u0441\u0435:<\/p>\n<h2>MEDIA CODEC<\/h2>\n<p>   \u0412 \u043f\u0440\u0435\u0434 \u043f\u0440\u0435\u0434 <a href=\"https:\/\/habr.com\/ru\/post\/473036\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435<\/a> \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 H.264 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0435\u0433\u043e \u043f\u043e UDP \u043a\u0430\u043d\u0430\u043b\u0443 \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u043d\u0430\u043c \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u0434 \u0438\u0437 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0430\u0440\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u0441 \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u0434\u0432\u0443\u0445 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430\u0445 \u0441\u0440\u0430\u0437\u0443, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c. \u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0440\u0430\u0431\u043e\u0442\u044b. \u0412 \u043e\u0434\u043d\u043e\u043c \u043e\u043a\u043e\u0448\u043a\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e, \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u043e \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0435\u0442\u043a\u0435 \u0441\u0430\u043c\u0438\u043c \u0441\u0435\u0431\u0435 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0435 \u043e\u043a\u043e\u0448\u043a\u043e. \u0412\u0441\u0451 \u043f\u043e-\u0447\u0435\u0441\u0442\u043d\u043e\u043c\u0443, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u00ablocalhost\u00bb \u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 127.0.0.1. \u0422\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0430\u0434\u0440\u0435\u0441, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0430\u0440\u0434\u043a\u043e\u0440!<\/p>\n<p>  \u0412 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0439\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c:<\/p>\n<ol>\n<li>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 UI, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043d\u0438\u043c Surface<\/li>\n<li> \u0411\u043b\u043e\u043a \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e UDP \u043a\u0430\u043d\u0430\u043b\u0443<\/li>\n<li> \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<\/ol>\n<p>   \u0412\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u043e\u0431 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439 \u0443\u0434\u0430\u0440\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f. <\/p>\n<p>  <b>\u0418\u0442\u0430\u043a, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u043a\u0435\u0442 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0435 \u043e\u043a\u043d\u043e.<\/b><\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">activity_main.xml<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;     xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;     xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;     android:layout_width=&quot;match_parent&quot;     android:layout_height=&quot;match_parent&quot;     tools:context=&quot;.MainActivity&quot;&gt;      &lt;TextureView         android:id=&quot;@+id\/textureView&quot;         android:layout_width=&quot;320dp&quot;         android:layout_height=&quot;240dp&quot;         android:layout_marginTop=&quot;88dp&quot;         app:layout_constraintEnd_toEndOf=&quot;parent&quot;         app:layout_constraintHorizontal_bias=&quot;0.494&quot;         app:layout_constraintStart_toStartOf=&quot;parent&quot;         app:layout_constraintTop_toTopOf=&quot;parent&quot; \/&gt;      &lt;TextureView         android:id=&quot;@+id\/textureView3&quot;         android:layout_width=&quot;320dp&quot;         android:layout_height=&quot;240dp&quot;         android:layout_marginTop=&quot;24dp&quot;         app:layout_constraintEnd_toEndOf=&quot;parent&quot;         app:layout_constraintHorizontal_bias=&quot;0.494&quot;         app:layout_constraintStart_toStartOf=&quot;parent&quot;         app:layout_constraintTop_toBottomOf=&quot;@+id\/textureView&quot; \/&gt;      &lt;LinearLayout         android:layout_width=&quot;165dp&quot;         android:layout_height=&quot;40dp&quot;         app:layout_constraintBottom_toBottomOf=&quot;parent&quot;         app:layout_constraintEnd_toEndOf=&quot;parent&quot;         app:layout_constraintStart_toStartOf=&quot;parent&quot;         app:layout_constraintTop_toBottomOf=&quot;@+id\/textureView3&quot;         app:layout_constraintVertical_bias=&quot;0.838&quot;&gt;          &lt;Button             android:id=&quot;@+id\/button1&quot;             android:layout_width=&quot;wrap_content&quot;             android:layout_height=&quot;36dp&quot;             android:text=&quot;\u0432\u043a\u043b&quot; \/&gt;          &lt;Button             android:id=&quot;@+id\/button3&quot;             android:layout_width=&quot;wrap_content&quot;             android:layout_height=&quot;37dp&quot;             android:text=&quot;\u0432\u044b\u043a\u043b&quot; \/&gt;     &lt;\/LinearLayout&gt;  &lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>   \u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442. \u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u044d\u0439\u0442\u0430\u0433\u0440\u0430\u043c\u043c<\/h2>\n<p>   \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u044d\u0439\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438, \u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u043e. \u041c\u044b \u0434\u043e\u0436\u0438\u0434\u0430\u043b\u0438\u0441\u044c, \u043a\u043e\u0433\u0434\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 <b>onOutputBufferAvailable<\/b>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0445\u0430\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 \u043d\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 UDP \u043f\u0430\u043a\u0435\u0442. \u0414\u0430\u043b\u044c\u0448\u0435 \u043e\u043d \u0443\u0436\u0435 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0439 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0443\u0435\u0437\u0436\u0430\u043b \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u043c\u044b \u0435\u0433\u043e \u0435\u0449\u0451 \u0440\u0443\u0431\u0438\u043b\u0438 \u043d\u0430 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 (\u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u043b\u0435\u0437 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Maximum_transmission_unit\" rel=\"nofollow\">\u0440\u0430\u0437\u043c\u0435\u0440 MTU<\/a>), \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0438\u0437\u043b\u0438\u0448\u043d\u0435 (\u0438 \u0434\u0430\u0436\u0435, \u043a\u0430\u043a \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0442\u043e\u043c, \u0432\u0440\u0435\u0434\u043d\u043e). <\/p>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435 \u043f\u0440\u0438\u0451\u043c\u0430, \u043d\u0430\u0434\u043e \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u0430\u043c\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0451\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0434\u044d\u0439\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u0430. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u0443\u0440\u0438\u043b \u043b\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0443\u0436\u0435 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0439 \u043f\u0430\u043a\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u043d\u043e\u0432\u044b\u0439, \u0430 \u043d\u0435 \u0431\u044b\u0432\u0448\u0438\u0439 \u0432 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0438. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u043c\u044b, (\u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a) \u0432 Java \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u0438\u0431\u044b\u0432\u0448\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0440\u0430\u0437\u043c\u0435\u0440 \u0435\u0433\u043e \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a-\u0431\u044b \u0445\u043e\u0447\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 stackoverflow \u044f \u043d\u0430\u0448\u0435\u043b \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043d\u043e \u0442\u0430\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430. <a href=\"https:\/\/ru.stackoverflow.com\/questions\/817289\/%d0%9a%d0%b0%d0%ba-%d1%83%d0%b7%d0%bd%d0%b0%d1%82%d1%8c-%d0%b4%d0%bb%d0%b8%d0%bd%d1%83-%d0%bf%d0%b0%d0%ba%d0%b5%d1%82%d0%b0-%d0%bf%d0%be-datagramchannel\/1129824#1129824\" rel=\"nofollow\">\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443<\/a> \u0438 \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0448\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0432\u044b\u0439\u0434\u0435\u0442 \u0438\u0437 \u0442\u0443\u043f\u0438\u043a\u0430, \u043f\u0443\u0441\u0442\u044c \u0438 \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0430 \u0433\u043e\u0434\u0430. <\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435, \u043a\u043e\u0434 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u043c: <\/p>\n<pre><code class=\"java\">        Udp_recipient()         {             start();             mNewFrame = false;         }         public void run()         {                           try {                     byte buffer[] = new byte[50000];                     DatagramPacket p = new DatagramPacket(buffer, buffer.length);                     udpSocketIn.receive(p);                     byte bBuffer[] = p.getData();                     outDataForEncoder = new byte[p.getLength()];                       synchronized (outDataForEncoder)                      {                          for (int i = 0; i &lt; outDataForEncoder.length; i++)                          {                              outDataForEncoder[i] = bBuffer[i];                          }                      }                     mNewFrame = true;                   } catch (Exception e) {                     Log.i(LOG_TAG, e + &quot;  &quot;);                 }              }         } <\/code><\/pre>\n<p>   \u0418\u0442\u0430\u043a, \u043f\u043e\u0442\u043e\u043a \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u044d\u0439\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433 NewFrame, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043d\u0435 \u043f\u0443\u0442\u0430\u043b\u0441\u044f \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433 \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e UDP \u043f\u0430\u043a\u0435\u0442\u0430. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u044f\u0432\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0441\u043a\u0443\u0440\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043e\u043d\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442. \u0410 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0443<\/h2>\n<p>   \u041a\u0430\u043a \u0438 \u043a\u043e\u0434\u0435\u0440 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0434\u0432\u0443\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u0443\u0447\u0440\u0435\u0436\u0434\u0430\u0435\u0442\u0435 \u043d\u0435\u043c\u0430\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0444\u043b\u0430\u0433\u043e\u0432 \u0438 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u043f\u0430\u0441\u0442\u044c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u043e\u043d\u043e\u043a (\u0432\u0441\u0451 \u0436 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435). \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0443\u0447\u0435\u0439 \u0441\u0442\u0435\u0440\u0435\u043e\u0442\u0438\u043f\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0435\u0447\u0438\u0438 <b>Boiler Plate<\/b>, \u0438 \u0432 \u043e\u0431\u0449\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d. <\/p>\n<p>  \u041d\u0443, \u0430 \u043c\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u0438\u0434\u0435\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438, \u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0448\u0430\u0433 \u043d\u0430\u0437\u0430\u0434 \u043a \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438, \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a, \u043d\u0430\u043c \u043d\u0435 \u043a \u043b\u0438\u0446\u0443. \u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u0442\u0430\u043c \u0442\u0430\u043a\u0430\u044f:\u00ab \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0430 \u043e\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0445\u0435\u043b\u043f!\u00bb. <\/p>\n<p>  \u0422\u043e \u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043c \u0432\u0441\u0451 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e (\u0430 \u043e\u043d\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a), \u0442\u043e \u043b\u0438 \u043f\u0440\u0430\u0432\u0434\u0430, \u043e\u043d\u043e \u0443 \u0432\u0441\u0435\u0445 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u044f\u0442\u044c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0447\u0440\u0435\u0436\u0434\u0430\u0435\u043c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430. \u042d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u0434\u0435\u0440\u0430 \u0438 \u043d\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432 \u043f\u0438\u0445\u0435\u043b\u044f\u0445 (\u044d\u0442\u043e \u043c\u043e\u0435 \u043b\u0438\u0447\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435 \u2014 \u043f\u0438\u0445\u0435\u043b\u044c, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0440\u043e\u0434\u043d\u0438\u043c \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439). \u041f\u043e\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u043c 640 \u043d\u0430 480. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0441\u043e\u0431\u0430\u0447\u0438\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043a Surface \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043a\u0443\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c.<\/p>\n<pre><code class=\"java\">\t       try {              decoder = MediaCodec.createDecoderByType(&quot;video\/avc&quot;);\/\/ H264 \u0434\u0435\u043a\u043e\u0434\u0435\u043a          } catch (Exception e) {             Log.i(LOG_TAG, &quot;\u0430 \u043d\u0435\u0442\u0443 \u0434\u0435\u043a\u043e\u0434\u0435\u043a\u0430&quot;);         }          int width = 480; \/\/ \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0438\u0434\u0435\u043e         int height = 640; \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0438\u0434\u0435\u043e           MediaFormat format = MediaFormat.createVideoFormat(&quot;video\/avc&quot;, width, height);          format.setInteger(MediaFormat.KEY_ROTATION,90);         SurfaceTexture texture = mImageViewDown.getSurfaceTexture();         texture.setDefaultBufferSize(480, 640);         mDecoderSurface = new Surface(texture);          decoder.configure(format, mDecoderSurface, null,0);         decoder.setOutputSurface(mDecoderSurface);          decoder.setCallback(new DecoderCallback());         decoder.start();         Log.i(LOG_TAG, &quot;\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440&quot;); <\/code><\/pre>\n<p>   \u0414\u0430\u043b\u0435\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0430\u043c. \u041d\u0443\u0436\u043d\u044b\u0445, \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0434\u0432\u0430:<\/p>\n<pre><code class=\"java\"> \tvoid onInputBufferAvailable(MediaCodec mc, int inputBufferId)  \tvoid onOutputBufferAvailable(MediaCodec mc, int outputBufferId, \u2026) <\/code><\/pre>\n<p>   \u0422\u043e \u0435\u0441\u0442\u044c, \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0430 \u043c\u044b \u0432 \u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0434\u0451\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043d\u0438\u043c\u0430\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u0435\u043d\u044c\u043a\u043e\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 Surface. \u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u0442\u043e \u0435\u0441\u0442\u044c, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0438\u0437 Surface \u0432 \u043a\u043e\u0434\u0435\u043a), \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e InputBuffer \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438, \u0430 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 OutputBuffer. \u042d\u0442\u043e \u043c\u043d\u0435 \u0442\u043e\u0436\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u043f\u043e\u043a\u0430 \u044f \u043d\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b:  <\/p>\n<blockquote><p>When using an input Surface, there are no accessible input buffers, as buffers are automatically passed from the input surface to the codec. Calling dequeueInputBuffer will throw an IllegalStateException, and getInputBuffers() returns a bogus ByteBuffer[] array that MUST NOT be written into. <\/p><\/blockquote>\n<p> \u041a\u043e\u0440\u043e\u0447\u0435, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f. \u041d\u0443, \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u043a\u0436\u0435. \u041d\u043e \u043d\u0435\u0442, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u043c\u0435\u0442\u043e\u0434 void (MediaCodec mc, int inputBufferId) \u044f \u043d\u0438\u0447\u0442\u043e\u0436\u0435 \u0441\u0443\u043c\u043d\u044f\u0448\u0435\u0441\u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b:<\/p>\n<pre><code class=\"java\">\t\t private class DecoderCallback extends MediaCodec.Callback {          @Override         public void onInputBufferAvailable(MediaCodec codec, int index) {                   decoderInputBuffer = codec.getInputBuffer(index);                   decoderInputBuffer.clear();                              if(mNewFrame)                              {                                synchronized (outDataForEncoder)                                { b=outDataForEncoder;  }                              }                              decoderInputBuffer.put(b);                  codec.queueInputBuffer(index, 0, b.length,0, 0);               if(mNewFrame)               new Udp_recipient();         }  <\/code><\/pre>\n<p>   \u041d\u0443, \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u0432 \u043a\u043e\u0434\u0435\u0440\u0435. <\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0432\u0434\u0440\u0443\u0433 \u043e\u0449\u0443\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u043c\u0443 \u0441\u0440\u043e\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u043d\u0430\u0448 \u043f\u0440\u0438\u0431\u044b\u0432\u0448\u0438\u0439 udp-\u043f\u0430\u043a\u0435\u0442 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430) \u0432 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 \u043d\u043e\u043c\u0435\u0440\u043e\u043c index. \u0422\u0430\u043c \u0438\u0445 \u0432\u0440\u043e\u0434\u0435 \u0447\u0435\u0442\u044b\u0440\u0435. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u042f \u0436 \u0437\u0430\u0431\u044b\u043b \u043f\u0440\u043e <b>onOutputBufferAvailable<\/b>.<\/p>\n<p>  \u0422\u0443\u0434\u0430 \u0442\u043e\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438:<\/p>\n<pre><code class=\"java\">\t    @Override         public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {             {                   {                       decoderOutputBuffer = codec.getOutputBuffer(index);                       codec.releaseOutputBuffer(index, true);                   }             }         } <\/code><\/pre>\n<p>   \u041f\u0440\u0438\u0447\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 True\/False \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u043e, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f \u043d\u0430 Surface \u0438\u043b\u0438 \u0432\u044b\u043a\u0438\u043d\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043c\u043e\u0439\u043a\u0443.<\/p>\n<p>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e. \u041a\u043e\u043b\u043b\u0431\u044d\u043a <b>onInputBufferAvailable<\/b> \u043f\u0435\u0440\u0435\u0432\u0430\u0440\u0438\u0432\u0430\u043b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u043b\u0447\u0430 \u043f\u043e\u043c\u0438\u0440\u0430\u043b, \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044f \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438. \u041d\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0440\u044f\u0431\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u043b\u0430 \u043a\u0430\u043c\u0435\u0440\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/v3\/s0\/wk\/v3s0wkpwofpruryaex0h5jz-4fe.jpeg\"><\/p>\n<p>  \u0410 \u0432 \u043b\u043e\u0433\u0430\u0445 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0442\u0430\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435:<\/p>\n<p>  <i> buffer descriptor with invalid usage bits 0x2000<br \/>   A resource failed to call release.<\/i><\/p>\n<p>  \u041d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u044f\u0441\u043d\u043e\u0441\u0442\u0438 \u043e\u043d\u0438 \u043d\u0435 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u043b\u0438. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0444\u043b\u0430\u0433 NewFrame (\u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0443\u043a\u0438 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0448\u043b\u0438) \u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043c\u043e\u0433 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 (\u0434\u0430\u043d\u043d\u044b\u0435-\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442, \u043a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c). \u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0431\u044b\u043b\u0430, \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u0430\u044f \u043a\u0430\u0448\u0430, \u043d\u043e <b>onInputBufferAvailable<\/b> \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0431\u043e\u0435\u0432!<\/p>\n<p>  \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0449\u044c. \u0415\u0441\u043b\u0438 \u043a\u043e\u043b\u043b\u0431\u044d\u043a <b>onInputBufferAvailable<\/b>, \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0442\u043e \u0432\u044b\u043d\u044c \u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u044c \u0435\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u0435\u0432\u0430\u0436\u043d\u043e \u043a\u0430\u043a\u0438\u0435, \u043d\u043e \u043f\u043e\u043b\u043e\u0436\u044c. \u0418\u043d\u0430\u0447\u0435 \u043e\u043d \u0434\u043e\u0445\u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0442\u044c \u0435\u043c\u0443 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u043a\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0436\u0435 \u0431\u044b\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d, \u0430 \u043d\u043e\u0432\u044b\u0439 \u0435\u0449\u0451 \u043d\u0435 \u043f\u0440\u0438\u0448\u0451\u043b. \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u043a\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0448\u044c \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u044f\u0442.<\/p>\n<p>  \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0438 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u044b, \u043d\u0430 Output Surface \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c \u0432\u0438\u0434\u0435\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/k_\/pl\/4e\/k_pl4eals9ka9rhbavk4c6mmauc.gif\"><\/p>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043d\u0430 \u043d\u0451\u043c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043d\u0430 \u043d\u0438\u0445 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u044f \u0441\u0442\u0430\u043b \u0432 \u0434\u0443\u0448\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u043e\u043f\u044f\u0442\u044c \u0438\u0437-\u0437\u0430 <b>onInputBufferAvailable<\/b>. \u0415\u043c\u0443 \u0441\u043d\u043e\u0432\u0430 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0431\u044b\u043b \u043d\u0435 \u043f\u043e \u0432\u043a\u0443\u0441\u0443 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u042f \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e \u044d\u0442\u043e \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u043b\u0441\u044f, \u043c\u043d\u0435 \u043b\u0438\u0447\u043d\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u0430 NewFrame. \u041a\u0430\u043a-\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043b\u0430\u0441\u044c \u0441 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a <b>ByteArrayOutputStream<\/b>. \u0418 \u043f\u0443\u0441\u043a\u0430\u0439 \u043a\u043e\u043b\u043b\u0431\u044d\u043a, \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0430\u0434\u043e, \u0441\u0430\u043c \u043e\u0442\u0442\u0443\u0434\u0430 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u044d\u0442\u043e \u0435\u0433\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>  \u0418\u0434\u0435\u044f \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0431\u043b\u0435\u0441\u0442\u044f\u0449\u0435 \u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u044f \u0443\u0432\u0438\u0434\u0435\u043b \u044d\u0442\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xu\/b2\/k5\/xub2k5uv-zk0fdici2t5etcc6fk.gif\" alt=\"image\"><\/p>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439. \u041d\u043e \u043e\u043f\u044f\u0442\u044c \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0418\u043b\u0438 \u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0435?<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043b\u043e\u0433\u0438 \u044f \u043f\u043e\u043d\u044f\u043b \u0447\u0442\u043e. \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435-\u0442\u043e \u0432 \u043f\u043e\u0442\u043e\u043a \u043a\u043b\u0430\u0434\u0443\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0437\u0430\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043d\u043e\u0432\u0430 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430. \u0422\u043e \u0435\u0441\u0442\u044c, \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u043e\u0442\u043e\u043a \u0441 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0430 \u043d\u0435 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430. <\/p>\n<p>  \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c:<\/p>\n<p>   <b>\u043f\u043e\u0442\u043e\u043a.reset();<\/b><\/p>\n<p>  \u0418 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043a\u0430\u043a \u043d\u0430\u0434\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ju\/nu\/il\/junuilw3xnq-bw0behorswp0lii.gif\"><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0441\u043b\u0430\u0434\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041b\u0438\u0441\u0442\u0438\u043d\u0433 main_activity<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tpackage com.example.encoderdecoder;   import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat;  import android.Manifest; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager;  import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureRequest;   import android.media.MediaCodec; import android.media.MediaCodecInfo; import android.media.MediaFormat; import android.os.Build; import android.os.Bundle;   import android.os.Handler; import android.os.HandlerThread; import android.os.StrictMode; import android.util.Log; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.Button; import android.widget.Toast;    import java.io.ByteArrayOutputStream; import java.io.IOException;  import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;  import java.net.SocketException; import java.nio.ByteBuffer;  import java.util.Arrays;     public class MainActivity extends AppCompatActivity {       public static final String LOG_TAG = &quot;myLogs&quot;;     public static Surface surface = null;      CameraService[] myCameras = null;      private CameraManager mCameraManager = null;     private final int CAMERA1 = 0;     private Button mButtonOpenCamera1 = null;      private Button mButtonTStopStreamVideo = null;     public static TextureView mImageViewUp = null;     public static TextureView mImageViewDown = null;     private HandlerThread mBackgroundThread;     private Handler mBackgroundHandler = null;      private MediaCodec encoder = null; \/\/ \u043a\u043e\u0434\u0435\u0440     private MediaCodec decoder = null;      byte [] b;     Surface mEncoderSurface; \/\/ Surface \u043a\u0430\u043a \u0432\u0445\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043a\u043e\u0434\u0435\u0440\u0430     Surface mDecoderSurface; \/\/ Surface \u043a\u0430\u043a \u043f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043a\u043e\u0434\u0435\u0440\u0430      ByteBuffer outPutByteBuffer;     ByteBuffer decoderInputBuffer;     ByteBuffer decoderOutputBuffer;      byte outDataForEncoder [];      DatagramSocket udpSocket;     DatagramSocket udpSocketIn;     String ip_address = &quot;your target address&quot;;\/\/ \u0441\u044e\u0434\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 IP \u0430\u0434\u0440\u0435\u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043a\u0443\u0434\u0430 \u0448\u043b\u0435\u0442\u0435 \/\/\u0432\u0438\u0434\u0435\u043e, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u0441\u0435\u0431\u0435     InetAddress address;     int port = 40002;      ByteArrayOutputStream  out;          private void startBackgroundThread() {         mBackgroundThread = new HandlerThread(&quot;CameraBackground&quot;);         mBackgroundThread.start();         mBackgroundHandler = new Handler(mBackgroundThread.getLooper());     }      private void stopBackgroundThread() {         mBackgroundThread.quitSafely();         try {             mBackgroundThread.join();             mBackgroundThread = null;             mBackgroundHandler = null;         } catch (InterruptedException e) {             e.printStackTrace();         }     }       @RequiresApi(api = Build.VERSION_CODES.M)     @Override     protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();         StrictMode.setThreadPolicy(policy);         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);          setContentView(R.layout.activity_main);           Log.d(LOG_TAG, &quot;\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435&quot;);           if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED                 ||                 (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)             ) {             requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);         }           mButtonOpenCamera1 = findViewById(R.id.button1);          mButtonTStopStreamVideo = findViewById(R.id.button3);         mImageViewUp = findViewById(R.id.textureView);         mImageViewDown = findViewById(R.id.textureView3);             mButtonOpenCamera1.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                   setUpMediaCodec();\/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u041c\u0435\u0434\u0438\u0430 \u041a\u043e\u0434\u0435\u043a                  if (myCameras[CAMERA1] != null) {\/\/ \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043c\u0435\u0440\u0443                     if (!myCameras[CAMERA1].isOpen()) myCameras[CAMERA1].openCamera();                 }               }         });             mButtonTStopStreamVideo.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                   if (encoder != null) {                      Toast.makeText(MainActivity.this, &quot; \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0441\u0442\u0440\u0438\u043c&quot;, Toast.LENGTH_SHORT).show();                     myCameras[CAMERA1].stopStreamingVideo();                 }               }         });           try {             udpSocket = new DatagramSocket();             udpSocketIn = new DatagramSocket(port);\/\/ we changed it to DatagramChannell becouse UDP packets may be different in size             try {              }              catch (Exception e){                 Log.i(LOG_TAG, &quot;  \u0441\u043e\u0437\u0434\u0430\u043b\u0438 udp \u043a\u0430\u043d\u0430\u043b&quot;);             }               new Udp_recipient();              Log.i(LOG_TAG, &quot;  \u0441\u043e\u0437\u0434\u0430\u043b\u0438 udp \u0441\u043e\u043a\u0435\u0442&quot;);          } catch (                 SocketException e) {             Log.i(LOG_TAG, &quot; \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 udp \u0441\u043e\u043a\u0435\u0442&quot;);         }          try {             address = InetAddress.getByName(ip_address);             Log.i(LOG_TAG, &quot;  \u0435\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441&quot;);         } catch (Exception e) {           }             mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);         try {             \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u043c\u0435\u0440 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430              myCameras = new CameraService[mCameraManager.getCameraIdList().length];              for (String cameraID : mCameraManager.getCameraIdList()) {                 Log.i(LOG_TAG, &quot;cameraID: &quot; + cameraID);                 int id = Integer.parseInt(cameraID);                 \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u043a\u0430\u043c\u0435\u0440\u044b                 myCameras[id] = new CameraService(mCameraManager, cameraID);              }         } catch (CameraAccessException e) {             Log.e(LOG_TAG, e.getMessage());             e.printStackTrace();         }      }       public class CameraService {           private String mCameraID;         private CameraDevice mCameraDevice = null;         private CameraCaptureSession mSession;         private CaptureRequest.Builder mPreviewBuilder;          public CameraService(CameraManager cameraManager, String cameraID) {              mCameraManager = cameraManager;             mCameraID = cameraID;          }             private CameraDevice.StateCallback mCameraCallback = new CameraDevice.StateCallback() {              @Override             public void onOpened(CameraDevice camera) {                 mCameraDevice = camera;                 Log.i(LOG_TAG, &quot;Open camera  with id:&quot; + mCameraDevice.getId());                  startCameraPreviewSession();             }              @Override             public void onDisconnected(CameraDevice camera) {                 mCameraDevice.close();                  Log.i(LOG_TAG, &quot;disconnect camera  with id:&quot; + mCameraDevice.getId());                 mCameraDevice = null;             }              @Override             public void onError(CameraDevice camera, int error) {                 Log.i(LOG_TAG, &quot;error! camera id:&quot; + camera.getId() + &quot; error:&quot; + error);             }         };          private void startCameraPreviewSession() {             SurfaceTexture texture = mImageViewUp.getSurfaceTexture();             texture.setDefaultBufferSize(480, 640);             surface = new Surface(texture);               try {                  mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);                  mPreviewBuilder.addTarget(surface);                  mPreviewBuilder.addTarget(mEncoderSurface);                     mCameraDevice.createCaptureSession(Arrays.asList(surface, mEncoderSurface),                          new CameraCaptureSession.StateCallback() {                              @Override                             public void onConfigured(CameraCaptureSession session) {                                 mSession = session;                                  try {                                     mSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler);                                 } catch (CameraAccessException e) {                                     e.printStackTrace();                                 }                             }                              @Override                             public void onConfigureFailed(CameraCaptureSession session) {                             }                         }, mBackgroundHandler);             } catch (CameraAccessException e) {                 e.printStackTrace();             }          }           public boolean isOpen() {             if (mCameraDevice == null) {                 return false;             } else {                 return true;             }         }           public void openCamera() {             try {                  if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {                      mCameraManager.openCamera(mCameraID, mCameraCallback, mBackgroundHandler);                  }              } catch (CameraAccessException e) {                 Log.i(LOG_TAG, e.getMessage());              }         }          public void closeCamera() {              if (mCameraDevice != null) {                 mCameraDevice.close();                 mCameraDevice = null;             }         }          public void stopStreamingVideo() {              if (mCameraDevice != null &amp; encoder != null) {                  try {                     mSession.stopRepeating();                     mSession.abortCaptures();                 } catch (CameraAccessException e) {                     e.printStackTrace();                 }                  encoder.stop();                 encoder.release();                 mEncoderSurface.release();                 decoder.stop();                 decoder.release();                   closeCamera();             }         }     }       private void setUpMediaCodec() {             try {             encoder = MediaCodec.createEncoderByType(&quot;video\/avc&quot;); \/\/ H264 \u043a\u043e\u0434\u0435\u043a          } catch (Exception e) {             Log.i(LOG_TAG, &quot;\u0430 \u043d\u0435\u0442\u0443 \u043a\u043e\u0434\u0435\u043a\u0430&quot;);         }         {             int width = 480; \/\/ \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0438\u0434\u0435\u043e             int height = 640; \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0438\u0434\u0435\u043e             int colorFormat = MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface; \/\/ \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0432\u043e\u0434\u0430 \u0446\u0432\u0435\u0442\u0430             int videoBitrate = 2000000; \/\/ \u0431\u0438\u0442\u0440\u0435\u0439\u0442 \u0432\u0438\u0434\u0435\u043e \u0432 bps (\u0431\u0438\u0442 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443)             int videoFramePerSecond = 30; \/\/ FPS             int iframeInterval = 1; \/\/ I-Frame \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445              MediaFormat format = MediaFormat.createVideoFormat(&quot;video\/avc&quot;, width, height);             format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);             format.setInteger(MediaFormat.KEY_BIT_RATE, videoBitrate);             format.setInteger(MediaFormat.KEY_FRAME_RATE, videoFramePerSecond);             format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iframeInterval);               encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); \/\/ \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434\u0435\u043a \u043a\u0430\u043a \u043a\u043e\u0434\u0435\u0440             mEncoderSurface = encoder.createInputSurface(); \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c Surface \u043a\u043e\u0434\u0435\u0440\u0430         }         encoder.setCallback(new EncoderCallback());         encoder.start(); \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u0434\u0435\u0440         Log.i(LOG_TAG, &quot;\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043a\u043e\u0434\u0435\u043a&quot;);             try {              decoder = MediaCodec.createDecoderByType(&quot;video\/avc&quot;);\/\/ H264 \u0434\u0435\u043a\u043e\u0434\u0435\u043a                } catch (Exception e) {             Log.i(LOG_TAG, &quot;\u0430 \u043d\u0435\u0442\u0443 \u0434\u0435\u043a\u043e\u0434\u0435\u043a\u0430&quot;);         }          int width = 480; \/\/ \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0438\u0434\u0435\u043e         int height = 640; \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0438\u0434\u0435\u043e           MediaFormat format = MediaFormat.createVideoFormat(&quot;video\/avc&quot;, width, height);          format.setInteger(MediaFormat.KEY_ROTATION,90);         SurfaceTexture texture = mImageViewDown.getSurfaceTexture();         texture.setDefaultBufferSize(480, 640);         mDecoderSurface = new Surface(texture);          decoder.configure(format, mDecoderSurface, null,0);         decoder.setOutputSurface(mDecoderSurface);              decoder.setCallback(new DecoderCallback());         decoder.start();         Log.i(LOG_TAG, &quot;\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440&quot;);         }      \/\/CALLBACK FOR DECODER     private class DecoderCallback extends MediaCodec.Callback {          @Override         public void onInputBufferAvailable(MediaCodec codec, int index) {                   decoderInputBuffer = codec.getInputBuffer(index);                   decoderInputBuffer.clear();                                      synchronized (out)                     {                             b =  out.toByteArray();                         out.reset();                           }                             decoderInputBuffer.put(b);                    codec.queueInputBuffer(index, 0, b.length,0, 0);          }          @Override         public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {             {                   {                       decoderOutputBuffer = codec.getOutputBuffer(index);                       codec.releaseOutputBuffer(index, true);                   }             }         }          @Override         public void onError(MediaCodec codec, MediaCodec.CodecException e) {             Log.i(LOG_TAG, &quot;Error: &quot; + e);         }          @Override         public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {             Log.i(LOG_TAG, &quot;decoder output format changed: &quot; + format);         }     }       private class EncoderCallback extends MediaCodec.Callback {          @Override         public void onInputBufferAvailable(MediaCodec codec, int index) {             Log.i(LOG_TAG, &quot; \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043e\u0442\u043e\u0432\u044b&quot; );             \/\/            }          @Override         public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {               outPutByteBuffer = encoder.getOutputBuffer(index);                byte[] outDate = new byte[info.size];             outPutByteBuffer.get(outDate);               try {                  DatagramPacket packet = new DatagramPacket(outDate, outDate.length, address, port);                 udpSocket.send(packet);             } catch (IOException e) {                 Log.i(LOG_TAG, &quot; \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f UDP \u043f\u0430\u043a\u0435\u0442&quot;);             }              encoder.releaseOutputBuffer(index, false);           }          @Override         public void onError(MediaCodec codec, MediaCodec.CodecException e) {             Log.i(LOG_TAG, &quot;Error: &quot; + e);         }          @Override         public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {           \/\/  Log.i(LOG_TAG, &quot;encoder output format changed: &quot; + format);         }     }      @Override     public void onPause() {         if (myCameras[CAMERA1].isOpen()) {             myCameras[CAMERA1].closeCamera();         }          stopBackgroundThread();         super.onPause();     }      @Override     public void onResume() {         super.onResume();         startBackgroundThread();     }        public class Udp_recipient extends Thread {          Udp_recipient()         {             out = new ByteArrayOutputStream(50000);             start();          }         public void run()         {             while (true)             {                 try {                     byte buffer[] = new byte[50000];                     DatagramPacket p = new DatagramPacket(buffer, buffer.length);                     udpSocketIn.receive(p);                     byte bBuffer[] = p.getData();                     outDataForEncoder = new byte[p.getLength()];                       synchronized (outDataForEncoder)                      {                          for (int i = 0; i &lt; outDataForEncoder.length; i++)                          {                              outDataForEncoder[i] = bBuffer[i];                          }                      }                      synchronized (out)                             {out.write(outDataForEncoder);}                  } catch (Exception e) {                     Log.i(LOG_TAG, e + &quot;  &quot;);                 }             }         }         }        }  <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>   \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430, \u043c\u044b \u0432\u044b\u043a\u0438\u043d\u0443\u043b\u0438 \u0438\u0437 \u043a\u043e\u0434\u0435\u0440\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u0433\u0434\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0443\u0431\u0438\u043b\u0441\u044f \u043d\u0430 \u043a\u0443\u0441\u043e\u0447\u043a\u0438 \u0434\u043b\u0438\u043d\u043e\u0439 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430 \u0438\u0437-\u0437\u0430 \u043e\u043f\u0430\u0441\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0432\u043b\u0435\u0437\u0442\u044c \u0432 MTU. \u041e\u043f\u0430\u0441\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u0438 \u0434\u0430\u0436\u0435 \u0432\u0440\u0435\u0434\u043d\u044b\u043c\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, (\u043a\u0430\u043a \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c ) \u0447\u0442\u043e \u043a\u043e\u0434\u0435\u0440 \u043b\u0435\u043f\u0438\u0442 \u044d\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0443\u0436\u0435 \u043a\u0430\u043a \u043d\u0435\u043a\u0438\u0435 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0435 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u043a\u043b\u0430\u0434\u0451\u0442 \u0438\u0445 \u0432 \u0441\u0432\u043e\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b. \u0410 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043e\u0434\u0438\u043d \u0431\u0443\u0444\u0435\u0440, \u0430 \u0445\u0432\u043e\u0441\u0442\u0438\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u0439? \u0422\u0435\u043f\u0435\u0440\u044c-\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043d\u0435\u0447\u0435\u0433\u043e, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432\u0438\u0434\u0435\u043e \u0443 \u043c\u0435\u043d\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e \u0434\u0430\u0436\u0435 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u044f \u0443\u0447\u0440\u0435\u0434\u0438\u043b <b>ByteArrayOutputStream<\/b>. \u041d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u044f \u043d\u0435 \u0432\u044b\u043a\u0438\u043d\u0443\u043b \u044d\u0442\u043e\u0442 \u0437\u043b\u043e\u0441\u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430. <\/p>\n<p>  \u0410 \u0432\u043e\u0442, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0433\u043d\u0430\u043b\u0438 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0435\u0433\u043e VLC \u043f\u043b\u0435\u0435\u0440\u043e\u043c, \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u0431\u044b\u043b\u043e. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043b\u0435\u0435\u0440 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u044d\u0448 (\u043e\u043d \u0436\u0435 \u043f\u043b\u0435\u0435\u0440, \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043a\u0438\u043d\u043e, \u0430 \u043d\u0435 \u00ab\u0436\u0438\u0432\u043e\u0433\u043e\u00bb \u0432\u0438\u0434\u0435\u043e). \u0410 \u0432 \u043a\u044d\u0448\u0435, \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u043e\u0440\u0443\u0431\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u044b \u0432\u043d\u043e\u0432\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0441\u0440\u0430\u0441\u0442\u0430\u043b\u0438\u0441\u044c. <\/p>\n<p>  \u041f\u0440\u0438\u0447\u0435\u043c \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u044d\u0448\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u043f\u043e\u0447\u0442\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043b\u0430\u0433\u0438, \u0447\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u0440\u0435\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0438\u0434\u0435\u043e\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pc\/71\/o6\/pc71o6uthotg2ns6fd3nv30krjs.gif\"><\/p>\n<p>  \u041d\u043e \u0437\u0430\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0433\u0430\u043d\u044c\u0435 \u043f\u0440\u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0441\u043c\u0435\u043d\u0430\u0445 \u0441\u0446\u0435\u043d\u044b. \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0430\u0435\u0448\u044c \u0438\u043b\u0438 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0438\u043d\u043e, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u043d\u0430 \u043f\u043e\u043b\u043c\u0438\u043d\u0443\u0442\u044b \u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0438\u043b\u0438 \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0441 \u043a\u043e\u0441\u044f\u043a\u0430\u043c\u0438 \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445, \u043d\u043e \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0440\u0442\u043e\u043b\u0435\u0442\u0438\u043a\u043e\u043c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. <\/p>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u0441\u0447\u0430\u0441\u0442\u044c\u044f \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0438 \u0431\u0438\u0442\u0440\u0435\u0439\u0442\u043e\u043c. \u042f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0445\u043e\u0442\u0435\u043b \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0435 1280 \u0445 960, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u043e\u0434\u0435\u043a\u0435 H.264 \u043d\u0443\u0436\u0435\u043d \u0431\u0438\u0442\u0440\u0435\u0439\u0442 5000-6000 \u041a\u0431\u0438\u0442 \/ \u0441. \u0410 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043c\u043e\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 640 \u0445 480 (\u0442\u0435\u043c, \u0447\u0442\u043e \u0438 \u0442\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e) \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u0442\u0440\u0435\u0439\u0442\u043e\u043c 2000 \u041a\u0431\u0438\u0442 \/ \u0441. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043a <s>\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0432\u0435\u0442\u0430<\/s> \u043a 3 000 000 \u0431\u0438\u0442\/c, \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0438\u043c\u0435\u0442\u044c <s>\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u043c\u0430\u0441\u0441\u0443<\/s>, \u0432\u0430\u043b\u044f\u0442\u044c \u0434\u0443\u0440\u0430\u043a\u0430 \u0438 \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u043f\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d (\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435) \u0438 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 (\u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441).<\/p>\n<p>  \u0421\u0430\u043c\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041c\u0430\u043a\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041d\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0430\u0434\u043e:<\/p>\n<ol>\n<li>\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e Surface \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b<\/li>\n<li> \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u043d\u0435\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440. \u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e.<\/li>\n<\/ol>\n<p>   \u042f \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439, \u043d\u043e \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0448\u0438\u0431\u0441\u044f. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0438 \u043e\u043d\u043e \u0441\u0430\u043c\u043e \u0432\u0441\u0451 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0435 \u043e\u043a\u043d\u043e. <br \/>  \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0434\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043e\u043a\u043d\u0430 \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0432 \u043d\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 Int, \u0442\u043e \u0432\u044b \u0436\u0435 \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0435 \u044d\u0442\u043e Int \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435:<\/p>\n<pre><code class=\"java\">\tTextView1.setText(Int + \u201c \u201d); \tTextView2.setText(Int + \u201c \u201d);\t \t<\/code><\/pre>\n<p>   \u041d\u043e \u0432\u0438\u0434\u0438\u043c\u043e, \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Surface \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442 \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c, \u0442\u043e \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043a\u043d\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c. \u0410 \u043f\u0435\u0440\u0432\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442.<\/p>\n<p>  \u0427\u0435\u0433\u043e \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b, \u0434\u0430\u0436\u0435 textureView \u2014 \u043e\u043a\u043d\u0430 \u0432 \u043c\u0430\u043a\u0435\u0442\u0435 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043e\u0431\u043e\u0437\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u043b\u043e. \u041d\u0430 stockoverflow \u0431\u044b\u043b\u043e \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0451\u0442 \u043c\u0430\u043b\u043e \u0447\u0435\u0433\u043e (\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u043e\u043c\u0443 \u043d\u0430\u0444\u0438\u0433 \u043d\u0430\u0434\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a \u0432 \u0434\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0435), \u0430 \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0438, \u0447\u0442\u043e \u044f \u043d\u0430\u0448\u0451\u043b, \u0432\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0442\u0443\u043c\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Mediac Codec \u043c\u043e\u0436\u0435\u0442 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0434\u043d\u043e\u0439 Surface.<\/p>\n<p>  \u0412\u044b\u0445\u043e\u0434 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u043c. \u041d\u0430\u0434\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0435 \u043e\u043a\u043d\u043e? \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430, \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438 \u043c\u0435\u043d\u044c\u0448\u0435. \u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e UDP \u043a\u0430\u043d\u0430\u043b\u0443 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0442\u044c.<\/p>\n<p>  \u041d\u043e, \u0442\u0435\u043c \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u0440\u0438 \u0432\u0441\u0435\u0439 \u0441\u0432\u043e\u0435\u0439 \u0434\u0443\u0431\u043e\u0432\u043e\u0441\u0442\u0438 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430 main_activity<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.example.twovideosurfaces;     import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat;  import android.Manifest; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager;  import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureRequest;   import android.media.MediaCodec; import android.media.MediaCodecInfo; import android.media.MediaFormat; import android.os.Build; import android.os.Bundle;   import android.os.Handler; import android.os.HandlerThread; import android.os.StrictMode; import android.util.Log; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.Button; import android.widget.Toast;   import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.nio.ByteBuffer; import java.util.Arrays;   public class MainActivity extends AppCompatActivity  {       public static final String LOG_TAG = &quot;myLogs&quot;;       CameraService[] myCameras = null;      private CameraManager mCameraManager = null;     private final int CAMERA1 = 0;       private Button mOn = null;     private Button mOff = null;     public static TextureView mImageViewUp = null;     public static TextureView mImageViewDown = null;     private HandlerThread mBackgroundThread;     private Handler mBackgroundHandler = null;       private MediaCodec encoder = null; \/\/ \u043a\u043e\u0434\u0435\u0440     private MediaCodec decoder = null;     private MediaCodec decoder2 = null;     byte [] b;     byte [] b2;     Surface mEncoderSurface; \/\/ Surface \u043a\u0430\u043a \u0432\u0445\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043a\u043e\u0434\u0435\u0440\u0430     Surface mDecoderSurface; \/\/ Surface \u043a\u0430\u043a \u043f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043a\u043e\u0434\u0435\u0440\u0430     Surface mDecoderSurface2; \/\/ Surface \u043a\u0430\u043a \u043f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043a\u043e\u0434\u0435\u0440\u0430     ByteBuffer outPutByteBuffer;      ByteBuffer decoderInputBuffer;     ByteBuffer decoderOutputBuffer;     ByteBuffer decoderInputBuffer2;     ByteBuffer decoderOutputBuffer2;       byte outDataForEncoder [];     static  boolean  mNewFrame=false;      DatagramSocket udpSocket;      DatagramSocket udpSocketIn;     String ip_address = &quot;192.168.50.131&quot;;     InetAddress address;     int port = 40002;      ByteArrayOutputStream out =new ByteArrayOutputStream(50000);     ByteArrayOutputStream out2 = new ByteArrayOutputStream(50000);       private void startBackgroundThread() {         mBackgroundThread = new HandlerThread(&quot;CameraBackground&quot;);         mBackgroundThread.start();         mBackgroundHandler = new Handler(mBackgroundThread.getLooper());     }      private void stopBackgroundThread() {         mBackgroundThread.quitSafely();         try {             mBackgroundThread.join();             mBackgroundThread = null;             mBackgroundHandler = null;         } catch (InterruptedException e) {             e.printStackTrace();         }     }       @RequiresApi(api = Build.VERSION_CODES.M)     @Override     protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();         StrictMode.setThreadPolicy(policy);         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);          setContentView(R.layout.activity_main);           Log.d(LOG_TAG, &quot;\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435&quot;);           if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED                 ||                 (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)             ) {             requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);         }           mOn = findViewById(R.id.button1);          mOff = findViewById(R.id.button3);          mImageViewUp = findViewById(R.id.textureView);         mImageViewDown = findViewById(R.id.textureView3);          mOn.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                   setUpMediaCodec();\/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u041c\u0435\u0434\u0438\u0430 \u041a\u043e\u0434\u0435\u043a                  if (myCameras[CAMERA1] != null) {\/\/ \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043c\u0435\u0440\u0443                     if (!myCameras[CAMERA1].isOpen()) myCameras[CAMERA1].openCamera();                 }               }         });             mOff.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                  if (encoder != null) {                      Toast.makeText(MainActivity.this, &quot; \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0441\u0442\u0440\u0438\u043c&quot;, Toast.LENGTH_SHORT).show();                     myCameras[CAMERA1].stopStreamingVideo();                 }                }         });            try {             udpSocket = new DatagramSocket();             udpSocketIn = new DatagramSocket(port);\/\/ we changed it to DatagramChannell becouse UDP packets may be different in size             try {              }              catch (Exception e){                 Log.i(LOG_TAG, &quot;  \u0441\u043e\u0437\u0434\u0430\u043b\u0438 udp \u043a\u0430\u043d\u0430\u043b&quot;);             }               new Udp_recipient();              Log.i(LOG_TAG, &quot;  \u0441\u043e\u0437\u0434\u0430\u043b\u0438 udp \u0441\u043e\u043a\u0435\u0442&quot;);          } catch (                 SocketException e) {             Log.i(LOG_TAG, &quot; \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 udp \u0441\u043e\u043a\u0435\u0442&quot;);         }          try {             address = InetAddress.getByName(ip_address);             Log.i(LOG_TAG, &quot;  \u0435\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441&quot;);         } catch (Exception e) {           }               mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);         try {             \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u043c\u0435\u0440 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430              myCameras = new CameraService[mCameraManager.getCameraIdList().length];              for (String cameraID : mCameraManager.getCameraIdList()) {                 Log.i(LOG_TAG, &quot;cameraID: &quot; + cameraID);                 int id = Integer.parseInt(cameraID);                 \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u043a\u0430\u043c\u0435\u0440\u044b                 myCameras[id] = new CameraService(mCameraManager, cameraID);              }         } catch (CameraAccessException e) {             Log.e(LOG_TAG, e.getMessage());             e.printStackTrace();         }      }       public class CameraService {           private String mCameraID;         private CameraDevice mCameraDevice = null;         private CameraCaptureSession mSession;         private CaptureRequest.Builder mPreviewBuilder;          public CameraService(CameraManager cameraManager, String cameraID) {              mCameraManager = cameraManager;             mCameraID = cameraID;          }             private CameraDevice.StateCallback mCameraCallback = new CameraDevice.StateCallback() {              @Override             public void onOpened(CameraDevice camera) {                 mCameraDevice = camera;                 Log.i(LOG_TAG, &quot;Open camera  with id:&quot; + mCameraDevice.getId());                  startCameraPreviewSession();             }              @Override             public void onDisconnected(CameraDevice camera) {                 mCameraDevice.close();                  Log.i(LOG_TAG, &quot;disconnect camera  with id:&quot; + mCameraDevice.getId());                 mCameraDevice = null;             }              @Override             public void onError(CameraDevice camera, int error) {                 Log.i(LOG_TAG, &quot;error! camera id:&quot; + camera.getId() + &quot; error:&quot; + error);             }         };          private void startCameraPreviewSession() {                  try {                  mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);                 mPreviewBuilder.addTarget(mEncoderSurface);                   mCameraDevice.createCaptureSession(Arrays.asList(mEncoderSurface),                          new CameraCaptureSession.StateCallback() {                              @Override                             public void onConfigured(CameraCaptureSession session) {                                 mSession = session;                                  try {                                     mSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler);                                 } catch (CameraAccessException e) {                                     e.printStackTrace();                                 }                             }                              @Override                             public void onConfigureFailed(CameraCaptureSession session) {                             }                         }, mBackgroundHandler);             } catch (CameraAccessException e) {                 e.printStackTrace();             }          }           public boolean isOpen() {             if (mCameraDevice == null) {                 return false;             } else {                 return true;             }         }           public void openCamera() {             try {                  if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {                      mCameraManager.openCamera(mCameraID, mCameraCallback, mBackgroundHandler);                  }              } catch (CameraAccessException e) {                 Log.i(LOG_TAG, e.getMessage());              }         }          public void closeCamera() {              if (mCameraDevice != null) {                 mCameraDevice.close();                 mCameraDevice = null;             }         }           public void stopStreamingVideo() {              if (mCameraDevice != null &amp; encoder != null) {                  try {                     mSession.stopRepeating();                     mSession.abortCaptures();                 } catch (CameraAccessException e) {                     e.printStackTrace();                 }                  encoder.stop();                 encoder.release();                 mEncoderSurface.release();                 decoder.stop();                 decoder.release();                 decoder2.stop();                 decoder2.release();                  closeCamera();             }         }        }      private void setUpMediaCodec() {             try {             encoder = MediaCodec.createEncoderByType(&quot;video\/avc&quot;); \/\/ H264 \u043a\u043e\u0434\u0435\u043a          } catch (Exception e) {             Log.i(LOG_TAG, &quot;\u0430 \u043d\u0435\u0442\u0443 \u043a\u043e\u0434\u0435\u043a\u0430&quot;);         }         {             int width = 640; \/\/ \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0438\u0434\u0435\u043e             int height = 480; \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0438\u0434\u0435\u043e             int colorFormat = MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface; \/\/ \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0432\u043e\u0434\u0430 \u0446\u0432\u0435\u0442\u0430             int videoBitrate = 2000000; \/\/ \u0431\u0438\u0442\u0440\u0435\u0439\u0442 \u0432\u0438\u0434\u0435\u043e \u0432 bps (\u0431\u0438\u0442 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443)             int videoFramePerSecond = 30; \/\/ FPS             int iframeInterval = 1; \/\/ I-Frame \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445              MediaFormat format = MediaFormat.createVideoFormat(&quot;video\/avc&quot;, width, height);             format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);             format.setInteger(MediaFormat.KEY_BIT_RATE, videoBitrate);             format.setInteger(MediaFormat.KEY_FRAME_RATE, videoFramePerSecond);             format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iframeInterval);               encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); \/\/ \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434\u0435\u043a \u043a\u0430\u043a \u043a\u043e\u0434\u0435\u0440            mEncoderSurface = encoder.createInputSurface(); \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c Surface \u043a\u043e\u0434\u0435\u0440\u0430         }         encoder.setCallback(new EncoderCallback());         encoder.start(); \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u0434\u0435\u0440         Log.i(LOG_TAG, &quot;\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043a\u043e\u0434\u0435\u043a&quot;);            try {              decoder = MediaCodec.createDecoderByType(&quot;video\/avc&quot;);\/\/ H264 \u0434\u0435\u043a\u043e\u0434\u0435\u043a          } catch (Exception e) {             Log.i(LOG_TAG, &quot;\u0430 \u043d\u0435\u0442\u0443 \u0434\u0435\u043a\u043e\u0434\u0435\u043a\u0430&quot;);         }          int width = 480; \/\/ \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0438\u0434\u0435\u043e         int height = 640; \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0438\u0434\u0435\u043e           MediaFormat format = MediaFormat.createVideoFormat(&quot;video\/avc&quot;, width, height);          format.setInteger(MediaFormat.KEY_ROTATION,90);            SurfaceTexture texture= mImageViewUp.getSurfaceTexture();         mDecoderSurface = new Surface(texture);          decoder.configure(format, mDecoderSurface, null,0);          decoder.setOutputSurface(mDecoderSurface);          decoder.setCallback(new DecoderCallback());         decoder.start();         Log.i(LOG_TAG, &quot;\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440&quot;);           try {              decoder2 = MediaCodec.createDecoderByType(&quot;video\/avc&quot;);\/\/ H264 \u0434\u0435\u043a\u043e\u0434\u0435\u043a          } catch (Exception e) {             Log.i(LOG_TAG, &quot;\u0430 \u043d\u0435\u0442\u0443 \u0434\u0435\u043a\u043e\u0434\u0435\u043a\u0430&quot;);         }          int width2 = 480; \/\/ \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0438\u0434\u0435\u043e         int height2 = 640; \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0438\u0434\u0435\u043e           MediaFormat format2 = MediaFormat.createVideoFormat(&quot;video\/avc&quot;, width2, height2);          format2.setInteger(MediaFormat.KEY_ROTATION,90);            SurfaceTexture texture2= mImageViewDown.getSurfaceTexture();         mDecoderSurface2 = new Surface(texture2);          decoder2.configure(format2, mDecoderSurface2, null,0);            decoder2.setOutputSurface(mDecoderSurface2);          decoder2.setCallback(new DecoderCallback2());         decoder2.start();         Log.i(LOG_TAG, &quot;\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440&quot;);          }       private class DecoderCallback2 extends MediaCodec.Callback {          @Override         public void onInputBufferAvailable(MediaCodec codec, int index) {                  decoderInputBuffer2 = codec.getInputBuffer(index);             decoderInputBuffer2.clear();                 synchronized (out2)             {                 b2 =  out2.toByteArray();                 out2.reset();              }              decoderInputBuffer2.put(b2);                codec.queueInputBuffer(index, 0, b2.length,0, 0);             if (b2.length!=0)             {                 \/\/   Log.i(LOG_TAG, b.length + &quot; \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0432\u0445\u043e\u0434  &quot;+index );             }          }          @Override         public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {               {                  {                     decoderOutputBuffer2 = codec.getOutputBuffer(index);                        codec.releaseOutputBuffer(index, true);                   }                    }         }          @Override         public void onError(MediaCodec codec, MediaCodec.CodecException e) {             Log.i(LOG_TAG, &quot;Error: &quot; + e);         }          @Override         public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {             Log.i(LOG_TAG, &quot;decoder output format changed: &quot; + format);         }     }     \/\/CALLBACK FOR DECODER     private class DecoderCallback extends MediaCodec.Callback {          @Override         public void onInputBufferAvailable(MediaCodec codec, int index) {              decoderInputBuffer = codec.getInputBuffer(index);             decoderInputBuffer.clear();               synchronized (out)             {                 b =  out.toByteArray();                 out.reset();             }               decoderInputBuffer.put(b);                codec.queueInputBuffer(index, 0, b.length,0, 0);                  if (b.length!=0)             {                \/\/  Log.i(LOG_TAG, b.length + &quot; \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0432\u0445\u043e\u0434  &quot;+index );             }           }          @Override         public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {              {                  {                     decoderOutputBuffer = codec.getOutputBuffer(index);                      codec.releaseOutputBuffer(index, true);                  }              }         }          @Override         public void onError(MediaCodec codec, MediaCodec.CodecException e) {             Log.i(LOG_TAG, &quot;Error: &quot; + e);         }          @Override         public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {             Log.i(LOG_TAG, &quot;decoder output format changed: &quot; + format);         }     }       private class EncoderCallback extends MediaCodec.Callback {          @Override         public void onInputBufferAvailable(MediaCodec codec, int index) {             Log.i(LOG_TAG, &quot; \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043e\u0442\u043e\u0432\u044b&quot; );         }          @Override         public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {               outPutByteBuffer = encoder.getOutputBuffer(index);              byte[] outDate = new byte[info.size];             outPutByteBuffer.get(outDate);              try {                 \/\/  Log.i(LOG_TAG, &quot; outDate.length : &quot; + outDate.length);                 DatagramPacket packet = new DatagramPacket(outDate, outDate.length, address, port);                 udpSocket.send(packet);             } catch (IOException e) {                 Log.i(LOG_TAG, &quot; \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f UDP \u043f\u0430\u043a\u0435\u0442&quot;);             }               encoder.releaseOutputBuffer(index, false);          }          @Override         public void onError(MediaCodec codec, MediaCodec.CodecException e) {             Log.i(LOG_TAG, &quot;Error: &quot; + e);         }          @Override         public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {             \/\/  Log.i(LOG_TAG, &quot;encoder output format changed: &quot; + format);         }     }     @Override     public void onPause() {         if (myCameras[CAMERA1].isOpen()) {             myCameras[CAMERA1].closeCamera();         }          stopBackgroundThread();         super.onPause();     }      @Override     public void onResume() {         super.onResume();         startBackgroundThread();     }         public class Udp_recipient extends Thread {          Udp_recipient() {              start();             \/\/    Log.i(LOG_TAG, &quot;\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e udp&quot;);         }           public void run() {              while (true) {                 try {                      byte buffer[] = new byte[50000];                      DatagramPacket p = new DatagramPacket(buffer, buffer.length);                     udpSocketIn.receive(p);                     byte bBuffer[] = p.getData();                       outDataForEncoder = new byte[p.getLength()];                      synchronized (outDataForEncoder) {                           for (int i = 0; i &lt; outDataForEncoder.length; i++) {                             outDataForEncoder[i] = bBuffer[i];                         }                     }                      mNewFrame = true;                      synchronized (out)                     {out.write(outDataForEncoder);}                      synchronized (out2)                     {out2.write(outDataForEncoder);}                  } catch (Exception e) {                     Log.i(LOG_TAG, e + &quot;hggh &quot;);                 }             }         }     } }          <\/code><\/pre>\n<\/p><\/div>\n<\/p><\/div>\n<p>   \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0442\u0430\u0440\u0433\u0435\u0442 \u0430\u0434\u0440\u0435\u0441\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043c\u0430\u0440\u0442\u043e\u0444\u043e\u043d\u0430:<\/p>\n<pre><code class=\"java\">\tString ip_address = &quot; \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c 192.168.50.131&quot;; <\/code><\/pre>\n<p>   \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0435\u0433\u043e \u0432\u0438\u0437\u0430\u0432\u0438 \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u0434\u0435\u0432\u0430\u0435\u043c VR-\u043e\u0447\u043a\u0438 \u0438 \u0432\u043f\u0435\u0440\u0451\u0434, \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043d\u0430\u0443\u043a\u0443 \u043d\u0435\u0439\u0440\u043e\u0431\u0438\u043e\u043b\u043e\u0433\u0438\u044e!<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/507152\/\"> https:\/\/habr.com\/ru\/post\/507152\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/507152\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kc\/r8\/1j\/kcr81jq0kizdeipzvrz2kzp5_w4.png\"><\/div>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u0436\u0438\u0432\u043e\u0433\u043e\u00bb \u0432\u0438\u0434\u0435\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 H.264 \u043d\u0430 Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043d\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u043e\u0434 \u0432\u0438\u043d\u0434\u043e\u0439. \u0422\u0430\u043c \u043d\u0430\u0448 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u044b\u0432\u0430\u043b\u0441\u044f \u0438 \u043b\u0438\u0446\u0435\u0437\u0440\u0435\u043b\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e VLC \u043f\u043b\u0435\u0435\u0440\u0430. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 VLCJ CAPRICA \u0431\u043b\u0430\u0433\u043e\u043f\u043e\u043b\u0443\u0447\u043d\u043e \u0432\u043f\u0438\u0445\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u0432 \u043e\u043a\u043e\u0448\u043a\u0438 JAVA \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u0440\u0430\u0432\u0434\u0430, \u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d (VLC \u043f\u043b\u0435\u0435\u0440) \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u043b, \u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439. \u041d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u2014 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0434\u0430 \u0438 \u043b\u0430\u0434\u043d\u043e. <\/p>\n<p>  <s>\u041f\u043e\u0434\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0439<\/s> \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u043d\u043e\u0443\u0442\u0431\u0443\u043a, \u043b\u044d\u043f\u0442\u043e\u043f \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0440\u043e\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432\u0438\u0434\u0435\u043e \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0434\u0435\u0432\u0430\u0439\u0441\u0430\u043c\u0438 \u043d\u0435 \u0438\u0437-\u0437\u0430 \u0441\u0442\u043e\u043b\u0430, \u0430 \u0447\u0430\u0449\u0435 \u0432\u0430\u043b\u044f\u044f\u0441\u044c \u043d\u0430 \u0434\u0438\u0432\u0430\u043d\u0435, \u0441\u043e \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u043c \u0432 \u0440\u0443\u043a\u0430\u0445. \u0418 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0434\u0430\u0436\u0435 \u043d\u0430\u0448\u0435\u0439 \u0440\u043e\u0431\u043e\u0442\u0435\u043b\u0435\u0436\u043a\u043e\u0439 \u043d\u044b\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0442\u0443\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u043d\u0430\u0448 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0447\u0435\u0440\u0435\u0437 Camera2 API, \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e Surface, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e!<\/p>\n<p>  \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u2014 \u0432\u043f\u0435\u0440\u0451\u0434.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-305660","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=305660"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305660\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}