{"id":728,"date":"2022-11-09T15:58:44","date_gmt":"2022-11-09T06:58:44","guid":{"rendered":"http:\/\/practical.kr\/?p=728"},"modified":"2022-11-09T15:58:44","modified_gmt":"2022-11-09T06:58:44","slug":"opensource-flutter-webrtc-camara","status":"publish","type":"post","link":"http:\/\/practical.kr\/?p=728","title":{"rendered":"OpenSource &#8211; Flutter WebRTC Camara"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/practical.kr\/wp-content\/uploads\/2022\/11\/webcam.png\" alt=\"\" class=\"wp-image-729\" width=\"612\" height=\"327\"\/><\/figure>\n\n\n\n<p>\ucd5c\uadfc WebRTC \uad00\ub828 \uc791\uc5c5\uc744 \ub9ce\uc774 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc8fc\ub85c Flutter\ub97c \uc0ac\uc6a9\ud574\uc11c \uc571\uc744 \ub9cc\ub4e4\uace0 \uc788\ub294\ub370 \uc544\ub798 \ud50c\ub7ec\ud130 \ud328\ud0a4\uc9c0\uac00 \uafb8\uc900\ud788 \uc5c5\uadf8\ub808\uc774\ub4dc \ub418\uace0 \uc788\uc5b4\uc11c \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\ud50c\ub7ec\ud130\uc6a9 WebRTC \ud328\ud0a4\uc9c0\n<a rel=\"noreferrer noopener\" href=\"https:\/\/pub.dev\/packages\/flutter_webrtc\" target=\"_blank\">https:\/\/pub.dev\/packages\/flutter_webrtc<\/a><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">WebRTC\ub97c \uc774\uc6a9\ud55c \ubc18\ub824\ub3d9\ubb3c CCTV\n<a rel=\"noreferrer noopener\" href=\"http:\/\/practical.kr\/?p=580\" target=\"_blank\">http:\/\/practical.kr\/?p=580<\/a><\/pre>\n\n\n\n<p class=\"has-large-font-size\">\uc2dc\uadf8\ub110\ub9c1(Signaling)<\/p>\n\n\n\n<p>WebRTC\ub294 offer &#8211; answer &#8211; candidate \ub4f1\uc758 \ub370\uc774\ud130\ub97c \uc8fc\uace0\ubc1b\ub294  \uacfc\uc815\uc744 \uac70\uccd0\uc57c\ub9cc \ud654\uc0c1\ud1b5\uc2e0\uc744 \uc5f0\uacb0 \ud560 \uc218 \uc788\ub294\ub370 \uc774 \uacfc\uc815\uc744 \uc2dc\uadf8\ub110\ub9c1\uc774\ub77c\uace0 \ud558\uace0 \uc77c\ubc18\uc801\uc73c\ub85c \uc2dc\uadf8\ub110 \uc11c\ubc84\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uce74\uba54\ub77c\uc640 \ubdf0\uc5b4\ub97c \uc5f0\uacb0\ud569\ub2c8\ub2e4. \uaddc\uc815\ub41c \ubc29\ubc95\uc740 \uc5c6\uace0 \uac1c\ubc1c\uc790\uac00 \uc6d0\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc804\ub2ec \ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. \uc8fc\ub85c \uc18c\ucf13\uc744 \ub9ce\uc774 \uc774\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc800\ub294 \uc774\ub7f0 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574 \ubcf4\uae30\ub3c4 \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">MQTT \uae30\ubc18\uc73c\ub85c WebRTC \uc5f0\uacb0\n<a rel=\"noreferrer noopener\" href=\"http:\/\/practical.kr\/?p=521\" target=\"_blank\">http:\/\/practical.kr\/?p=521<\/a><\/pre>\n\n\n\n<p>\uc774\uac83\uc744 \uc704\ud574 \ubcc4\ub3c4\uc758 \uc11c\ubc84\ub97c \uc6b4\uc601\uc744 \ud574\uc57c \ud569\ub2c8\ub2e4.  \uc5b8\uc820\uac00 \uc774\ub7f0 \uc0dd\uac01\uc744 \ud574 \ubd24\uc2b5\ub2c8\ub2e4. \ub85c\uadf8\uc778 \ud558\uc9c0 \uc54a\uace0 \uc11c\ubc84 \uc5c6\uc774 \uc5f0\uacb0 \ud560 \uc218 \uc5c6\uc744\uae4c? \uc6d0\uaca9\uc740 \uc880 \uc5b4\ub835\uaca0\uc9c0\ub9cc \ub85c\uceec Wifi\uc5d0\uc11c\ub294 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc744\uae4c? \ub85c\uceec Wifi \uc5d0 \uc5f0\uacb0\ub41c \ubaa8\ub4e0 \uc571\uc774 \uc18c\ucf13\uc744 \uc5f4\uace0 \uc11c\ub85c \ub370\uc774\ud130\ub97c \uc8fc\uace0 \ubc1b\uc73c\uba74 WebRTC  \uc11c\ubc84 \uc5c6\uc774 \uc5f0\uacb0\ud560 \uc218 \uc788\uaca0\ub294\ub370? &#8230; \uadf8\ub7f0\ub370 \uc77c\ub2e8 \uc571\uc758 IP\ub97c \uc54c\uc544\uc57c\ub9cc \ub418\ub354\uad70\uc694.<\/p>\n\n\n\n<p class=\"has-large-font-size\">IP \ucc3e\uae30( Discover)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Bonsoir \ud328\ud0a4\uc9c0\n<a rel=\"noreferrer noopener\" href=\"https:\/\/pub.dev\/packages\/bonsoir\" target=\"_blank\">https:\/\/pub.dev\/packages\/bonsoir<\/a><\/pre>\n\n\n\n<p>Bonsoir\ub294 Zeroconf(<a rel=\"noreferrer noopener\" href=\"https:\/\/ko.wikipedia.org\/wiki\/Zeroconf\" target=\"_blank\">https:\/\/ko.wikipedia.org\/wiki\/Zeroconf<\/a>) \uae30\ubc18\uc758 Discover \ud328\ud0a4\uc9c0\uc785\ub2c8\ub2e4. \uc544\ub798\uc758 \ucf54\ub4dc\ucc98\ub7fc \uc774\ubca4\ud2b8\ub97c \ub9ac\uc2a4\ub2dd\ud558\uace0 \uc788\uc73c\uba74 \ube0c\ub85c\ub4dc\uac1c\uc2a4\ud2b8\ub97c \ud558\ub294 \ubaa8\ub4e0 \uae30\uae30\ub97c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc560\ud50c\uc740 \ubd09\uc8fc\ub974\ub77c\ub294 \uc774\ub984\uc73c\ub85c \uae30\uae30\ub4e4\uc744 \uc5f0\uacb0\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  Future&lt;void> _discoverService() async {\n    _discovery = BonsoirDiscovery(type: _type);\n    if (_discovery != null) {\n      await _discovery!.ready;\n\n      _discovery!.eventStream!.listen((event) {\n        if (event.service != null) {\n          ResolvedBonsoirService service = event.service as ResolvedBonsoirService;\n\n          if (event.type == BonsoirDiscoveryEventType.discoveryServiceResolved) {\n            final index = _resolvedServices.indexWhere((ResolvedBonsoirService item) => item.ip == service.ip);\n            if (index == -1 &amp;&amp; service.ip.toString() != \"null\") {\n              _resolvedServices.add(service);\n              setState(() {});\n            }\n          } else if (event.type == BonsoirDiscoveryEventType.discoveryServiceLost) {\n            _resolvedServices.remove(service);\n            setState(() {});\n          }\n        }\n      });\n      await _discovery!.start();\n    }\n  }\n<\/pre>\n\n\n\n<p class=\"has-large-font-size\">\uc624\ud508\uc18c\uc2a4 WebRTC \uce74\uba54\ub77c<\/p>\n\n\n\n<p>\uc704\uc758 \uba87\uac00\uc9c0 \uae30\uc220\uc744 \uc870\ub9bd\ud574\uc11c \uc571\uc744 \ub9cc\ub4e4\uc5b4 \ubd24\uc2b5\ub2c8\ub2e4. \ud50c\ub7ec\ud130\uc758 \uc7a5\uc810\uc778 \uba40\ud2f0 \ud50c\ub7ab\ud3fc \uc9c0\uc6d0 \uae30\ub2a5\uc73c\ub85c \uc544\uc774\ud3f0 \/ \uc548\ub4dc\ub85c\uc774\ub4dc \/ \ub9e5 \uc5d0\uc11c \uc2e4\ud589 \uac00\ub2a5 \ud558\ub3c4\ub85d \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc544\ub798 \ub9c1\ud06c\uc5d0\uc11c \uc18c\uc2a4\ub97c \ub2e4\uc6b4 \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc6b0\uc120 \ub9e5\uc571\uc744 \ube4c\ub4dc\ud574\uc11c \ub9e5\uc5d0 \uc2e4\ud589\ud558\uace0 \uc2a4\ub9c8\ud2b8\ud3f0\uc5d0 \uc571\uc744 \ube4c\ub4dc\ud574\uc11c \uc2e4\ud589\ud558\uba74 \uc704\uc758 \uadf8\ub9bc\uacfc \uac19\uc774 \uc640\uc774\ud30c\uc774 \ubb34\uc120 \uce74\uba54\ub77c\ub97c \uc2e4\ud589 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5f0\uacb0\uc5d0 \uc81c\ud55c\uc774 \uc5c6\uc73c\ubbc0\ub85c \ub9ce\uc740 \uce74\uba54\ub77c\ub97c \ud55c\ubc88\uc5d0 \uc5f0\uacb0 \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ucf54\ub4dc\ub97c \uc218\uc815\ud558\uba74 \ub450\ub300\uc758 \uc2a4\ub9c8\ud2b8\ud3f0\uc73c\ub85c \ud55c\ub300\ub294 \uc11c\ubc84\ub85c \ub2e4\ub978 \uc2a4\ub9c8\ud2b8\ud3f0\uc744 \uce74\uba54\ub77c\ub85c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\uc18c\uc2a4\ucf54\ub4dc \ub9c1\ud06c\n<a href=\"https:\/\/github.com\/bipark\/flutter_webrtc_wifi_camera\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/bipark\/flutter_webrtc_wifi_camera<\/a><\/pre>\n\n\n\n<p>rtlink.park@gmail.com<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ucd5c\uadfc WebRTC \uad00\ub828 \uc791\uc5c5\uc744 \ub9ce\uc774 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc8fc\ub85c Flutter\ub97c \uc0ac\uc6a9\ud574\uc11c \uc571\uc744 \ub9cc\ub4e4\uace0 \uc788\ub294\ub370 \uc544\ub798 \ud50c\ub7ec\ud130 \ud328\ud0a4\uc9c0\uac00 \uafb8\uc900\ud788 \uc5c5\uadf8\ub808\uc774\ub4dc \ub418\uace0 \uc788\uc5b4\uc11c \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud50c\ub7ec\ud130\uc6a9 WebRTC \ud328\ud0a4\uc9c0 https:\/\/pub.dev\/packages\/flutter_webrtc WebRTC\ub97c \uc774\uc6a9\ud55c \ubc18\ub824\ub3d9\ubb3c CCTV http:\/\/practical.kr\/?p=580 \uc2dc\uadf8\ub110\ub9c1(Signaling) WebRTC\ub294 offer &#8211; answer &#8211; candidate \ub4f1\uc758 \ub370\uc774\ud130\ub97c \uc8fc\uace0\ubc1b\ub294 \uacfc\uc815\uc744 \uac70\uccd0\uc57c\ub9cc \ud654\uc0c1\ud1b5\uc2e0\uc744 \uc5f0\uacb0 \ud560 \uc218 \uc788\ub294\ub370 \uc774 \uacfc\uc815\uc744 \uc2dc\uadf8\ub110\ub9c1\uc774\ub77c\uace0 \ud558\uace0 \uc77c\ubc18\uc801\uc73c\ub85c<\/p>\n<div class=\"more-link\">\n\t\t\t\t <a href=\"http:\/\/practical.kr\/?p=728\" class=\"link-btn theme-btn\"><span>Read More <\/span> <i class=\"fa fa-caret-right\"><\/i><\/a>\n\t\t\t<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[48,14,12,13,44],"tags":[45,43,49],"class_list":["post-728","post","type-post","status-publish","format-standard","hentry","category-android","category-app","category-flutter","category-ios","category-webrtc","tag-opensource","tag-webrtc","tag-cctv"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=728"}],"version-history":[{"count":6,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/728\/revisions"}],"predecessor-version":[{"id":735,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/728\/revisions\/735"}],"wp:attachment":[{"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=728"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}