{"id":1023,"date":"2019-02-04T13:06:39","date_gmt":"2019-02-04T04:06:39","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=1023"},"modified":"2019-02-04T21:09:43","modified_gmt":"2019-02-04T12:09:43","slug":"opengl-10-glsurfaceview%ec%99%80-mediaplayer%eb%a1%9c-%eb%8f%99%ec%98%81%ec%83%81-%ed%94%8c%eb%a0%88%ec%9d%b4%ec%96%b4-%eb%a7%8c%eb%93%a4%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=1023","title":{"rendered":"[OpenGL] 11. GLSurfaceView\uc640 MediaPlayer\ub85c \ub3d9\uc601\uc0c1 \ud50c\ub808\uc774\uc5b4 \ub9cc\ub4e4\uae30"},"content":{"rendered":"<h1>Video Player based on GLSurfaceView<\/h1>\n<p><a href=\"https:\/\/www.charlezz.com\/?p=1007\">\ud14d\uc2a4\ucc98 \uc788\ub294 \uc0ac\uac01\ud615 \ub9cc\ub4e4\uae30<\/a>\uae4c\uc9c0 \uc131\uacf5\ud588\ub2e4\uba74, Android OpenGL ES\uc5d0\uc11c \ub3d9\uc601\uc0c1 \ud50c\ub808\uc774\uc5b4\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc790\uccb4\ub294 \uac04\ub2e8\ud569\ub2c8\ub2e4.\u00a0<a href=\"https:\/\/www.charlezz.com\/?p=1024\">SurfaceTexture<\/a>\uc5d0 \ub300\ud55c \uae30\ubcf8\uc801\uc778 \ub0b4\uc6a9\uc744 \uc54c\uace0 \uacc4\uc2dc\ub2e4\uba74 \ub354\uc6b1 \uc774\ud574\ud558\uae30 \uc27d\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc250\uc774\ub354 \ucf54\ub4dc\ubd80\ud130 \ucc28\uadfc\ucc28\uadfc \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <br \/>\n\ubc84\ud14d\uc2a4 \uc250\uc774\ub354\ucf54\ub4dc\ub294 \ud14d\uc2a4\ucc98 \uc788\ub294 \uc0ac\uac01\ud615 \ub9cc\ub4e4\uae30\uc5d0 \uc788\ub358 \uac83\uacfc \uac19\uc544 \uc0dd\ub7b5\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">\"#extension GL_OES_EGL_image_external : require\\n\" +\r\n\"precision mediump float;\" +\r\n\"varying vec2 v_texCoord;\"+\r\n\"uniform samplerExternalOES s_texture;\"+\r\n\"void main() {\" +\r\n\"  gl_FragColor = texture2D(s_texture, v_texCoord);\" +\r\n\"}\";<\/pre>\n<p>\uc704\uc758 \ucf54\ub4dc\ub294 \ud504\ub808\uadf8\uba3c\ud2b8 \uc250\uc774\ub354 \ucf54\ub4dc \uc785\ub2c8\ub2e4. \ub2ec\ub77c\uc9c4\uc810\uc744 \ubcf4\uba74 GL_OES_EGL_image_external \uc775\uc2a4\ud150\uc158\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4.\u00a0\u00a0<a href=\"https:\/\/www.khronos.org\/registry\/OpenGL\/extensions\/OES\/OES_EGL_image_external.txt\"><\/a>SurfaceTexture\ub97c \uc0ac\uc6a9\ud558\uc5ec Surface\uc5d0 \ub80c\ub354\ub9c1 \ub41c\uac83\uc740 OpenGL ES\uc758 External Texture\ub85c \ubcc0\ud658\uc774 \ub418\ub294\ub370, GL_OES_EGL_image_external \uc775\uc2a4\ud150\uc158\uc740 OpenGL ES\uc5d0\uc11c \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 \ub0b4\ubd80 \ud615\uc2dd\uc744 \uac00\uc9c4 EGLImage\ub97c \ubc14\uc778\ub529 \ud560 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4.\u00a0<\/p>\n<p>\uc880 \ub354 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740\u00a0<a href=\"https:\/\/www.khronos.org\/registry\/OpenGL\/extensions\/OES\/OES_EGL_image_external.txt\">\uc774 \uc775\uc2a4\ud150\uc158\uc5d0 \ub300\ud55c \ud06c\ub85c\ub178\uc2a4\uc758 \ubb38\uc11c<\/a>\uc640 <a href=\"https:\/\/stackoverflow.com\/questions\/33222621\/android-sharing-surfacetexture-between-two-processes\">\uc2a4\ud0dd\uc624\ubc84\ud50c\ub85c\uc758 \uad00\ub828 \uc9c8\uc758\uc751\ub2f5<\/a>\uc744 \ubcf4\uc2dc\uba74 \uc88b\uc744 \uac83 \uac19\uc2b5\ub2c8\ub2e4<\/p>\n<p>\ub3d9\uc601\uc0c1\uc744 \uc7ac\uc0dd\uc2dc\ud0a4\uae30 \uc704\ud55c \uc900\ube44\ub97c \ud558\uae30\uc704\ud574 MediaPlayer\ub97c \uc774\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">MediaPlayer mediaPlayer = new MediaPlayer();\r\nmediaPlayer.setDataSource(\"\ub3d9\uc601\uc0c1 \uacbd\ub85c\");\r\nmediaPlayer.prepare();\r\nmediaPlayer.start();<\/pre>\n<p>\ub3d9\uc601\uc0c1\uc758 \uacbd\ub85c\ub294 \uc6f9\uc5d0 \uc788\ub294 sample-videos.com\uc758 \uac83\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"\"><span>https:\/\/sample-videos.com\/video123\/mp4\/720\/big_buck_bunny_720p_1mb.mp4<\/span><\/pre>\n<p>\ub3d9\uc601\uc0c1\uc740 \uc7ac\uc0dd\ub418\uc5c8\uc9c0\ub9cc \ud654\uba74\uc5d0 \uadf8\ub9b4\ub824\uba74 Surface\uac00 \ud558\ub098 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">int[] textures = new int[1];\r\nGLES20.glGenTextures(1, textures, 0);\r\nGLES20.glActiveTexture(GLES20.GL_TEXTURE0);\r\nGLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);\r\nGLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);\r\nGLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);\r\n\r\nSurfaceTexture surfaceTexture = new SurfaceTexture(textureId);\r\nSurface surface = new Surface(surfaceTexture);\r\nmediaPlayer.setSurface(surface);\r\nsurface.release();<\/pre>\n<p>texture\ub97c \ud558\ub098 \uc0dd\uc131\ud558\uc5ec SurfaceTexture\ub97c \ub9cc\ub4e4\uace0, SurfaceTexture\ub97c \ud1b5\ud574 \ub610 \ub2e4\uc2dc Surface\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. \ud574\ub2f9 Surface\ub97c MediaPlayer\uc5d0\uac8c \ub118\uaca8\uc8fc\uba74 MediaPlayer\uc5d0\uc11c \ub3d9\uc601\uc0c1\uc744 Surface\uc5d0 \uadf8\ub9ac\uae30 \uc2dc\uc791\ud569\ub2c8\ub2e4.<\/p>\n<table style=\"border-style: solid; height: 57px;\">\n<tbody>\n<tr style=\"height: 57px;\">\n<td style=\"height: 57px; width: 622.188px;\">Notice : OpenGL\uacfc \uad00\ub828\ub41c \uc608\ub97c\ub4e4\uba74, \ud14d\uc2a4\uccd0\ub97c \uc0dd\uc131\ud558\uace0 \ubc14\uc778\ub529 \ud558\ub294 \uc791\uc5c5\uc740 GL Thread\ub0b4\uc5d0\uc11c \uc774\ub8e8\uc5b4\uc838\uc57c \ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc774\uc81c onDrawFrame()\uc774 \ubd88\ub9b4\ub54c SurfaceTexture \ubc84\ud37c\ub97c \ub9b4\ub9ac\uc988 \ud574\uc918\uc57c\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">surfaceTexture.updateTexImage();<\/pre>\n<p>\ud574\ub2f9 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uba74 \uc774\ubbf8\uc9c0 \uc2a4\ud2b8\ub9bc\uc5d0\uc11c \ud14d\uc2a4\ucc98 \uc774\ubbf8\uc9c0\ub97c \uac00\uc7a5 \ucd5c\uadfc\uc758 \ud504\ub808\uc784\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ud558\uac8c\ub418\uace0, \ud14d\uc2a4\ucc98\ub97c GL_TEXTURE_EXTERNAL_OES \ud14d\uc2a4\ucc98 \ud0c0\uac9f\uc5d0 \uc554\ubb35\uc801\uc73c\ub85c \ubc14\uc778\ub529\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p>\ub3d9\uc601\uc0c1\uc758 \ud504\ub808\uc784 \ubc84\ud37c\uac00 \ub2e4 \ucc44\uc6cc\uc9c0\uae30 \uc804\uc5d0 GL \uc4f0\ub808\ub4dc\uc758 onDrawFrame\uc774 \ud638\ucd9c \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. GL\uc4f0\ub808\ub4dc\uc640 \ubc84\ud37c\ud050\uc758 \uc4f0\ub808\ub4dc\ub97c \ub3d9\uae30\ud654\ud558\uace0 \uc2f6\ub2e4\uba74 \uc138\ub9c8\ud3ec\uc5b4, synchnized \ud0a4\uc6cc\ub4dc \ub4f1\uc744 \uc774\uc6a9\ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\ubcf8 \ud504\ub85c\uc81d\ud2b8\uc758 \uc18c\uc2a4\ucf54\ub4dc\ub294 <a href=\"https:\/\/github.com\/charlezz\/openglstudy\">github<\/a>\uc5d0\uc11c \ud655\uc778 \ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Video Player based on GLSurfaceView \ud14d\uc2a4\ucc98 \uc788\ub294 \uc0ac\uac01\ud615 \ub9cc\ub4e4\uae30\uae4c\uc9c0 \uc131\uacf5\ud588\ub2e4\uba74, Android OpenGL ES\uc5d0\uc11c \ub3d9\uc601\uc0c1 \ud50c\ub808\uc774\uc5b4\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc790\uccb4\ub294 \uac04\ub2e8\ud569\ub2c8\ub2e4.\u00a0SurfaceTexture\uc5d0 \ub300\ud55c \uae30\ubcf8\uc801\uc778 \ub0b4\uc6a9\uc744 \uc54c\uace0 \uacc4\uc2dc\ub2e4\uba74 \ub354\uc6b1 \uc774\ud574\ud558\uae30 \uc27d\uc2b5\ub2c8\ub2e4. \uc250\uc774\ub354 \ucf54\ub4dc\ubd80\ud130 \ucc28\uadfc\ucc28\uadfc \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ubc84\ud14d\uc2a4 \uc250\uc774\ub354\ucf54\ub4dc\ub294 \ud14d\uc2a4\ucc98 \uc788\ub294 \uc0ac\uac01\ud615 \ub9cc\ub4e4\uae30\uc5d0 \uc788\ub358 \uac83\uacfc \uac19\uc544 \uc0dd\ub7b5\ud569\ub2c8\ub2e4. &#8220;#extension GL_OES_EGL_image_external : require\\n&#8221; + &#8220;precision mediump float;&#8221; + &#8220;varying [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[24],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1023"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1023"}],"version-history":[{"count":3,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1023\/revisions"}],"predecessor-version":[{"id":1031,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1023\/revisions\/1031"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}