{"id":4354,"date":"2021-11-17T21:15:41","date_gmt":"2021-11-17T13:15:41","guid":{"rendered":"https:\/\/www.enablex.io\/developer\/?page_id=4354"},"modified":"2025-04-11T15:24:18","modified_gmt":"2025-04-11T07:24:18","slug":"canvas-streaming","status":"publish","type":"page","link":"https:\/\/doc.smartflomeet.ttns.in\/developer\/video-api\/client-api\/ios-toolkit\/canvas-streaming\/","title":{"rendered":"Canvas Streaming: iOS SDK &#8211; Video API"},"content":{"rendered":"\n<p>Canvas Streaming allows you to publish any view into the Room. To support Canvas Streaming in the Room, you need to enable canvas during <a href=\"\/developer\/video-api\/server-api\/rooms-route\/#create-room\" target=\"_blank\" rel=\"noreferrer noopener\">Room Creation<\/a> by setting: <code>{ canvas: true; }}<\/code>\u00a0in the JSON Payload.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4>Table of Contents<\/h4>\n\n\n\n<ul><li><a href=\"#start-canvas-streaming\">Start Canvas Streaming<\/a><\/li><li><a href=\"#stop-canvas-streaming\">Stop Canvas Streaming<\/a><\/li><li><a href=\"#canvas-streaming\">R<\/a><a href=\"#receive-canvas-streaming\">eceive &amp; Play Canvas Streaming<\/a><\/li><li><a href=\"#force-stop-share\">Force Stop Canvas Streaming<\/a><\/li><\/ul>\n\n\n\n<a name=\"start-canvas-streaming\"><\/a>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3>Start Canvas Streaming<\/h3>\n\n\n\n<p>The&nbsp;<code>EnxRoom.startCanvas()<\/code>&nbsp;method is used to start canvas streaming.<\/p>\n\n\n\n<p><strong>Method<\/strong>:&nbsp;<code>(void) startCanvas:(UIView*_Nonnull)view<\/code><\/p>\n\n\n\n<p><strong>Parameter:<\/strong> <\/p>\n\n\n\n<p><code>UIView<\/code> &#8211; The UI View to be used for Canvas Streaming.<\/p>\n\n\n\n<p> <strong>Delegate Methods<\/strong>: <\/p>\n\n\n\n<ul><li><code>- room:didStartCanvasACK<\/code>:&nbsp;\u2013 Acknowledgment to the publisher when Canvas Streaming starts. <\/li><li> <code>- room:didCanvasStarted:&nbsp;<\/code>\u2013 Notification to everyone in the Room when Canvas Streaming starts.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">[room startCanvas: UIView];\n\n\/\/ Callback method for Publisher to\n\/\/ acknowledge that Canvas Streaming has started\n-(void)room:(EnxRoom *_Nullable)room didStartCanvasACK:(NSArray *_Nullable)Data; \n\n\/\/ Callback method for all participants in \n\/\/ the room to notify that canvas streaming has started\n-(void)room:(EnxRoom*)room didCanvasStarted:(EnxStream *_Nullable)stream{\n\tstream.enxPlayer.frame = yourFrame;\n\t[yourView addSubview:stream.enxPlayer];\n}\n\n-(void)room:(EnxRoom *)room didStartCanvasACK:(NSArray *)Data{\n\t\/\/ Acknowledge to the Publisher that Canvas Stream started.\n\t\n}<\/pre>\n\n\n\n<p><strong>Error Codes \/ Exceptions<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Code<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>5105<\/td><td>Repeated <code>startCanvas()<\/code> call when Canvas Streaming is already active.<\/td><\/tr><tr><td>5107<\/td><td>Repeated <code>startCanvas()<\/code> call when a previous request is in process.<\/td><\/tr><tr><td>5103<\/td><td>Canvas Streaming or Screen Share already active in the Room.<\/td><\/tr><tr><td>5110<\/td><td>Failed to publish Canvas Stream<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<a name=\"stop-canvas-streaming\"><\/a>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3>Stop Canvas Streaming<\/h3>\n\n\n\n<p>The EnxR<code>oom.stopCanvas()<\/code>&nbsp;method is used to stop Canvas Streaming.<\/p>\n\n\n\n<p><strong>Class:<\/strong> EnxRoom<\/p>\n\n\n\n<p><strong>Method<\/strong>:&nbsp;<code>-(void)stopCanvas;<\/code><\/p>\n\n\n\n<p><strong>Delegate Methods<\/strong>:&nbsp;<\/p>\n\n\n\n<ul><li> <code>- room:didStopCanvasACK<\/code>:&nbsp;\u2013 Acknowledgment to the publisher when Canvas Streaming stops.<\/li><li> <code>- room:didCanvasStopped:<\/code>&nbsp;\u2013 Notification to everyone in the Room when Canvas Streaming stops.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">[room stopCanvas];\n\n\/\/ Callback method for Publisher to\n\/\/ acknowledge that Canvas Streaming has stopped\n-(void)room:(EnxRoom *_Nullable)room didStoppedCanvasACK:(NSArray *_Nullable)Data; \n\n\/\/ Everyone notified that Canvas Streaming has stopped\n-(void)room:(EnxRoom *)room didCanvasStopped:(EnxStream *_Nullable)stream{\n\t[stream.enxPlayer removeFromSuperview];\n}\n<\/pre>\n\n\n\n<a name=\"receive-canvas-streaming\"><\/a>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3>Receive &amp; Play Canvas Streams<\/h3>\n\n\n\n<p>To receive Canvas Streaming, you need to subscribe to the Canvas Stream ID# 102. Once subscribed, you can play it like any other Video Stream using a Video Player.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ You are notified when Canvas Streaming started\n-(void)room:(EnxRoom *)room canvasStarted:(NSArray *)Data{\n\t\/*Data is \n\t[\t{ \n\t\t\t\"clientId\" : \"XXXX\", \n\t\t\t\"name\" : \"Canvas Streaming from Web\",\n\t\t\t\"result\" : 0, \n\t\t\t\"streamId\" : 102\n\t\t},\n\t\t\"&lt;null&gt;\"\n\t]\n\t*\/\n\n\n\tNSDictionary *responseDict = Data[0];\n\t\n\t\/\/ Get remote stream using streamId\n\tNSString *streamId = *responseDict[@\u201dstreamId\u201d];\n\tEnxStream *stream = room.streamsByStreamId[streamId]; \n\t  \n\t\/\/ init player view\n\tEnxPlayerView *playerView = [[EnxPlayerView alloc] initWithFrame:frame];\n\t[stream attachRenderer:playerView];\n\t[playerView setDelegate:self];\n}\n\n\n\/\/ You are notified when Canvas Streaming stopped\n-(void)room:(EnxRoom *)room canvasStopped:(NSArray *)Data{\n\t\/* Data is \n\t[\t{ \n\t\t\t\"clientId\" : \"XXXX\", \n\t\t\t\"name\" : \"Canvas Streaming from Web\",\n\t\t\t\"result\" : 0, \n\t\t\t\"streamId\" : 102\n\t\t},\n\t\t\"&lt;null&gt;\"\n\t]\n\t*\/\n\n\t\/\/ Update your UI here.\n\n}<\/pre>\n\n\n\n<p><strong>Note:&nbsp;<\/strong>In case of error, &lt;null&gt; is received at the first Index and Error Info at the second Index.<\/p>\n\n\n\n<a name=\"force-stop-share\"><\/a>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3>Force Stop Canvas Streaming<\/h3>\n\n\n\n<p><strong>Availability:<\/strong> iOS SDK 2.1.2+ <\/p>\n\n\n\n<p>If moderator wishes to force stop any ongoing Canvas Streaming by other user in the Room, he can do so by using <code>EnxRoom.stopAllSharing()<\/code> method. Note, this is Moderator exclusive feature, can&#8217;t be executed from Participant&#8217;s end point.<\/p>\n\n\n\n<p>This method also force stops any ongoing Screen Share.<\/p>\n\n\n\n<p><strong>Class:<\/strong> <code>EnxRoom<\/code><\/p>\n\n\n\n<p><strong>Observer<\/strong>: <code>ACK CallBack<\/code><\/p>\n\n\n\n<p><strong>Method:<\/strong> <code>-(void)stopAllSharing<\/code> <\/p>\n\n\n\n<p><strong>Callbacks:<\/strong><\/p>\n\n\n\n<p><code>didACKStopAllSharing<\/code> &#8211; Notification to everyone in the Room when Canvas Streaming stops.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[EnxRoom stopAllSharing];     \/\/ Force Stop the Canvas Streaming\n\n \n\/\/ Notification to all when share stops\n- (void)signalingChannel:(EnxSignalingChannel *_Nullable)channel didACKStopAllSharing:(NSArray *_Nonnull)data     <\/pre>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator is-style-wide\"\/>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<p>\u2190 <a href=\"..\/screen-share\/\">Screen Share<\/a><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p class=\"has-text-align-center\"><a href=\"..\/\">Index<\/a><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p class=\"has-text-align-right\"><a href=\"..\/annotation\/\">Annotation<\/a>&nbsp; \u2192<a href=\"\/developer\/how-to-use\/\"><\/a><\/p>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Canvas Streaming allows you to publish any view into the Room. To support Canvas Streaming in the Room, you need to enable canvas during Room Creation by setting: { canvas: true; }}\u00a0in the JSON Payload. Table of Contents Start Canvas Streaming Stop Canvas Streaming Receive &amp; Play Canvas Streaming Force Stop Canvas Streaming Start Canvas Streaming The&nbsp;EnxRoom.startCanvas()&nbsp;method is used to start canvas streaming. Method:&nbsp;(void) startCanvas:(UIView*_Nonnull)view Parameter: UIView &#8211; The UI&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"parent":3732,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":""},"featured_image_src":null,"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"featured":false,"featured-large":false},"uagb_author_info":{"display_name":"vcxdevwpadmin","author_link":"https:\/\/doc.smartflomeet.ttns.in\/developer\/author\/vcxdevwpadmin\/"},"uagb_comment_info":0,"uagb_excerpt":"Canvas Streaming allows you to publish any view into the Room. To support Canvas Streaming in the Room, you need to enable canvas during Room Creation by setting: { canvas: true; }}\u00a0in the JSON Payload. Table of Contents Start Canvas Streaming Stop Canvas Streaming Receive &amp; Play Canvas Streaming Force Stop Canvas Streaming Start Canvas&hellip;","_links":{"self":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/4354"}],"collection":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/comments?post=4354"}],"version-history":[{"count":0,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/4354\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/3732"}],"wp:attachment":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/media?parent=4354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}