<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DavidRelo</title>
    <description>The latest articles on DEV Community by DavidRelo (@davidrelo).</description>
    <link>https://dev.to/davidrelo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg</url>
      <title>DEV Community: DavidRelo</title>
      <link>https://dev.to/davidrelo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davidrelo"/>
    <language>en</language>
    <item>
      <title>How To Use Live Stream SDK iOS Build App</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Fri, 30 Sep 2022 03:48:44 +0000</pubDate>
      <link>https://dev.to/zegocloud/how-to-use-live-stream-sdk-ios-build-app-5bc9</link>
      <guid>https://dev.to/zegocloud/how-to-use-live-stream-sdk-ios-build-app-5bc9</guid>
      <description>&lt;p&gt;More and more companies have launched their own &lt;strong&gt;iOS live stream SDK&lt;/strong&gt;, which shows the rapid development trend of the live streaming market.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://www.insiderintelligence.com/content/apac-dominates-in-mobile-phone-video-viewership" rel="noopener noreferrer"&gt;eMarketer forecasts&lt;/a&gt;, 2.72 billion people will watch videos on their mobile phones in 2023. That's up from 2.16 billion in 2019. This represents a compound annual growth rate (CAGR) of 6%—higher than the 4.5% CAGR for worldwide digital video viewers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What features do you need for live streaming
&lt;/h2&gt;

&lt;p&gt;With the continuous development of the live streaming industry, live streaming has been divided into several sub-industries.&lt;/p&gt;

&lt;p&gt;such as game live streaming, education live streaming, live streaming with goods, and live streaming of entertainment.&lt;br&gt;
Different live streaming industries require different functions.&lt;/p&gt;

&lt;p&gt;Basic function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Room management&lt;/li&gt;
&lt;li&gt;Audio and video push-pull stream management&lt;/li&gt;
&lt;li&gt;Device management&lt;/li&gt;
&lt;li&gt;Member management&lt;/li&gt;
&lt;li&gt;Barrage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Special function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Screen sharing&lt;/li&gt;
&lt;li&gt;shopping cart&lt;/li&gt;
&lt;li&gt;Gift effects&lt;/li&gt;
&lt;li&gt;Host PK&lt;/li&gt;
&lt;li&gt;Make co-hosts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A complete live streaming application is a complex system. Most enterprises will use the &lt;strong&gt;live stream SDK for iOS&lt;/strong&gt; to quickly build a live broadcast platform and occupy the live streaming market.&lt;/p&gt;
&lt;h2&gt;
  
  
  What support is provided by the live streaming SDK
&lt;/h2&gt;

&lt;p&gt;The development of live streaming SDK is also developing in a simple and convenient direction, from providing the underlying audio and video transmission capability to a complete live streaming solution, to the current componentized solution.&lt;br&gt;
It can not only meet the requirements of customers for rapid construction but also meet the various personalized needs of customers.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD's latest ios live stream SDK - &lt;a href="https://www.zegocloud.com/uikits?_source=dev&amp;amp;article=33" rel="noopener noreferrer"&gt;Live Streaming Kit&lt;/a&gt;. It is a componentized solution. The SDK encapsulates the live streaming function into an independent component and provides rich UI custom interfaces. Users select components according to their own needs and customize the UI.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to build an app with live streaming SDK
&lt;/h2&gt;

&lt;p&gt;Next, I will use the &lt;strong&gt;live video streaming iOS SDK&lt;/strong&gt; to demonstrate how to quickly build a live video streaming app.&lt;/p&gt;
&lt;h3&gt;
  
  
  Add ZegoUIKitPrebuiltLiveStreaming as dependencies
&lt;/h3&gt;

&lt;p&gt;Integrate ZegoUIKitPrebuiltLiveStreaming SDK through the pod as follows, add pod 'ZegoUIKitPrebuiltLiveStreaming' in Podfile file. Then execute the command &lt;code&gt;pod install&lt;/code&gt; in Terminal. For detailed operation, please refer to &lt;a href="https://docs.zegocloud.com/article/14868" rel="noopener noreferrer"&gt;Quick Access Documentation&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="s1"&gt;'ZegoCallDemo'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;use_frameworks!&lt;/span&gt;

  &lt;span class="c1"&gt;# Pods for ZegoCallDemo&lt;/span&gt;
  &lt;span class="n"&gt;pod&lt;/span&gt; &lt;span class="s1"&gt;'ZegoUIKitPrebuiltLiveStreaming'&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Import ZegoUIKitSDK &amp;amp; ZegoUIKitPrebuiltCall to your project
&lt;/h3&gt;

&lt;p&gt;In the file that needs to be called the SDK interface, import the SDK through import.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitSDK&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreaming&lt;/span&gt;
&lt;span class="c1"&gt;// YourViewController.swift&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;MainViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//Other code...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Using the ZegoUIKitPrebuiltLiveStreamingVC in your project
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://console.zegocloud.com?_source=dev&amp;amp;article=33" rel="noopener noreferrer"&gt;ZEGOCLOUD Admin Console&lt;/a&gt;, get the &lt;code&gt;appID&lt;/code&gt; and &lt;code&gt;appSign&lt;/code&gt; of your project.&lt;/li&gt;
&lt;li&gt;Specify the &lt;code&gt;userID&lt;/code&gt; and &lt;code&gt;userName&lt;/code&gt; for connecting the Live Streaming Kit service. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;liveID&lt;/code&gt; represents the live streaming you want to start or watch (only supports single-host live streaming for now).
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// YourViewController.swift&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;MainViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Other code...&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;#UserID&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;#UserName&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;liveID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;#liveID&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;startLive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kPresetRoleHost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;liveVC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingVC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingVC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yourAppID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;appSign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;yourAppSign&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;liveID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;liveID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;liveVC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modalPresentationStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fullScreen&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;liveVC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;animated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;watchLive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kPresetRoleAudience&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;liveVC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingVC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltLiveStreamingVC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yourAppID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;appSign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;yourAppSign&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;liveID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;liveID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;liveVC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modalPresentationStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fullScreen&lt;/span&gt;
      &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;liveVC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;animated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then, you can start live streaming by presenting the &lt;code&gt;liveVC&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure your project
&lt;/h2&gt;

&lt;p&gt;Open the &lt;code&gt;Info.plist&lt;/code&gt;, add the following code inside the &lt;code&gt;dict&lt;/code&gt; part:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plist"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="mh"&gt;e&lt;/span&gt;&lt;span class="err"&gt;y&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="l"&gt;NSCameraUsageDescription&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/k&lt;/span&gt;&lt;span class="mh"&gt;e&lt;/span&gt;&lt;span class="err"&gt;y&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="l"&gt;We&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;camera&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;connect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;call&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="mh"&gt;e&lt;/span&gt;&lt;span class="err"&gt;y&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="l"&gt;NSMicrophoneUsageDescription&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/k&lt;/span&gt;&lt;span class="mh"&gt;e&lt;/span&gt;&lt;span class="err"&gt;y&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="l"&gt;We&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;microphone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;connect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;call&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F30%2Fvideosdk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F30%2Fvideosdk.jpg" alt="video-sdk"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Run the demo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TXoIJXTGjEA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;



&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=33" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, and get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;
&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/video-sdk-for-easier-integration-1p7g" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Video SDK for easier integration&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Sep 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#swift&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#video&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;




&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-choose-android-voice-chat-sdk-1ojf" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to choose android Voice Chat SDK&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Sep 26 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-create-avatar-from-photo-57oa" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How To Create Avatar From Photo&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Sep 6 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-live-streaming-app-81a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to build a live streaming app?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ios</category>
      <category>swift</category>
      <category>sdk</category>
      <category>programming</category>
    </item>
    <item>
      <title>Video SDK for easier integration</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Thu, 29 Sep 2022 02:50:34 +0000</pubDate>
      <link>https://dev.to/zegocloud/video-sdk-for-easier-integration-1p7g</link>
      <guid>https://dev.to/zegocloud/video-sdk-for-easier-integration-1p7g</guid>
      <description>&lt;h2&gt;
  
  
  A wide variety of Video SDK
&lt;/h2&gt;

&lt;p&gt;More and more companies are joining the video service industry, and various &lt;strong&gt;video SDKs are emerging&lt;/strong&gt;. It has also become increasingly difficult for developers to choose the Video SDK.&lt;/p&gt;

&lt;p&gt;How should we choose the &lt;strong&gt;Video SDK&lt;/strong&gt; that suits us?&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple becomes mainstream
&lt;/h2&gt;

&lt;p&gt;The purpose of developers using the SDK is to obtain stable and high-quality services while saving development time.&lt;/p&gt;

&lt;p&gt;Therefore, while ensuring the stability and quality of the SDK, the convenience of access has become the goal pursued by various enterprises.&lt;/p&gt;

&lt;p&gt;It is a time saver for developers who build audio and video applications.&lt;/p&gt;

&lt;p&gt;For example, the latest UIKits product launched by &lt;a href="https://www.zegocloud.com?_source=dev&amp;amp;article=32" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt; has brought the convenience of integrating the video SDK to a new height. Developers can realize the audio and video call function in only 30 minutes.&lt;/p&gt;

&lt;p&gt;UI kits SDK provides 20+ UIKits, 50+ Components, supports Video calls, Voice calls, live streaming, and other scenarios to build, supports rich configuration item configuration, convenient and quick custom UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrate video SDK
&lt;/h2&gt;

&lt;p&gt;Let's take &lt;strong&gt;iOS Video SDK&lt;/strong&gt; as an example to experience the convenience brought by UIKits SDK step by step.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Add SDK to project
&lt;/h3&gt;

&lt;p&gt;Introduce ZegoUIKitPrebuiltCall SDK through the pod as follows, add pod 'ZegoUIKitPrebuiltCall' in Podfile file. Then execute the command &lt;code&gt;pod install&lt;/code&gt; in Terminal. For detailed operation, please refer to &lt;a href="https://docs.zegocloud.com/article/14819?_source=dev&amp;amp;article=32" rel="noopener noreferrer"&gt;Quick Access Documentation&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="s1"&gt;'ZegoCallDemo'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;use_frameworks!&lt;/span&gt;

  &lt;span class="c1"&gt;# Pods for ZegoCallDemo&lt;/span&gt;
  &lt;span class="n"&gt;pod&lt;/span&gt; &lt;span class="s1"&gt;'ZegoUIKitPrebuiltCall'&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2) Import iOS video SDK to your project
&lt;/h3&gt;

&lt;p&gt;In the file that needs to be called the SDK interface, import the SDK through import.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import ZegoUIKitSDK
import ZegoUIKitPrebuiltCall
// YourViewController.swift
class ViewController: UIViewController {
    //Other code...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3) Show the ZegoUIKitPrebuiltCallVC in your project
&lt;/h3&gt;

&lt;p&gt;Next, you only need to display ZegoUIKitPrebuiltCallVC in the module that needs to start the video call to complete the SDK access.&lt;br&gt;
Before entering the page, there are three steps that need to be done:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://console.zegocloud.com?_source=dev&amp;amp;article=32" rel="noopener noreferrer"&gt;ZEGOCLOUD Admin Console&lt;/a&gt;, get the appID and app Sign of your project.&lt;/li&gt;
&lt;li&gt;Specify the userID and userName for connecting the Call Kit service.&lt;/li&gt;
&lt;li&gt;Create a callID that represents the call you want to make.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// YourViewController.swift&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Other code...&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;#UserID&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;#UserName&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;callID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;#CallID&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="kd"&gt;@IBAction&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;makeNewCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIkitPrebuiltCallConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIkitPrebuiltCallConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;audioVideoConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoPrebuiltAudioVideoViewConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoPrebuiltAudioVideoViewConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;menuBarConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoBottomMenuBarConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoBottomMenuBarConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;audioVideoViewConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;audioVideoConfig&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottomMenuBarConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;menuBarConfig&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pictureInPicture&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;pipConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayoutPictureInPictureConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayoutPictureInPictureConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;pipConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;smallViewPostion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;topRight&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pipConfig&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;


        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;callVC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltCallVC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yourAppID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                                  &lt;span class="nv"&gt;appSign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;yourAppSign&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                                  &lt;span class="nv"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                                  &lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                                  &lt;span class="nv"&gt;callID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;callID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                                  &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


        &lt;span class="n"&gt;callVC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modalPresentationStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fullScreen&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callVC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;animated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4) Configure your project
&lt;/h3&gt;

&lt;p&gt;Finally, you only need to add the camera and microphone permission to the iOS configuration file Info.plist, and then you can start to experience the audio and video call function.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;NSCameraUsageDescription&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;We require camera access to connect to a call&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;NSMicrophoneUsageDescription&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;We require microphone access to connect to a call&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Fvideosdk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Fvideosdk.jpg" alt="video-sdk"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Custom prebuilt UI
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD Call Kit provides a wealth of custom interfaces that you can modify according to your needs. For example, on the call page, we can achieve the following effects:&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Display my view when my camera is off
&lt;/h3&gt;

&lt;p&gt;If you want to still show your own video view when the camera is turned off, just set the &lt;code&gt;showMyViewWithVideoOnly&lt;/code&gt; parameter in &lt;code&gt;ZegoUIkitPrebuiltCallConfig&lt;/code&gt; to true to achieve this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayoutshowself.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayoutshowself.gif" alt="layout_show_self"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Hide my view when my camera is off
&lt;/h3&gt;

&lt;p&gt;If you want to hide your own video view when closing the camera, just set the &lt;code&gt;showMyViewWithVideoOnly&lt;/code&gt; parameter in &lt;code&gt;ZegoUIkitPrebuiltCallConfig&lt;/code&gt; to false to hide it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayouthiddenself.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayouthiddenself.gif" alt="layout_hidden_self"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Dragging Small View
&lt;/h3&gt;

&lt;p&gt;If you want to implement the function of dragging Video view, just set the &lt;code&gt;isSmallViewDraggable&lt;/code&gt; parameter in &lt;code&gt;ZegoUIkitPrebuiltCallConfig&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayoutdraggable.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayoutdraggable.gif" alt="layout_draggable"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4) Switch the content of two video views
&lt;/h3&gt;

&lt;p&gt;If you want to switch the content of two Video views, just set the switchLargeOrSmallViewByClick parameter in ZegoUIkitPrebuiltCallConfig.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayoutswitch.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F09%2F29%2Flayoutswitch.gif" alt="layout_switch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the reference code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;selfUserID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"userID"&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;selfUserName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"userName"&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;yourAppID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UInt32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;YourAppID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Fill in the appID that you get from ZEGOCLOUD Admin Console.&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;yourAppSign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;YourAppSign&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Fill in the appSign that you get from ZEGOCLOUD Admin Console.&lt;/span&gt;

    &lt;span class="kd"&gt;@IBOutlet&lt;/span&gt; &lt;span class="k"&gt;weak&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;userIDLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;didSet&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;userIDLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;selfUserID&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;@IBOutlet&lt;/span&gt; &lt;span class="k"&gt;weak&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;userNameLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;didSet&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;selfUserName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"zego_%@"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selfUserID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;userNameLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;selfUserName&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;// Do any additional setup after loading the view.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;@IBAction&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;makeNewCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIkitPrebuiltCallConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIkitPrebuiltCallConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pictureInPicture&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;pipConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayoutPictureInPictureConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoLayoutPictureInPictureConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;pipConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;showMyViewWithVideoOnly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;pipConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isSmallViewDraggable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;pipConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switchLargeOrSmallViewByClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pipConfig&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;callVC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ZegoUIKitPrebuiltCallVC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yourAppID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;appSign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;yourAppSign&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;selfUserID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selfUserName&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;callID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;callVC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modalPresentationStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fullScreen&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callVC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;animated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=32" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, and get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;
&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-choose-android-voice-chat-sdk-1ojf" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to choose android Voice Chat SDK&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Sep 26 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;




&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-create-avatar-from-photo-57oa" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How To Create Avatar From Photo&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Sep 6 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-live-streaming-app-81a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to build a live streaming app?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/how-to-use-video-call-api-to-build-a-live-video-call-app-4k1b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to use video call API to build a live video call app&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jul 25 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ios</category>
      <category>swift</category>
      <category>programming</category>
      <category>video</category>
    </item>
    <item>
      <title>How to choose android Voice Chat SDK</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Mon, 26 Sep 2022 07:16:33 +0000</pubDate>
      <link>https://dev.to/zegocloud/how-to-choose-android-voice-chat-sdk-1ojf</link>
      <guid>https://dev.to/zegocloud/how-to-choose-android-voice-chat-sdk-1ojf</guid>
      <description>&lt;h2&gt;
  
  
  The rapidly growing Voice Chat market
&lt;/h2&gt;

&lt;p&gt;The popularity of Clubhouse has given a solid push to the &lt;strong&gt;Voice Chat SDK&lt;/strong&gt; market, soliciting its spread and integration on other platforms. The voice-based social scene dramatically reduces the pressure on users to express themselves. It makes everyone more relaxed and confident talking to strangers on social media applications using only their voices.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to build a Voice Chat Application
&lt;/h2&gt;

&lt;p&gt;A complete Voice Chat App must provide functions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call invitation&lt;/li&gt;
&lt;li&gt;invitation notification&lt;/li&gt;
&lt;li&gt;random matching&lt;/li&gt;
&lt;li&gt;room management&lt;/li&gt;
&lt;li&gt;call status management&lt;/li&gt;
&lt;li&gt;network status monitoring&lt;/li&gt;
&lt;li&gt;sound waves
And more. The complete realization of these functions requires many human and material resources. Therefore, manufacturers encapsulate the full functions of voice chat into SDKs to provide external services.
Some examples are &lt;a href="https://www.zegocloud.com/solutions/live-audio-room?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;LiveAudioRoom&lt;/a&gt;, &lt;a href="https://www.zegocloud.com/UIKits?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;UIKits&lt;/a&gt;, &lt;a href="http://www.zegocloud.com/product/voice-call?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;and Voice Call&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to choose Android Voice SDK
&lt;/h2&gt;

&lt;p&gt;Each manufacturer provides its voice chat SDK. Given the wide choice, how do developers pick the SDK that suits their business?&lt;br&gt;
Let's take the android voice chat SDK as an example. In general, there are three SDKs categories on the market:&lt;/p&gt;
&lt;h3&gt;
  
  
  1) 'Room scene' Voice Chat SDK
&lt;/h3&gt;

&lt;p&gt;The scene SDK focuses on the encapsulation logic of business scenarios,  which implements the chat room scene's business logic and UI interface. Users only need to integrate the SDK into the application to realize a complete chat room function.&lt;/p&gt;

&lt;p&gt;This type of SDK has the highest level of integration and can complete scene development in one day. Because of the high degree of integration, developers' degree of freedom is relatively low. If the SDK's business requirements and standard functions are pretty different, the cost of secondary development will be high.&lt;br&gt;
For example: &lt;a href="https://www.zegocloud.com/solutions/live-audio-room?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;LiveAudioRoom SDK&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Functional Voice Chat SDK
&lt;/h3&gt;

&lt;p&gt;The functional SDK focuses on encapsulating functions into modules, such as the call function, notification function, voice call function, device management function, etc., required by the voice chat scenario.&lt;br&gt;
Developers can choose the required functions according to their business needs and add business logic. &lt;/p&gt;

&lt;p&gt;Compared with the scene SDK, the functional SDK has smaller granularity. Developers can focus on business logic development, directly integrating functions. This SDK reduces the developer's workload and ensures the developer's degree of freedom.&lt;br&gt;
For example: &lt;a href="https://www.zegocloud.com/UIKits?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;UIKits SDK&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Capability Voice Chat SDK
&lt;/h3&gt;

&lt;p&gt;The capability SDK focuses on the support of underlying capabilities.&lt;br&gt;
Such as the call function. The SDK provides audio transmission capabilities, but the developer needs to control when to start the transmission and which device to output audio.&lt;/p&gt;

&lt;p&gt;Therefore, this type of SDK gives developers the most significant degree of freedom and can meet almost all the needs of developers.&lt;br&gt;
Aside from implementing business logic, developers need to be responsible for the calling logic of the underlying capabilities. Users with a complete R&amp;amp;D team and particular business logic can choose the ability-based SDK.&lt;/p&gt;

&lt;p&gt;For example &lt;a href="http://www.zegocloud.com/product/voice-call?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;Voice Call SDK&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  There is no best, only the most suitable option
&lt;/h2&gt;

&lt;p&gt;Each type of SDK has various advantages and disadvantages, depending on specific needs.&lt;/p&gt;

&lt;p&gt;Therefore, there is no absolute best SDK but it should be chosen according to what you need.&lt;/p&gt;

&lt;p&gt;Now, let's take the functional Voice Chat SDK and see together a step-by-step guide to building an android voice chat app.&lt;/p&gt;
&lt;h2&gt;
  
  
  Build an android Voice Chat app
&lt;/h2&gt;

&lt;p&gt;We take ZEGOCLOUD's functional &lt;strong&gt;Voice Chat SDK&lt;/strong&gt; Call Kit as an example.&lt;/p&gt;
&lt;h3&gt;
  
  
  1）Integrated SDK
&lt;/h3&gt;

&lt;p&gt;Refers to the &lt;a href="https://docs.zegocloud.com/article/14820?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; to introduce the SDK into the project.&lt;br&gt;
The SDK integration can be completed by displaying the ZegoUIKitPrebuiltCallFragment component to realize the voice chat function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CallActivity&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AppCompatActivity&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Bundle&lt;/span&gt; &lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;setContentView&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;activity_call&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;addCallFragment&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addCallFragment&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;appID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yourAppID&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;appSign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yourAppSign&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;callID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yourCallID&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yourUserID&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yourUserName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;ZegoUIKitPrebuiltCallConfig&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ZegoUIKitPrebuiltCallConfig&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;


        &lt;span class="nc"&gt;ZegoUIKitPrebuiltCallFragment&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ZegoUIKitPrebuiltCallFragment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;appID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;appSign&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userName&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;


        &lt;span class="n"&gt;getSupportFragmentManager&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;beginTransaction&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fragment_container&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;commitNow&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  2) Custom UI
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD's Call Kit provides a wealth of custom interfaces; we only need to configure the parameters according to business requirements.&lt;br&gt;
The configuration items implemented in the example below are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;camera is not turned on by default when entering a call&lt;/li&gt;
&lt;li&gt;the interface displays the audio call page&lt;/li&gt;
&lt;li&gt;the bottom button only displays the microphone, &lt;/li&gt;
&lt;li&gt;hang up&lt;/li&gt;
&lt;li&gt;speaker switch buttons.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="nc"&gt;ZegoUIKitPrebuiltCallConfig&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ZegoUIKitPrebuiltCallConfig&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;turnOnCameraWhenJoining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;audioVideoViewConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showCameraStateOnView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bottomMenuBarConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buttons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;ZegoMenuBarButtonName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TOGGLE_MICROPHONE_BUTTON&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;ZegoMenuBarButtonName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HANG_UP_BUTTON&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;ZegoMenuBarButtonName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SWITCH_AUDIO_OUTPUT_BUTTON&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you are thinking of building a voice chat app, pick up a voice chat SDK and take action.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=31" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, and get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;
&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD" width="322" height="322"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="" width="500" height="502"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/zegocloud/how-to-create-avatar-from-photo-57oa" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How To Create Avatar From Photo&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Sep 6 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;




&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD" width="322" height="322"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="" width="500" height="502"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/zegocloud/how-to-build-a-live-streaming-app-81a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to build a live streaming app?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/davidrelo/how-to-use-video-call-api-to-build-a-live-video-call-app-4k1b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to use video call API to build a live video call app&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jul 25 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>android</category>
      <category>java</category>
      <category>api</category>
      <category>programming</category>
    </item>
    <item>
      <title>Realistic Avatar Creator: the real you in the Virtual World</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Wed, 14 Sep 2022 06:26:10 +0000</pubDate>
      <link>https://dev.to/davidrelo/realistic-avatar-creator-the-real-you-in-the-virtual-world-1mc5</link>
      <guid>https://dev.to/davidrelo/realistic-avatar-creator-the-real-you-in-the-virtual-world-1mc5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;How to provide immersive interaction to customers? Let users become Realistic Avatar Creators . This article will teach you how to build Realistic Avatar system step by step.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nowadays, we can reshape our world by making realistic Avatar to experiment with digital versions of ourselves, crossing the vast Web horizons. We have learned how personalization and versatility are what characterize avatars. The custom avatars have different features: some are realistic, others very imaginative and cartoonish.  But what do users like the most?&lt;/p&gt;

&lt;h2&gt;
  
  
  Making an AVATAR: what do users want?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Realistic Avatar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9s71paytc81htnvymd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9s71paytc81htnvymd1.png" alt="realistic avatar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Realistic avatars allow users to experience their actual life existence on the Internet. One can duplicate itself faithfully with powerful artificial intelligence algorithms and facial recognition technology.&lt;br&gt;
Still, realistic avatars might make users feel constrained to carry their image and reality online, thus losing the freedom that the world wide web permits.&lt;/p&gt;
&lt;h3&gt;
  
  
  2) Realistic Cartoon Avatar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3jl1eixr5fe1v3fpasi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3jl1eixr5fe1v3fpasi.png" alt="realistic cartoon avatar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Realistic cartoon avatars allow users to have their lifelike avatars on the Internet while simultaneously enjoying the fun and creativity that comes with customizing their digital selves. Cartoon characters tend to transmit that sense of freedom and escape from reality that the digital world allows.&lt;/p&gt;
&lt;h3&gt;
  
  
  3) Pixel Avatar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwx8hrzyfb23839q9nqnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwx8hrzyfb23839q9nqnp.png" alt="pixel avatar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of nowadays's top internet users' concerns is privacy. Blockchain technology's diffusion helps overcome this issue, and the use of Pixel Avatar is widespread. Pixel avatars safeguard privacy; however, given their abstract look, users lose the realistic and custom touch experience.&lt;br&gt;
So, each type of avatar has its own advantages and disadvantages. What kind of avatar should we choose?&lt;/p&gt;

&lt;p&gt;The main trend now is to become a realistic avatar creator. The imperative is to make our avatars just like social media profiles!&lt;/p&gt;
&lt;h2&gt;
  
  
  How to be a realistic avatar maker
&lt;/h2&gt;

&lt;p&gt;The Virtual Avatar SDK launched by ZEGOCLOUD allows your users to upload a photo to make a realistic avatar.&lt;br&gt;
This content is only supported in a Lark Docs&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Sr9wnneHqGI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Make an avatar from a photo
&lt;/h3&gt;

&lt;p&gt;Virtual Avatar SDK can quickly analyze avatar features in photos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Extract facial features based on the introduced image.&lt;/span&gt;
&lt;span class="nc"&gt;ZegoFaceFeature&lt;/span&gt; &lt;span class="n"&gt;faceFeature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ZegoAvatarService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInteractEngine&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;detectFaceFeature&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bitmap&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create a ZegoCharacterHelper class to simply the implementation process for API call.&lt;/span&gt;
&lt;span class="c1"&gt;// The absolute path of basic resources.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ZegoCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getFilesDir&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/assets/base.bundle"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 

&lt;span class="c1"&gt;// Set the avatar creation coefficient.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applyFaceFeature&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faceFeature&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Get display view&lt;/span&gt;
&lt;span class="n"&gt;mZegoAvatarView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;zego_avatar_view&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Display the avatar on the screen and call the API on a UI thread.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCharacterView&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mZegoAvatarView&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Beautify and custom your avatar
&lt;/h3&gt;

&lt;p&gt;After obtaining the initial avatar model, we can set various feature &lt;br&gt;
values through the interface to beautify the avatar.&lt;br&gt;
We can adjust Skin tone, Eyebrows, Eyes, Nose, Mouth, Lip, Mouth corner, Chin, Cheek, and more. For detailed parameters, please refer to Development Documentation.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Set the avatar creation coefficient. For the value of faceshapeID, see the following table. Constants defined in ZegoCharacterHelper can be used directly.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setFaceShape&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ZegoCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FACESHAPE_EYE_SIZE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5f&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Outfits and style
&lt;/h3&gt;

&lt;p&gt;Virtual Avatar SDK provides various makeup and accessories such as eyebrows, tattoos, beards, cosmetic contact lenses, glass, earphones, earrings, hair, clothes, pants, shoes, and many others.&lt;br&gt;
Users can render and replace these materials on their avatars in real time, building exclusive images in line with their preferences.&lt;br&gt;
Please refer to Development Documentation.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ensure that the external directory of Packages is set before the API is called.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setExtendPackagePath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getFilesDir&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/assets/Packages"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Set the directory where the makeup, hair, glass, and other resource packages are stored.&lt;/span&gt;

&lt;span class="c1"&gt;// Set the glass. Ensure that the resource already exists in the path specified by setExtendPackagePath.&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;packageID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"earphone7"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// earphone7 is the directory name of an earphone resource. Use the directory name under Packages provided by the ZegoAvatar SDK.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageID&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Speech simulation
&lt;/h3&gt;

&lt;p&gt;We see eye and lip movements when we interact with other people in the real world. The same applies to the metaverse.&lt;br&gt;
The Virtual Avatar SDK of ZEGOCLOUD supports sound-driven mouth movements based on the sound waves of voice. This feature drives a virtual avatar to change its mouth shape in real-time.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Start voice detection.&lt;/span&gt;
&lt;span class="nc"&gt;ZegoAvatarService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInteractEngine&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;startDetectExpression&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ZegoExpressionDetectMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Audio&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Drive mouth shape changes of the virtual avatar.&lt;/span&gt;
    &lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setExpression&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Facial expression mirroring
&lt;/h3&gt;

&lt;p&gt;Non-verbal communication represents a significant part of human communication. According to body language researcher Analysis by Albert Mehrabian, over 55% of communication is non-verbal. Digital avatars should be able to mimic facial expressions in real time and make natural eye contact. &lt;/p&gt;

&lt;p&gt;By displaying people's expressions in real-time, we allow users to interact more naturally in a virtual environment.&lt;/p&gt;

&lt;p&gt;The Virtual Avatar SDK provides the facial expression mirroring feature. This technology captures facial expressions on users' faces based on accurate recognition of face key points and 52 basic facial expression dimensions, including the face, tongue, and eyeball. It restores and renders them on virtual avatars in real-time.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Start facial expression detection.&lt;/span&gt;
&lt;span class="nc"&gt;ZegoAvatarService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInteractEngine&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;startDetectExpression&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ZegoExpressionDetectMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Camera&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="c1"&gt;// Ensure that mCharacterHelper is created, AvatarView is set, and a default avatar is set by running setDefaultAvatar or setAvatarJson.&lt;/span&gt;
    &lt;span class="c1"&gt;// Drive facial expression changes of the virtual avatar.&lt;/span&gt;
     &lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setExpression&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=30" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, and get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;
&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-create-avatar-from-photo-57oa" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How To Create Avatar From Photo&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Sep 6 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;




&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-live-streaming-app-81a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to build a live streaming app?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/how-to-use-video-call-api-to-build-a-live-video-call-app-4k1b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to use video call API to build a live video call app&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jul 25 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/do-you-understand-the-video-api-41gn" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Do you understand the Video API?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 22 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>android</category>
      <category>java</category>
      <category>avatar</category>
      <category>programming</category>
    </item>
    <item>
      <title>How To Create Avatar From Photo</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Tue, 06 Sep 2022 04:13:40 +0000</pubDate>
      <link>https://dev.to/zegocloud/how-to-create-avatar-from-photo-57oa</link>
      <guid>https://dev.to/zegocloud/how-to-create-avatar-from-photo-57oa</guid>
      <description>&lt;h2&gt;
  
  
  What is an AVATAR?
&lt;/h2&gt;

&lt;p&gt;Avatar is &lt;strong&gt;an electronic image representing a computer user&lt;/strong&gt; in the digital world. Major games and social platforms have introduced the virtual character function, in which one can &lt;strong&gt;create an avatar from a photo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea behind the users virtually represented on-screen is driven by the &lt;strong&gt;intention of creating an interactive experience&lt;/strong&gt;. This way, people enjoy the content immersively and tend to be more conscious of the game's ethical questions. The same principle now applies to social media.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avatar Market Outlook
&lt;/h2&gt;

&lt;p&gt;Technological advancement improves mobile phone performance, network bandwidth, screen rendering, and other capabilities. Users have, therefore, &lt;strong&gt;higher expectations in their pursuit of immersive experiences&lt;/strong&gt;. Virtual avatars and metaverse-related applications receive more attention.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://www.alliedmarketresearch.com/metaverse-market-A16423" rel="noopener noreferrer"&gt;Allied Market Research&lt;/a&gt;, &lt;strong&gt;the global metaverse market was worth $41.9 billion in 2020 and will reach $1,237 billion by 2030&lt;/strong&gt;. &lt;br&gt;
The compound annual growth rate from 2021 to 2030 is 40.4%.&lt;/p&gt;

&lt;p&gt;How do we join the metaverse industry and seize the market in such a rapidly developing emerging market?&lt;/p&gt;
&lt;h2&gt;
  
  
  Make avatar from photo
&lt;/h2&gt;

&lt;p&gt;Facebook, Reddit, Youtube, and other social media have launched the 3D Avatar function. Let users become avatar photo creators.&lt;/p&gt;

&lt;p&gt;Let's explore &lt;strong&gt;how to quickly integrate the function of creating avatars from a photo in your application&lt;/strong&gt; so that your customers can have their avatars to enjoy their interactive experience fully. &lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.zegocloud.com/product/avatar?_source=dev&amp;amp;article=29" rel="noopener noreferrer"&gt;ZEGOAvatar SDK&lt;/a&gt; launched by &lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt; allows you to create your metaverse application quickly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Create a virtual avatar in three steps
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1) Get avatar data from photo
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Extract facial features based on the introduced image.&lt;/span&gt;
&lt;span class="nc"&gt;ZegoFaceFeature&lt;/span&gt; &lt;span class="n"&gt;faceFeature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ZegoAvatarService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInteractEngine&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;detectFaceFeature&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bitmap&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  2) Set a virtual avatar data
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create a ZegoCharacterHelper class to simply the implementation process for API call.&lt;/span&gt;
&lt;span class="c1"&gt;// The absolute path of basic resources.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ZegoCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getFilesDir&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/assets/base.bundle"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 

&lt;span class="c1"&gt;// Set the avatar creation coefficient.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applyFaceFeature&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faceFeature&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h5&gt;
  
  
  3) Render the virtual avatar
&lt;/h5&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Get display view&lt;/span&gt;
&lt;span class="n"&gt;mZegoAvatarView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;zego_avatar_view&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Display the avatar on the screen and call the API on a UI thread.&lt;/span&gt;
&lt;span class="n"&gt;mCharacterHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCharacterView&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mZegoAvatarView&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Make the app experience more realistic
&lt;/h2&gt;

&lt;p&gt;The metaverse doesn't apply only to virtual avatars. It extends to outfits, actions, images, expressions, etc. of real people. Together with the virtual scenes, it makes the metaverse world. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOAvatar SDK realizes the connection between virtual and real through AI&lt;/strong&gt;, being able to smoothly replicate the natural expressions and emotions of characters.&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Facial expression mirroring
&lt;/h3&gt;

&lt;p&gt;Capture and mirror the user's facial expressions to their avatar in real-time. The avatar mimics the same expressions as the user in real-time.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/OJT8eitn5fM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Speech simulation
&lt;/h3&gt;

&lt;p&gt;Capture the user's speech to drive the avatar's facial and mouth movements in real-time. &lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ZAIspawAaFY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Gesture recognition
&lt;/h3&gt;

&lt;p&gt;Recognize the hand gestures of the user and control the avatar to perform the movements and facial expressions.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4MamlSS91x8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Body pose recognition
&lt;/h3&gt;

&lt;p&gt;Recognize the body poses of the user and control the avatar to perform the movements and facial expressions.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lqJCTMOc9S4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/talk?_source=dev&amp;amp;article=29" rel="noopener noreferrer"&gt;Join us&lt;/a&gt; now and &lt;strong&gt;create your Avatar from photos&lt;/strong&gt; with ZEGOAvatar SDK!&lt;/p&gt;




&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=29" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, and get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-live-streaming-app-81a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to build a live streaming app?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/how-to-use-video-call-api-to-build-a-live-video-call-app-4k1b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to use video call API to build a live video call app&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jul 25 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/do-you-understand-the-video-api-41gn" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Do you understand the Video API?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 22 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-implement-a-video-call-app-using-ios-callkit-and-zegocloud-478g" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to implement a video call app using iOS CallKit and ZEGOCLOUD&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 8 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>android</category>
      <category>java</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Embed Video Call on Website with Prebuilt SDK</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Thu, 11 Aug 2022 10:53:00 +0000</pubDate>
      <link>https://dev.to/zegocloud/embed-video-call-on-website-with-prebuilt-sdk-29ei</link>
      <guid>https://dev.to/zegocloud/embed-video-call-on-website-with-prebuilt-sdk-29ei</guid>
      <description>&lt;p&gt;This article will introduce how to embed Video Call into your website using the Prebuilt SDK with two lines of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video call function: how to implement it?
&lt;/h2&gt;

&lt;p&gt;Information transmission has evolved from text to pictures and now to video.&lt;/p&gt;

&lt;p&gt;Video calls are becoming more and more a necessary feature for applications.&lt;/p&gt;

&lt;p&gt;From IM, dating, and meetings to live streaming and education, applications in all walks of life will integrate the video call function.&lt;/p&gt;

&lt;p&gt;For this function to be implemented, If you don't use the prebuilt SDK, there are some complex tasks to accomplish. For instance:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interactive interface development&lt;/strong&gt; - Although the video call has only one page, there are various interactive buttons; each button has multiple states, that can be switched in different ways, rendering the interactive interface quite hard to handle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audio and video management&lt;/strong&gt; - Audio and video management require a lot of testing and verification to ensure the stability of calls, such as different platforms, devices, system versions, and network environments which all need to be targeted. It's a time-consuming effort.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User permissions, call status, and other business-related&lt;/strong&gt; - includes camera and microphone switch permissions, call permissions, call duration, hang up, waiting, and call status. These states seem simple, but since each of them has multiple modification paths, the logic underpinning a correct state is complex. For example, if the call is 'hung up', there can be 'active hang-up', 'passive hang-up', network 'error hang-up', 'insufficient quota', etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not every team can invest a lot of workforce in solving this heavy R&amp;amp;D work, yet Video Call is an essential product function. The solution is to use the Prebuilt SDK to implement the Video Call function quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the Prebuilt SDK?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Video Call Prebuilt SDK sorts out the personalized interface and interaction in Video Calls by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;abstracting the standard functions and logic in Video Call&lt;/li&gt;
&lt;li&gt;encapsulating these standardized functions and logic in the Prebuilt SDK.&lt;/li&gt;
&lt;li&gt;integrating personalized interfaces and interactions into configuration items.
Users only need two lines of code to implement the Video Call function; personalized interface and interaction can be achieved through item configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ZEGOCLOUD Prebuilt web SDK
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD Prebuilt SDK is a set of standard solutions sorted out from the integration process of thousands of customers in Video Call customers.&lt;/p&gt;

&lt;p&gt;Based on ensuring the high encapsulation of the Video Call function, this solution provides a concise configuration file, which is convenient for users to build and configure flexibly quickly.&lt;/p&gt;

&lt;p&gt;Using the ZEGOCLOUD Prebuilt SDK enables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An out-of-the-box video chat interface&lt;/li&gt;
&lt;li&gt;Built-in bandwidth management&lt;/li&gt;
&lt;li&gt;Cross-browser compatibility&lt;/li&gt;
&lt;li&gt;Text chat&lt;/li&gt;
&lt;li&gt;Participant list&lt;/li&gt;
&lt;li&gt;Network quality monitoring&lt;/li&gt;
&lt;li&gt;Recording&lt;/li&gt;
&lt;li&gt;Call Invitation&lt;/li&gt;
&lt;li&gt;Customizable branding LOGO&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step-by-step guide: embed ZEGOCLOUD Prebuilt
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Register an account
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Create an account&lt;/strong&gt; in &lt;a href="https://www.zegocloud.com/account/signup?_source=dev&amp;amp;article=28" rel="noopener noreferrer"&gt;ZEGOCLOUD Official&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F08%2F10%2F16508858112630.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F08%2F10%2F16508858112630.gif" alt="create an account"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a project&lt;/strong&gt; in &lt;a href="https://console.zegocloud.com?_source=dev&amp;amp;article=28" rel="noopener noreferrer"&gt;ZEGOCLOUD Admin Console&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F08%2F10%2F16508858234388.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F08%2F10%2F16508858234388.gif" alt="creata a project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Two lines of code complete the access
&lt;/h3&gt;

&lt;p&gt;ZEGOCLOUD's prebuilt SDK only needs two lines of code to complete SDK access.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call the &lt;code&gt;init&lt;/code&gt; interface to complete the SDK initialization.&lt;/li&gt;
&lt;li&gt;Call the &lt;code&gt;joinRoom&lt;/code&gt; interface to join the audio and video call.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="nf"&gt;#root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;crossorigin&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://zegocloud.github.io/zegocloud_prebuilt_webrtc/ZegoPrebuilt/index.umd.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// need to generate TOKEN first&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prebuilt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ZegoPrebuilt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;TOKEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;prebuilt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;joinRoom&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
         &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Custom prebuilt UI
&lt;/h3&gt;

&lt;p&gt;ZEGOCLOUD's prebuilt SDK provides a concise configuration file, which is convenient for you to build and configure flexibly quickly.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="nx"&gt;prebuilt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;joinRoom&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Mount the container, which fills the entire screen by default&lt;/span&gt;
        &lt;span class="na"&gt;joinScreen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether to display the device detection page, default display&lt;/span&gt;
          &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Join Room&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Device detection page title, default Join Room&lt;/span&gt;
          &lt;span class="nl"&gt;inviteURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://zegocloud.github.io/zegocloud_prebuilt_webrtc/build/index.html?RoomID=test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Invite link, not displayed by default&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nl"&gt;micEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether to enable your own microphone, it is enabled by default&lt;/span&gt;
        &lt;span class="nl"&gt;cameraEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether to open your own camera, open by default&lt;/span&gt;
        &lt;span class="nl"&gt;userCanToggleSelfCamera&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether you can control your own microphone, enabled by default&lt;/span&gt;
        &lt;span class="nl"&gt;userCanToggleSelfMic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether you can control the body's own camera, enabled by default&lt;/span&gt;
        &lt;span class="nl"&gt;deviceSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether to display audio settings, default display&lt;/span&gt;
        &lt;span class="nl"&gt;chatEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether to enable chat, enabled by default&lt;/span&gt;
        &lt;span class="nl"&gt;userListEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Whether to display the member list, the default display&lt;/span&gt;
        &lt;span class="nl"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// message notification in the lower left corner of the video&lt;/span&gt;
          &lt;span class="na"&gt;userOnlineOfflineTips&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Whether to display member in and out, default display&lt;/span&gt;
          &lt;span class="nl"&gt;unreadMessageTips&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Whether to display unread messages, default display&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nl"&gt;leaveRoomCallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// leave the room callback&lt;/span&gt;
        &lt;span class="nl"&gt;branding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;logoURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.zegocloud.com/_nuxt/img/zegocloud_logo_white.ddbab9f.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Brand logo in the upper left corner, not displayed by default&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nl"&gt;leftScreen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// leave the room page, default is&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Run the demo
&lt;/h2&gt;

&lt;p&gt;Try a live demo: &lt;a href="https://zegocloud.github.io/zegocloud_prebuilt_webrtc/build/index.html" rel="noopener noreferrer"&gt;See a live demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F08%2F10%2Fdemo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F08%2F10%2Fdemo.gif" alt="Prebuilt Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn more about &lt;a href="https://docs.zegocloud.com/article/14728?_source=dev&amp;amp;article=28" rel="noopener noreferrer"&gt;ZEGOCLOUD's Prebuilt SDK&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=28" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, and get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;
&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-live-streaming-app-81a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to build a live streaming app?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;




&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/how-to-use-video-call-api-to-build-a-live-video-call-app-4k1b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to use video call API to build a live video call app&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jul 25 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/do-you-understand-the-video-api-41gn" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Do you understand the Video API?&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 22 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-implement-a-video-call-app-using-ios-callkit-and-zegocloud-478g" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to implement a video call app using iOS CallKit and ZEGOCLOUD&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 8 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>webrtc</category>
    </item>
    <item>
      <title>How to build a live streaming app?</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Fri, 29 Jul 2022 08:18:00 +0000</pubDate>
      <link>https://dev.to/zegocloud/how-to-build-a-live-streaming-app-81a</link>
      <guid>https://dev.to/zegocloud/how-to-build-a-live-streaming-app-81a</guid>
      <description>&lt;h2&gt;
  
  
  What is a Live Streaming App?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/product/live-streaming"&gt;Live streaming&lt;/a&gt; technology allows you to broadcast, watch, create and share videos in real-time. All you need to be able to live stream is an internet-enabled device, like a smartphone or tablet, and a platform (such as a website or app) to live stream.&lt;/p&gt;

&lt;p&gt;Live streaming apps are rapidly developing, given this trend's tremendous opportunities in many fields. Depending on the domain, the basic requirements for building a live streaming app differ as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Game live streaming app&lt;/strong&gt; - The picture must be clear and smooth to construct a game live streaming app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entertainment live streaming app&lt;/strong&gt; - Building an entertainment app requires various interactive functions such as gifts, barrage, and mini-games.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shopping live streaming app&lt;/strong&gt; - It must provide functions such as shopping cart and live broadcast playback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sports live streaming app&lt;/strong&gt; - It is necessary to ensure a clear and smooth picture and provide a variety of resolutions for users to choose from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Educational live streaming app&lt;/strong&gt; - Interactive whiteboard, file sharing, screen sharing, and other functions are essential to delivering the best teaching experience to students. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Must-Have Features Of a Live Streaming app
&lt;/h2&gt;

&lt;p&gt;Despite the differences, there are some standard functions that all live streaming apps should have, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client join/sign-in&lt;/strong&gt; - A straightforward enrollment structure for the clients to make a record and sign in to the application with the certification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search&lt;/strong&gt; -  A search box allowing users to search content by topic, popularity, trending, channel, location, or interests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client profile&lt;/strong&gt; - Show the client's data and profile picture to companions and subscribers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live streaming&lt;/strong&gt; - The app's core permits the client to record and communicate a live stream to individuals who subscribe to their channel or the public.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chats&lt;/strong&gt; - Adding a chat function helps the host communicate with the audience in real-time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com"&gt;Building a live streaming app&lt;/a&gt; in different fields will require integrating some unique features. Relevant examples are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Screen Sharing&lt;/strong&gt; - For a game live streaming app, you must share the game screen with the audience through the screen sharing function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Host PK&lt;/strong&gt; - Required for the entertainment live streaming apps. Through the PK between anchors, one can enrich the content of the live streaming app, enhancing the audience's enthusiasm by sending gifts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shopping Cart&lt;/strong&gt; - The live shopping streaming app provides a shopping portal for viewers to place orders and purchase products directly in the live streaming room.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Share whiteboard or file&lt;/strong&gt; - The education live streaming app must share various teaching courseware, so providing functions such as shared whiteboard and transferred files to enrich the teaching form is necessary.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is a Live Streaming SDK?
&lt;/h2&gt;

&lt;p&gt;The Live Streaming App is complex, especially if each function is self-developed. It requires a vast technical team and consumes many human and financial resources.&lt;/p&gt;

&lt;p&gt;Many companies encapsulate the standard functions of Live Streaming apps into SDK, thus, developing a Live Streaming app only needs to focus on business interaction development.&lt;/p&gt;

&lt;p&gt;Among these functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.zegocloud.com/product/live-streaming?_source=dev&amp;amp;article=26"&gt;Express SDK&lt;/a&gt;&lt;/strong&gt; - Audio and video transmission service SDK encapsulates audio and video capture, preprocessing, encoding, transmission, decoding, rendering, and so on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.zegocloud.com/product/in-app-chat?_source=dev&amp;amp;article=26"&gt;ZIM SDK&lt;/a&gt;&lt;/strong&gt; - Message communication SDK, which encapsulates the transmission, and broadcasting of text messages, picture messages, video messages, and other messages, ability to notify.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.zegocloud.com/product/super-board?_source=dev&amp;amp;article=26"&gt;SuperBoard SDK&lt;/a&gt;&lt;/strong&gt; - Encapsulates interactive whiteboard, file management, file rendering, and other capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.zegocloud.com/solutions/education?_source=dev&amp;amp;article=26"&gt;RoomKit SDK&lt;/a&gt;&lt;/strong&gt; - Encapsulates a complete educational scene, including audio and video calls, barrage messages, shared whiteboards, shared files, equipment management, student management and other teaching scene logic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Steps to Build a Live Streaming App
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before you begin, make sure you complete the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a project in &lt;a href="https://console.zegocloud.com?_source=dev&amp;amp;article=26"&gt;ZEGOCLOUD Console&lt;/a&gt;, and get the AppID of your project.&lt;/li&gt;
&lt;li&gt;The ZEGO Express SDK has been integrated into the project. For details, see &lt;a href="https://docs.zegocloud.com/article/7942?_source=dev&amp;amp;article=26"&gt;Integration&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation process
&lt;/h3&gt;

&lt;p&gt;The following diagram shows the basic process of User A playing a stream published by User B: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s6EZRSM7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/29/16589145548257.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s6EZRSM7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/29/16589145548257.png" alt="process of playing a stream" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The following sections explain each step of this process in more detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a ZegoExpressEngine instance
&lt;/h3&gt;

&lt;p&gt;To create a singleton instance of the &lt;code&gt;ZegoExpressEngine&lt;/code&gt; class, call the &lt;code&gt;createEngine&lt;/code&gt; method with the &lt;strong&gt;AppID&lt;/strong&gt; of your project.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Login to a room
&lt;/h3&gt;

&lt;p&gt;To log in to a room, call the &lt;code&gt;loginRoom&lt;/code&gt; method.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Then, to listen for and handle various events that may happen after logging in to a room, you can implement the corresponding event callback methods of the event handler as needed. The following are some common event callbacks related to room users and streams:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Start the local video preview
&lt;/h3&gt;

&lt;p&gt;To start the local video preview,  call the &lt;code&gt;startPreview&lt;/code&gt; method with the view for rendering the local video passed to the &lt;code&gt;canvas&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;You can use a &lt;code&gt;SurfaceView&lt;/code&gt;, &lt;code&gt;TextureView&lt;/code&gt;, or &lt;code&gt;SurfaceTexture&lt;/code&gt; to render the video.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Publish streams
&lt;/h3&gt;

&lt;p&gt;To start publishing a local audio or video stream to remote users, call the &lt;code&gt;startPublishingStream&lt;/code&gt; method with the corresponding Stream ID passed to the &lt;code&gt;streamID&lt;/code&gt; parameter.     &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Then, to listen for and handle various events that may happen after stream publishing starts, you can implement the corresponding event callback methods of the event handler as needed. The following is a common event callback related to stream publishing:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Play streams
&lt;/h3&gt;

&lt;p&gt;To start playing a remote audio or video stream, call the &lt;code&gt;startPlayingStream&lt;/code&gt; method with the corresponding Stream ID passed to the &lt;code&gt;streamID&lt;/code&gt; parameter and the view for rendering the video passed to the &lt;code&gt;canvas&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;You can obtain the stream IDs of the streams published by other users in the room from the callback &lt;code&gt;onRoomStreamUpdate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can use a &lt;code&gt;SurfaceView&lt;/code&gt;, &lt;code&gt;TextureView&lt;/code&gt;, or &lt;code&gt;SurfaceTexture&lt;/code&gt; to render the video.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Stop publishing and playing streams
&lt;/h3&gt;

&lt;p&gt;To stop publishing a local audio or video stream to remote users, call the &lt;code&gt;stopPublishingStream&lt;/code&gt; method.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;If local video preview is started, call the &lt;code&gt;stopPreview&lt;/code&gt; method to stop it as needed.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;To stop playing a remote audio or video stream, call the &lt;code&gt;stopPlayingStream&lt;/code&gt; method with the corresponding stream ID passed to the &lt;code&gt;streamID&lt;/code&gt; parameter.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Log out of a room
&lt;/h3&gt;

&lt;p&gt;To log out of a room, call the &lt;code&gt;logoutRoom&lt;/code&gt; method with the corresponding room ID passed to the &lt;code&gt;roomID&lt;/code&gt; parameter.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Destroy the &lt;code&gt;ZegoExpressEngine&lt;/code&gt; instance
&lt;/h3&gt;

&lt;p&gt;To destroy the &lt;code&gt;ZegoExpressEngine&lt;/code&gt; instance and release the resources it occupies, call the &lt;code&gt;destroyEngine&lt;/code&gt; method.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  API call sequence diagram
&lt;/h3&gt;

&lt;p&gt;The following diagram shows the API call sequence of the stream publishing and playing process: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n3YKzlzT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/29/16589152502137.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n3YKzlzT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/29/16589152502137.png" alt="API call sequence" width="800" height="702"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=26"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, and get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rbbCt7zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--_hBOcEXv--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/organization/profile_image/5598/20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD" width="150" height="150"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="" width="150" height="150"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-clubhouse-clone-app-with-android-and-zegocloud-a-social-audio-app-development-2pod" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to Build a Clubhouse Clone App with Android and ZEGOCLOUD - A Social Audio App Development&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jun 29 '22 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/movies-together-online-in-a-few-hours-source-code-inside-40o0" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Built an App to Watch Movies Together Online in a Few Hours (source code inside)&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Mar 11 '22 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#video&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#twilio&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/improve-live-streaming-experience-with-stream-mixing-345o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Improve live streaming experience with stream mixing&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jun 21 '22 ・ 4 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rbbCt7zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--_hBOcEXv--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/organization/profile_image/5598/20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD" width="150" height="150"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="" width="150" height="150"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-implement-a-video-call-app-using-ios-callkit-and-zegocloud-478g" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to implement a video call app using iOS CallKit and ZEGOCLOUD&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 8 '22 ・ 5 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>java</category>
      <category>android</category>
      <category>mobile</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to use video call API to build a live video call app</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Mon, 25 Jul 2022 12:07:33 +0000</pubDate>
      <link>https://dev.to/davidrelo/how-to-use-video-call-api-to-build-a-live-video-call-app-4k1b</link>
      <guid>https://dev.to/davidrelo/how-to-use-video-call-api-to-build-a-live-video-call-app-4k1b</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;With the continuous improvement of device performance and network quality, more and more audio and video call scenarios have been applied, and video call API has also been applied more and more.&lt;/p&gt;

&lt;p&gt;What capabilities can the video call API provide?&lt;/p&gt;

&lt;p&gt;With the increasing demand for video call API, there are more and more companies providing video call API, but the functions provided are similar.&lt;/p&gt;

&lt;p&gt;The capabilities provided by the video call API mainly include the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call invitation&lt;/li&gt;
&lt;li&gt;Voice and Video call&lt;/li&gt;
&lt;li&gt;Offline push function&lt;/li&gt;
&lt;li&gt;Call UI and interaction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Below is a live video call app built using ZEGOCLOUD's video call API.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2Fcalluikit96010fps.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2Fcalluikit96010fps.gif" alt="video call API demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is ZEGOCLOUD's video call API?
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD's video call API uses a layered architecture. Details are as shown in the figure below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16507993587607.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16507993587607.png" alt="video call API architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD's video call API provides two different SDKs for you: the &lt;code&gt;CallUIKit&lt;/code&gt; and the &lt;code&gt;Call SDK&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CallUIKit&lt;/code&gt;: Provide a complete live video call UI, you only need to call the call interface and hang up the interface where you need to complete the call process.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Call SDK&lt;/code&gt;: Provides the underlying logic of live video calls, such as audio and video management, call management, network status management, etc. You only need to focus on the implementation of the upper-layer custom UI and call the corresponding interactive interface to complete the call process.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to use ZEGOCLOUD's Video call API
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1. Create a ZEGOCLOUD account
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create an account in &lt;a href="https://www.zegocloud.com/account/signup?_source=dev&amp;amp;article=25" rel="noopener noreferrer"&gt;ZEGOCLOUD Official&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16508858112630.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16508858112630.gif" alt="create an account"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2. Create a new project
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a project in &lt;a href="https://console.zegocloud.com?_source=dev&amp;amp;article=25" rel="noopener noreferrer"&gt;ZEGOCLOUD Admin Console&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16508858234388.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16508858234388.gif" alt="creata a project"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3. Create a Firebase project
&lt;/h3&gt;

&lt;p&gt;Create a Firebase project in the &lt;a href="https://console.firebase.google.com/" rel="noopener noreferrer"&gt;Firebase console&lt;/a&gt;. For more details, see &lt;a href="https://firebase.google.com/docs/functions/get-started" rel="noopener noreferrer"&gt;Firebase Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16508878183242.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16508878183242.gif" alt="create firebase"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4. Deploy the Firebase Cloud Functions
&lt;/h3&gt;

&lt;p&gt;ZEGO Call uses the Firebase Cloud Functions as the business server by default, we recommend you activate and deploy it before integrating the ZEGOCall SDK.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new Realtime Database in Firebase. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509539597267.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509539597267.gif" alt="create firebase"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Edit the rules of the Realtime Database by adding the following:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".read"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth.uid != null"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".write"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth.uid != null"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509540888361.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509540888361.jpg" alt="Edit the rules"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install the CLI via npm.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g firebase-tools
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509597070259.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509597070259.gif" alt="Install the CLI"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Run the &lt;code&gt;firebase login&lt;/code&gt; to log in via the browser and authenticate the firebase tool.&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509597756605.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509597756605.gif" alt="firebase login"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Run &lt;code&gt;firebase init functions&lt;/code&gt;. The tool gives you an option to install dependencies with npm. It is safe to decline if you want to manage dependencies in another way, though if you do decline you'll need to run npm install before emulating or deploying your functions.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509598453979.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509598453979.gif" alt="init functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Download the &lt;a href="https://github.com/ZEGOCLOUD/call_firebase_funcitons" rel="noopener noreferrer"&gt;Cloud function sample code&lt;/a&gt;. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509598698059.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509598698059.gif" alt="Download file"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy the &lt;code&gt;firebase.json&lt;/code&gt;, &lt;code&gt;functions\index.js&lt;/code&gt; files and &lt;code&gt;functions\token04&lt;/code&gt; folder in the sample code to your cloud function project, overwrite files with the same name.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509602283059.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509602283059.jpg" alt="copy file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509599977538.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509599977538.gif" alt="copy file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Modify the &lt;code&gt;index.js&lt;/code&gt; file, fill in the AppID and ServerSecret you get from &lt;a href="https://console.zegocloud.com?_source=dev&amp;amp;article=25" rel="noopener noreferrer"&gt;ZEGOCLOUD Admin Console&lt;/a&gt; correctly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509600852118.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509600852118.gif" alt="write appID"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Firebase CLI, run the &lt;code&gt;firebase deploy --only functions&lt;/code&gt; command to deploy the cloud functions. 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16509614647425.jpg" alt="deploy the cloud functions"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 5. Copy file into the project
&lt;/h3&gt;

&lt;p&gt;To integrate the ZEGOCallUIKit automatically with CocoaPods, do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Download the &lt;a href="https://codestore.zegocloud.com/project/2" rel="noopener noreferrer"&gt;Sample codes&lt;/a&gt;, and copy the &lt;code&gt;ZEGOCallUIKit&lt;/code&gt; and &lt;code&gt;ZEGOCall&lt;/code&gt; folders to your project directory (if you have no project, create a new one). &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2Faddcalluikit.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2Faddcalluikit.gif" alt="AddCallUIKit"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Terminal, navigate to your project directory, run the &lt;code&gt;pod init&lt;/code&gt; command to create a &lt;code&gt;Podfile&lt;/code&gt;, and then add the following to the file.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pod 'ZegoExpressEngine'

pod 'FirebaseAuth'
pod 'GoogleSignIn'
pod 'Firebase/Database'
pod 'Firebase/Analytics'
pod 'Firebase/Crashlytics'
pod 'Firebase/Messaging'
pod 'Firebase/Functions'
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511987175740.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511987175740.png" alt="pod install"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In Terminal, navigate to the directory where the Podfile locates, and run the &lt;code&gt;pod install&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pod install
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restart the Xcode, and open the newly generated .workspace file.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 6. Add permissions
&lt;/h3&gt;

&lt;p&gt;Permissions can be set as needed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Xcode, select the target object, and then click &lt;strong&gt;Info &amp;gt; Custom iOS Target Properties&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511988964502.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511988964502.png" alt="Add permissions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Add button (+)&lt;/strong&gt; to add camera and microphone permissions.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Privacy-Camera Usage Description&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Privacy-Microphone Usage Description&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989087665.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989087665.png" alt="Add permissions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select the target project, select &lt;strong&gt;Sign&amp;amp;Capabilities &amp;gt; Capability&lt;/strong&gt;, search for &lt;strong&gt;Background Modes&lt;/strong&gt; and make a double click. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989209243.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989209243.png" alt="Background Modes"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the following options in &lt;strong&gt;Background Modes&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989320090.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989320090.png" alt="Background Modes"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the &lt;strong&gt;Push Notification&lt;/strong&gt; feature. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989408120.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511989408120.png" alt="Background Modes"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Download the config file &lt;strong&gt;GoogleService-Info.plist&lt;/strong&gt; of firebase, and add it to your project. To get the config file, refer to &lt;a href="https://firebase.google.com/docs/ios/setup#add-config-file" rel="noopener noreferrer"&gt;How to get the config file?&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991049936.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991049936.png" alt="add GoogleService-Info.plist"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991135668.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991135668.png" alt="add GoogleService-Info.plist"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set up the &lt;strong&gt;URL Types&lt;/strong&gt;: Fill in the &lt;strong&gt;URL Schemes&lt;/strong&gt; with the &lt;strong&gt;REVERSED_CLIENT_ID&lt;/strong&gt; field in the &lt;strong&gt;GoogleService-Info.plist&lt;/strong&gt; file. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991392424.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991392424.png" alt="set up URL Types"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Initialize the ZEGOCallUIKit
&lt;/h2&gt;

&lt;p&gt;To initialize the ZEGOCallUIKit, get the &lt;code&gt;CallManager&lt;/code&gt; instance, pass the AppID of your project. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;To receive callbacks, set the corresponding &lt;code&gt;delegate&lt;/code&gt; to &lt;code&gt;self&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  User login
&lt;/h2&gt;

&lt;p&gt;ZEGO Call does not provide user management capabilities yet. You will need to have users log in to Firebase and then call the &lt;code&gt;setLocalUser&lt;/code&gt; method to set user information to CallUIKit based on the login result.&lt;/p&gt;

&lt;p&gt;Firebase provides multiple login authentication modes. The following uses Google login as an example.&lt;br&gt;
For more modes, refer to the &lt;a href="https://firebase.google.com/docs/auth/where-to-start" rel="noopener noreferrer"&gt;Firebase official&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Get a Token
&lt;/h2&gt;

&lt;p&gt;ZEGO Call implements the voice and video call feature using the RTC SDK. The caller and called user join the same room and the stream publishing and stream playing start upon the call gets connected. Therefore, to make an outbound call, you will need to provide a token for the RTC SDK for validation. For details, see Use Tokens for authentication. &lt;/p&gt;

&lt;p&gt;Before making or accepting an outbound call, you will need to get a Token from the Firebase Cloud Functions.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;To set a Token to the token property of the &lt;code&gt;CallManager&lt;/code&gt;, implement the agent-owned callback &lt;code&gt;getRTCToken&lt;/code&gt; of the &lt;code&gt;TokenProvider&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Make outbound calls
&lt;/h2&gt;

&lt;p&gt;To make an outbound voice call, call the &lt;code&gt;callUser&lt;/code&gt; method and set the &lt;code&gt;type&lt;/code&gt; parameter to &lt;code&gt;CallType.voice&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;To make an outbound video call, call the &lt;code&gt;callUser&lt;/code&gt; method and set the &lt;code&gt;type&lt;/code&gt; parameter to &lt;code&gt;CallType.video&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;After making a call, the CallUIKit shows the UI of the current state automatically for both the callee and caller (integrated the CallUIKit is required), and, you can operate on the UI for further operations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The following displays when the caller calls the method to make a call (make a voice call for illustration)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991618968.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991618968.png" alt="call ui"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The following black pop-up prompts when the callee receives an incoming call (make a voice call for illustration)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991916576.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F25%2F16511991916576.png" alt="incoming call ui"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Upload logs
&lt;/h2&gt;

&lt;p&gt;When you encounter problems when using your app, call the &lt;code&gt;uploadLog&lt;/code&gt;  method to upload logs for us to locate and help you faster.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Deinitialize the ZEGOCallUIKit
&lt;/h2&gt;

&lt;p&gt;After finishing using the ZEGO Call, call the &lt;code&gt;unInit&lt;/code&gt; method to deinitialize the SDK. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


</description>
      <category>ios</category>
      <category>mobile</category>
      <category>api</category>
      <category>programming</category>
    </item>
    <item>
      <title>Do you understand the Video API?</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Fri, 22 Jul 2022 02:10:00 +0000</pubDate>
      <link>https://dev.to/zegocloud/do-you-understand-the-video-api-41gn</link>
      <guid>https://dev.to/zegocloud/do-you-understand-the-video-api-41gn</guid>
      <description>&lt;h2&gt;
  
  
  What is video API?
&lt;/h2&gt;

&lt;p&gt;Video API is an interface dedicated to providing audio and video transmission services, mainly divided into two types: &lt;a href="https://developers.google.com/youtube/iframe_api_reference" rel="noopener noreferrer"&gt;static video API&lt;/a&gt; and &lt;a href="https://docs.zegocloud.com/article/5542?_source=dev&amp;amp;article=24" rel="noopener noreferrer"&gt;live video API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static Video API&lt;/strong&gt;&lt;br&gt;
Static Video API is an API that provides video file play services. Service providers offer video file cloud storage and &lt;a href="https://www.cloudflare.com/learning/cdn/what-is-a-cdn/" rel="noopener noreferrer"&gt;CDN&lt;/a&gt; distribution services and provide video services through protocol interfaces such as HTTP and &lt;a href="https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol" rel="noopener noreferrer"&gt;RTMP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, YouTube and Instagram use Static Video API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Video API&lt;/strong&gt;&lt;br&gt;
For example, Live.me, Yalla, and Uplive use the &lt;a href="https://www.zegocloud.com/product/video-call" rel="noopener noreferrer"&gt;Live Video API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The static video API is easy to understand and pulls video files from the cloud through the streaming protocol.&lt;/p&gt;

&lt;p&gt;The live video API is more complicated. How does it ensure the video can be transmitted to the other end quickly, smoothly, and clearly?&lt;/p&gt;

&lt;p&gt;In this article, we will introduce the logic behind the live video API in detail.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Can The Video API Do?
&lt;/h2&gt;

&lt;p&gt;The live video API application is becoming more extensive with the continuous improvement of network bandwidth and device performance. It makes many scenarios possible, such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Live&lt;/li&gt;
&lt;li&gt;Online education&lt;/li&gt;
&lt;li&gt;Video conferencing&lt;/li&gt;
&lt;li&gt;Telemedicine&lt;/li&gt;
&lt;li&gt;Video calls&lt;/li&gt;
&lt;li&gt;Multiplayer&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  What Happens After The Video API?
&lt;/h2&gt;

&lt;p&gt;For the live video API, it is necessary to ensure that the video data can complete the end-to-end transmission within 500ms and, simultaneously, guarantee the clarity of the video picture and the flow of the call.&lt;/p&gt;

&lt;p&gt;Therefore, the live video API needs to ensure that the audio and video data can realize end-to-end data transmission in a fast, large and stable manner. A complex system is required to ensure the availability of the live video API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2Fvideo-api.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2Fvideo-api.jpg" alt="Video API composition"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As shown in the figure, the live video API mainly layered the functions of 6 modules:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2Fvideo-api-processing-flow.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2Fvideo-api-processing-flow.jpg" alt="video API processing flow"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Audio and video capture
&lt;/h3&gt;

&lt;p&gt;Audio and video capture is the source of audio and video data collected via cameras, microphones, screens, video files, recording files, and other channels.&lt;/p&gt;

&lt;p&gt;It involves using color spaces, such as &lt;a href="https://en.wikipedia.org/wiki/RGB_color_model" rel="noopener noreferrer"&gt;RGB&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/YUV" rel="noopener noreferrer"&gt;YUV&lt;/a&gt;, and extracting audio features, such as sampling rate, number of channels, bit rate, audio frame, etc.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Audio and video preprocessing
&lt;/h3&gt;

&lt;p&gt;The audio and video preprocessing are mainly for business scenarios, and the collected data is processed once and again to optimize the customer experience.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video data processing for beauty, filters, special effects, etc.&lt;/li&gt;
&lt;li&gt;Audio data processing includes voice change, reverberation, echo cancellation, noise suppression, volume gain, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Audio and video encoding
&lt;/h3&gt;

&lt;p&gt;Audio and video coding ensures that audio and video data can be transmitted quickly and safely on the network.&lt;/p&gt;

&lt;p&gt;Commonly used encoding formats are Video encoding format: &lt;a href="https://www.itu.int/rec/T-REC-H.264" rel="noopener noreferrer"&gt;H264&lt;/a&gt;, &lt;a href="https://www.itu.int/rec/T-REC-H.265" rel="noopener noreferrer"&gt;H265&lt;/a&gt; Audio coding format: OPUS, AAC.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Audio and video transmission
&lt;/h3&gt;

&lt;p&gt;Audio and video transmission is the most complex module in the video API. To ensure that the audio and video data can be transmitted to the opposite end quickly, stably, and with high quality in a complex network environment, streaming protocols such as RTP, HTTP-FLV, HLS, and RTMP can be used.&lt;/p&gt;

&lt;p&gt;Various anomalies such as data redundancy, loss, out-of-order, flow control, adaptive frame rate, resolution, jitter buffering, etc., must be resolved using multiple algorithms.&lt;/p&gt;

&lt;p&gt;So whether video API is worth choosing, we need to focus on whether the manufacturer has outstanding audio and video transmission advantages.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Audio and video decoding
&lt;/h3&gt;

&lt;p&gt;Audio and video decoding means that after the audio and video data is transmitted to the receiving end, the receiving end needs to decode the data according to the received data encoding format.&lt;/p&gt;

&lt;p&gt;There are two video decoding methods, hardware decoding, and software decoding. Software decoding generally uses the open source library FFMpeg. Audio decoding only supports software decoding; use FDK_AAC or OPUS decoding according to the audio encoding format.&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Audio and video rendering
&lt;/h3&gt;

&lt;p&gt;Audio and video rendering is the last step in the video API processing process. This step seems to be very simple. You only need to call the system interface to render the data to the screen.&lt;/p&gt;

&lt;p&gt;However, one must process much logic to align the video picture with the audio. Still, now there is a standard processing method to ensure the synchronization of the audio and video.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to use ZEGOCLOUD video API
&lt;/h2&gt;

&lt;p&gt;Building a complete set of real-time audio and video systems is complex work. Nevertheless, many Video APIs help us solve the underlying complex operations. We only need to focus on the upper-level business logic.&lt;/p&gt;

&lt;p&gt;The following will introduce how to use the &lt;a href="https://www.zegocloud.com" rel="noopener noreferrer"&gt;ZEGOCLOUD Video API&lt;/a&gt; to implement the video calling function.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Implementation process
&lt;/h3&gt;

&lt;p&gt;The following diagram shows the basic process of User A playing a stream published by User B: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2F16583039336901.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2F16583039336901.png" alt="Video API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The following sections explain each step of this process in more detail.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Optional: Create the UI
&lt;/h3&gt;

&lt;p&gt;Before creating a &lt;code&gt;ZegoExpressEngine&lt;/code&gt; instance, we recommend you add the following UI elements to implement basic real-time audio and video features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A view for local preview &lt;/li&gt;
&lt;li&gt;A view for remote video&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;End&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2F16583039579543.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F22%2F16583039579543.jpg" alt="Video Call UI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Create a ZegoExpressEngine instance
&lt;/h3&gt;

&lt;p&gt;To create a singleton instance of the &lt;code&gt;ZegoExpressEngine&lt;/code&gt; class, call the &lt;code&gt;createEngine&lt;/code&gt; method with the &lt;strong&gt;AppID&lt;/strong&gt; of your project.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  4. Log in to a room
&lt;/h3&gt;

&lt;p&gt;To log in to a room, call the &lt;code&gt;loginRoom&lt;/code&gt; method.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Then, to listen for and handle various events that may happen after logging in to a room, you can implement the corresponding event callback methods of the event handler as needed. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  5. Start the local video preview
&lt;/h3&gt;

&lt;p&gt;To start the local video preview,  call the &lt;code&gt;startPreview&lt;/code&gt; method with the view for rendering the local video passed to the &lt;code&gt;canvas&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;You can use a &lt;code&gt;SurfaceView&lt;/code&gt;, &lt;code&gt;TextureView&lt;/code&gt;, or &lt;code&gt;SurfaceTexture&lt;/code&gt; to render the video.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  6. Publish streams
&lt;/h3&gt;

&lt;p&gt;To start publishing a local audio or video stream to remote users, call the &lt;code&gt;startPublishingStream&lt;/code&gt; method with the corresponding Stream ID passed to the &lt;code&gt;streamID&lt;/code&gt; parameter.     &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Then, to listen for and handle various events that may happen after stream publishing starts, you can implement the corresponding event callback methods of the event handler as needed. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  7. Play streams
&lt;/h3&gt;

&lt;p&gt;To start playing remote audio or video stream, call the &lt;code&gt;startPlayingStream&lt;/code&gt; method with the corresponding Stream ID passed to the &lt;code&gt;streamID&lt;/code&gt; parameter and the view for rendering the video passed to the &lt;code&gt;canvas&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;You can use a &lt;code&gt;SurfaceView&lt;/code&gt;, &lt;code&gt;TextureView&lt;/code&gt;, or &lt;code&gt;SurfaceTexture&lt;/code&gt; to render the video.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  8. Stop publishing and playing streams
&lt;/h3&gt;

&lt;p&gt;To stop publishing a local audio or video stream to remote users, call the &lt;code&gt;stopPublishingStream&lt;/code&gt; method.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;If local video preview is started, call the &lt;code&gt;stopPreview&lt;/code&gt; method to stop it as needed.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;To stop playing a remote audio or video stream, call the &lt;code&gt;stopPlayingStream&lt;/code&gt; method with the corresponding stream ID passed to the &lt;code&gt;streamID&lt;/code&gt; parameter.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  9. Log out of a room
&lt;/h3&gt;

&lt;p&gt;To log out of a room, call the &lt;code&gt;logoutRoom&lt;/code&gt; method with the corresponding room ID passed to the &lt;code&gt;roomID&lt;/code&gt; parameter.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=24" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD,  get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-clubhouse-clone-app-with-android-and-zegocloud-a-social-audio-app-development-2pod" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to Build a Clubhouse Clone App with Android and ZEGOCLOUD - A Social Audio App Development&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jun 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/movies-together-online-in-a-few-hours-source-code-inside-40o0" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Built an App to Watch Movies Together Online in a Few Hours (source code inside)&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Mar 11 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#video&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#twilio&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/improve-live-streaming-experience-with-stream-mixing-345o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Improve live streaming experience with stream mixing&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jun 21 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-implement-a-video-call-app-using-ios-callkit-and-zegocloud-478g" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to implement a video call app using iOS CallKit and ZEGOCLOUD&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jul 8 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>mobile</category>
      <category>android</category>
      <category>programming</category>
      <category>ios</category>
    </item>
    <item>
      <title>How to implement a video call app using iOS CallKit and ZEGOCLOUD</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Fri, 08 Jul 2022 14:21:17 +0000</pubDate>
      <link>https://dev.to/zegocloud/how-to-implement-a-video-call-app-using-ios-callkit-and-zegocloud-478g</link>
      <guid>https://dev.to/zegocloud/how-to-implement-a-video-call-app-using-ios-callkit-and-zegocloud-478g</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;iOS CallKit&lt;/strong&gt; is a new framework introduced by Apple on iOS10 in 2016 to improve the VoIP experience.&lt;/p&gt;

&lt;p&gt;This article will explain how to use &lt;a href="https://developer.apple.com/documentation/callkit"&gt;iOS CallKit&lt;/a&gt; and &lt;a href="https://www.zegocloud.com?_source=dev&amp;amp;article=23"&gt;ZEGOCLOUD&lt;/a&gt; to build a Video Call App with a native calling experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/demo-apps?_source=dev&amp;amp;article=23"&gt;&lt;strong&gt;Demo download&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codestore.zegocloud.com/project/2?_source=dev&amp;amp;article=23"&gt;&lt;strong&gt;Source code download&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SNBHplFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/16572698246030.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SNBHplFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/16572698246030.jpg" alt="CallKit Demo" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is ZEGOCLOUD?
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD is a global cloud communication service provider that was founded in June 2015.&lt;/p&gt;

&lt;p&gt;It provides high-quality audio/video communication and IM services for more than 4,000 clients around the world.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is CallKit？
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/uikits"&gt;CallKit&lt;/a&gt; is a framework that aims to improve the VoIP experience by allowing apps to integrate with the native phone UI. By adopting CallKit, your app will be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the native incoming call screen in both the locked and unlocked states.&lt;/li&gt;
&lt;li&gt;Start calls from the native phone app’s Contacts, Favorites, and Recents screens.&lt;/li&gt;
&lt;li&gt;Interplay with other calls in the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X1QV2Qgy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X1QV2Qgy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/1.jpg" alt="1" width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CXProvider
&lt;/h3&gt;

&lt;p&gt;Your app will use &lt;code&gt;CXProvider&lt;/code&gt; to report any out-of-band notifications to the system. These are usually external events, such as an incoming call.&lt;/p&gt;

&lt;p&gt;When such an event occurs, &lt;code&gt;CXProvider&lt;/code&gt; creates a &lt;code&gt;CXCallUpdate&lt;/code&gt; to notify the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  CXCallUpdate
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;CXCallUpdate&lt;/code&gt; is used to encapsulate new or changing call-related information. The properties included in this class are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Caller's name&lt;/li&gt;
&lt;li&gt; whether a call is video or audio-only.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  CXAction
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;CXAction&lt;/code&gt; is an abstract class that represents the phone's action. For different &lt;code&gt;action&lt;/code&gt;, CallKit will provide different &lt;code&gt;CXAction&lt;/code&gt; implementations.&lt;/p&gt;

&lt;p&gt;For example, outgoing calls are represented by &lt;code&gt;CXStartCallAction&lt;/code&gt;, and &lt;code&gt;CXAnswerCallAction&lt;/code&gt; is used to answer incoming calls. &lt;code&gt;Action&lt;/code&gt; is identified by a unique &lt;code&gt;UUID&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When the system wants to notify the app that it has received an event, it will inform it in the form of &lt;code&gt;CXAction&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The app communicates with &lt;code&gt;CXProvider&lt;/code&gt; through &lt;code&gt;CXProviderDelegate&lt;/code&gt;, this protocol defines the life cycle event methods of &lt;code&gt;CXProvider&lt;/code&gt;, and calls &lt;code&gt;CXAction&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  CXCallController
&lt;/h3&gt;

&lt;p&gt;Apps use &lt;code&gt;CXCallController&lt;/code&gt; to let the system know about user-initiated requests, such as "call" actions. The biggest difference between &lt;code&gt;CXProvider&lt;/code&gt; and &lt;code&gt;CXCallController&lt;/code&gt; is that the job of &lt;code&gt;CXProvider&lt;/code&gt; is to notify the system, while &lt;code&gt;CXCallController&lt;/code&gt; makes requests to the user on behalf of the system.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CXCallController&lt;/code&gt; uses transactions when making requests. Transactions are represented by &lt;code&gt;CXTransaction&lt;/code&gt;, which contains one or more &lt;code&gt;CXAction&lt;/code&gt; instances. &lt;code&gt;CXCallCotroller&lt;/code&gt; sends the transaction to the system, and if everything is OK, the system will respond with the corresponding &lt;code&gt;CXAction&lt;/code&gt; to the &lt;code&gt;CXProvider&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incoming Calls
&lt;/h2&gt;

&lt;p&gt;The following will explain how to use CallKit to implement the Incoming Call function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PFb1RATF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PFb1RATF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/2.jpg" alt="2" width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;When an incoming call comes in, the App will create a &lt;code&gt;CXCallUpdate&lt;/code&gt; and send it to the system through &lt;code&gt;CXProvider&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The system will issue an &lt;code&gt;incoming call&lt;/code&gt; to its service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the user answers the call, the system will send a &lt;code&gt;CXAnswerCallAction&lt;/code&gt; to the &lt;code&gt;CXProvider&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;App can respond to this animation by implementing the corresponding &lt;code&gt;CXProviderDelegate&lt;/code&gt; protocol method.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ProviderDelegate
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;ProviderDelegate.swift&lt;/code&gt; file in your project and add the following code:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ProviderDelegate&lt;/code&gt; needs to deal with &lt;code&gt;CXProvider&lt;/code&gt; and &lt;code&gt;CXCallController&lt;/code&gt;, so keep two references to both.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize &lt;code&gt;CXProvider&lt;/code&gt; with a &lt;code&gt;CXProviderConfiguration&lt;/code&gt;, which will be defined as a static property later. &lt;code&gt;CXProviderConfiguration&lt;/code&gt; is used to define the behavior and capabilities of the call.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To be able to respond to events from &lt;code&gt;CXProvider&lt;/code&gt;, you need to set its delegate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In this app, &lt;code&gt;CXProviderConfiguration&lt;/code&gt; supports video call, and phone number handling, and limits the number of call groups to 1. For more customization, please refer to the &lt;a href="https://developer.apple.com/documentation/callkit/cxproviderconfiguration"&gt;CallKit documentation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Just below the configuration, add the following helper method:
&lt;/h3&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;This utility method allows the App to report an incoming call through the &lt;code&gt;CXProvider&lt;/code&gt; API. The code is explained as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Prepare to report a &lt;code&gt;call update&lt;/code&gt; event to the system, which contains all call-related metadata.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call the &lt;code&gt;reportIcomingCall(with:update:completion:)&lt;/code&gt; method of &lt;code&gt;CXProvider&lt;/code&gt; to notify the system of an incoming call.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  CXProviderDelegate
&lt;/h2&gt;

&lt;p&gt;The next step is to ensure protocol conformance. Still in &lt;code&gt;ProviderDelegate.swift&lt;/code&gt;, declare a new extension to conform to &lt;code&gt;CXProviderDelegate&lt;/code&gt;:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;CXProviderDelegate&lt;/code&gt; specifies only one required method, &lt;code&gt;providerDidReset(_:)&lt;/code&gt;. The provider invokes this method when reset, giving your app the opportunity to clean up any ongoing calls and revert to a clean state. In this implementation, you’ll terminate the ongoing audio session and dispose of any active calls.&lt;/p&gt;

&lt;p&gt;Open AppDelegate.swift and start by adding a new property to the class:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The provider delegate is ready for use! Add the following method to &lt;code&gt;AppDelegate.swift&lt;/code&gt;:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;This method lets other classes access the provider delegate’s helper method.&lt;/p&gt;

&lt;p&gt;The final piece of the puzzle is hooking up this call to the user interface. Open CallsViewController.swift, which is the controller for the main screen of the app. Find the empty implementation of unwindForNewCall(_:) and replace it with the following code:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Extracts the properties of the call from NewCallViewController, which is the source of this unwind segue.&lt;/li&gt;
&lt;li&gt;The user can suspend the app before the action completes, so it should use a background task.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ending the Call
&lt;/h2&gt;

&lt;p&gt;Next, I will explain how to end a call. This App will support two ways to end a call:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The native interface ends the call.&lt;/li&gt;
&lt;li&gt;End the call in the app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d1-HX6og--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d1-HX6og--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/07/08/3.jpg" alt="3" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice the difference between steps &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt;. When the user ends the call from the in-call screen (A), the system automatically sends a &lt;code&gt;CXEndCallAction&lt;/code&gt; to the provider. &lt;/p&gt;

&lt;p&gt;However, if you want to end a call using Hotline (B), it’s your job to wrap the action into a transaction and request it from the system. Once the system processes the request, it will send the &lt;code&gt;CXEndCallAction&lt;/code&gt; back to the provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  CXProviderDelegate
&lt;/h3&gt;

&lt;p&gt;However it supports ending calls, your app has to implement the necessary &lt;code&gt;CXProviderDelegate&lt;/code&gt; method for it to work. Open &lt;code&gt;ProviderDelegate.swift&lt;/code&gt; and add the following implementation to the class extension:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Now add the following methods to the class:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;CXEndCallAction&lt;/code&gt;. Pass in the call’s &lt;code&gt;UUID&lt;/code&gt; to the initializer so it can be identified later.&lt;/li&gt;
&lt;li&gt;Wrap the action into a transaction so you can send it to the system.&lt;/li&gt;
&lt;li&gt;Invoke &lt;code&gt;request(_:completion:)&lt;/code&gt; from the call controller. The system will request that the provider perform this transaction, which will in turn invoke the delegate method you just implemented.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=23"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD,  get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rbbCt7zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--_hBOcEXv--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/organization/profile_image/5598/20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD" width="150" height="150"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="" width="150" height="150"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-clubhouse-clone-app-with-android-and-zegocloud-a-social-audio-app-development-2pod" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to Build a Clubhouse Clone App with Android and ZEGOCLOUD - A Social Audio App Development&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jun 29 '22 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/movies-together-online-in-a-few-hours-source-code-inside-40o0" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Built an App to Watch Movies Together Online in a Few Hours (source code inside)&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Mar 11 '22 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#video&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#twilio&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/improve-live-streaming-experience-with-stream-mixing-345o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Improve live streaming experience with stream mixing&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jun 21 '22 ・ 4 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://developer.apple.com/documentation/callkit/making_and_receiving_voip_calls_with_callkit" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--06i0Z_xb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://docs.developer.apple.com/tutorials/developer-og.jpg" height="420" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://developer.apple.com/documentation/callkit/making_and_receiving_voip_calls_with_callkit" rel="noopener noreferrer" class="c-link"&gt;
          Making and Receiving VoIP Calls with CallKit | Apple Developer Documentation
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Use the CallKit framework to integrate native VoIP calling.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--YGsestYO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer.apple.com/favicon.ico" width="64" height="64"&gt;
        developer.apple.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://docplayer.net/40382450-Enhancing-voip-apps-with-callkit.html" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--_KJBeZzw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://docplayer.net/thumbs/57/40382450.jpg" height="91" class="m-0" width="70"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://docplayer.net/40382450-Enhancing-voip-apps-with-callkit.html" rel="noopener noreferrer" class="c-link"&gt;
          Enhancing VoIP Apps with CallKit - PDF Free Download
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          App Frameworks #WWDC16 Enhancing VoIP Apps with CallKit Session 230 Sirisha Pillalamarri CallKit Engineer Stuart Montgomery CallKit Engineer Nick Fraioli CallKit Engineer 2016 Apple Inc. All rights reserved.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--I3T9ET2W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://docplayer.net/favicon.ico" width="256" height="256"&gt;
        docplayer.net
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ios</category>
      <category>mobile</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Implement Super Live Chat: 3 Methods You Should Know</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Mon, 04 Jul 2022 11:39:26 +0000</pubDate>
      <link>https://dev.to/davidrelo/how-to-implement-super-live-chat-3-methods-you-should-know-407b</link>
      <guid>https://dev.to/davidrelo/how-to-implement-super-live-chat-3-methods-you-should-know-407b</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Super live chat is a service that allows users to communicate with each other in real-time over the Internet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/product/in-app-chat" rel="noopener noreferrer"&gt;Super live chat&lt;/a&gt; is an important function of popular apps on the market, such as WhatsApp and Facebook Messenger. Developing a super live chat architecture is much harder than it looks —  numerous technologies have to be employed to meet high real-time demands, including massive concurrent requests, super-low latency, and 100% delivery of messages.&lt;/p&gt;

&lt;p&gt;In recent years, driven by the rapid development of mobile technology and the growing trend for social features in the app market, Super live chat is widely used for communication on social media platforms, and in scenarios as diverse as e-commerce, &lt;a href="https://www.zegocloud.com/product/live-streaming" rel="noopener noreferrer"&gt;live streaming&lt;/a&gt;, and customer service, etc.&lt;/p&gt;

&lt;p&gt;Research shows that more than 60% of apps on the market have the super live chat feature, through which users can chat with each other in real-time, thus improving app engagement and user experience. For app developers, Super live chat implementation has become a must-have skill.&lt;/p&gt;

&lt;p&gt;With more than 10 years of experience in developing super live chat apps, the author shares three options for super live chat implementation and hopes this article could be of help to super live chat developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to implement Super live chat
&lt;/h2&gt;

&lt;p&gt;Developers may build a super live chat app via &lt;br&gt;
1) open-source code&lt;br&gt;
2) in-house development&lt;br&gt;
3) commercial SDK integration based on the project needs.&lt;/p&gt;

&lt;p&gt;Client-side development, server-side development, and O&amp;amp;M are the three key parts for turning an idea into an IM product and keeping it up and running.&lt;/p&gt;

&lt;p&gt;Client-side development involves mobile apps, desktop software, webpages, and mini-programs.&lt;br&gt;
Server-side development is about the implementation of all super live chat functions, such as user access, relationship maintenance, sending/receiving messages, file and photo storage, and security audit.&lt;/p&gt;

&lt;p&gt;Continuous O&amp;amp;M is required to ensure a stable and reliable environment on the server side for the IM app, such as scaling up the server in case of a surge in workload.&lt;/p&gt;

&lt;p&gt;It's not easy to realize any of the above from scratch. In particular, in-house development requires a highly capable project team and abundant resources. Generally, large companies would develop software entirely on their own while others use open source codes or integrate a commercial SDK. Differences between the three methods are summarized as follows:&lt;/p&gt;

&lt;p&gt;Table: 3 methods of Super live chat implementation&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Open source code&lt;/th&gt;
&lt;th&gt;In-house development&lt;/th&gt;
&lt;th&gt;Commercial SDK&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Difficulty&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional scalability&lt;/td&gt;
&lt;td&gt;Difficult; dependent on the open source project plan&lt;/td&gt;
&lt;td&gt;Easy; independent of external conditions&lt;/td&gt;
&lt;td&gt;Medium; dependent on SDK providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&amp;amp;M cost&lt;/td&gt;
&lt;td&gt;High; in-house O&amp;amp;M&lt;/td&gt;
&lt;td&gt;High; in-house O&amp;amp;M&lt;/td&gt;
&lt;td&gt;In-house O&amp;amp;M not required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product launch cycle&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Long&lt;/td&gt;
&lt;td&gt;Short&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target audience&lt;/td&gt;
&lt;td&gt;Individuals learning app development&lt;/td&gt;
&lt;td&gt;Large companies with strong R&amp;amp;D capabilities&lt;/td&gt;
&lt;td&gt;Small and medium-sized enterprises and personal studios&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Method 1: Use open-source projects
&lt;/h2&gt;

&lt;p&gt;Using an open-source project is the fastest way to implement super live chat as you can embark on a fast-track product development by drawing on the wisdom of the whole community.&lt;/p&gt;

&lt;p&gt;What should we focus on when choosing an open-source project for super live chat? The maturity of functions and the number of active users are two important aspects to consider when choosing an open-source project. Based on my experience, I would like to share with you two good open-source projects.&lt;/p&gt;
&lt;h3&gt;
  
  
  MongooseIM
&lt;/h3&gt;

&lt;p&gt;Project URL: &lt;a href="https://github.com/esl/MongooseIM" rel="noopener noreferrer"&gt;https://github.com/esl/MongooseIM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MongooseIM is Erlang Solutions' robust, scalable and efficient XMPP server, aimed at large installations. Specifically designed for enterprise purposes, it is fault-tolerant and can utilize the resources of multiple clustered machines.&lt;/p&gt;
&lt;h3&gt;
  
  
  OpenIM
&lt;/h3&gt;

&lt;p&gt;Project URL: &lt;a href="https://github.com/OpenIMSDK/Open-IM-Server" rel="noopener noreferrer"&gt;https://github.com/OpenIMSDK/Open-IM-Server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenIM was founded and developed by senior IM architects and IM/WebRTC experts, aiming at creating service value and developing lightweight, high-availability super live chat architecture through open source technology. With OpenIM, developers can easily build multiple IM and real-time interactive audio/video scenarios in an app.&lt;/p&gt;

&lt;p&gt;An open-source project is a great option for developers who have to meet a tight deadline and without too many needs for customization to realize fast IM implementation. However, the project provides only simple and basic functions, and adding new functions relies heavily on its development progress. If you want to create a bespoke IM app, or if you expect a growing business, I advise you against using this method.&lt;/p&gt;

&lt;p&gt;Teams with R&amp;amp;D capabilities usually prefer in-house development if they want a custom IM product. The next part will guide you through the technical difficulties and pitfalls in the process of in-house development.&lt;/p&gt;
&lt;h2&gt;
  
  
  Method 2: In-house development
&lt;/h2&gt;

&lt;p&gt;Developing a super live chat product entirely by in-house teams requires a high cost and extensive, essential software development expertise within an organization. In addition, the development cycle may be lengthy. You need to make long-term planning to avoid missing business opportunities.&lt;/p&gt;

&lt;p&gt;When developing a super live chat app in-house, we have met some technical difficulties in the following areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reliability and order of messages.&lt;/li&gt;
&lt;li&gt;Real-time messaging and pulling of messages in case of massive concurrent requests.&lt;/li&gt;
&lt;li&gt;Message storage options: "pull" or "push" model.&lt;/li&gt;
&lt;li&gt;Accurate calculation of unread messages.&lt;/li&gt;
&lt;li&gt;Group chat acknowledgment messages.&lt;/li&gt;
&lt;li&gt;Multi-data center deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You may bundle some features of full-fledged products on the market into your app, such as file storage, security audit, and offline push notification, to accelerate the development. If you decide to develop such features by yourself in the future, you can easily replace them to maximize efficiency.&lt;/p&gt;

&lt;p&gt;Deep-pocketed and technical-savvy enterprises that expect an enormous user base are advised to choose in-house development to fulfill their needs for functional scalability, fast iteration, and stable O&amp;amp;M.&lt;/p&gt;

&lt;p&gt;Given the considerable financial and human resources required during this process, I recommend that in-house developers make a sound development plan to avoid unnecessary loss.&lt;/p&gt;

&lt;p&gt;Here is a summary of the downsides of the two super live chat implementation methods we have discussed: If you choose an open-source project, it would be a bit difficult to add new functions and the O&amp;amp;M is complex, making it hard to support the product's long-term development. In-house development takes time and costs a lot of money.&lt;/p&gt;

&lt;p&gt;Is there a compromise solution that needs a short development timeline, requires less investment, and supports customization? Yes. Integrating a commercial SDK is the easiest and a popular way to develop software applications. Many companies would choose SDKs from full-blown providers.&lt;/p&gt;
&lt;h2&gt;
  
  
  Method 3: Integrate a commercial SDK
&lt;/h2&gt;

&lt;p&gt;This method is appealing because it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;enables quick implementation of an IM product to gain competitive edges.&lt;/li&gt;
&lt;li&gt;offers stability to reduce O&amp;amp;M work.&lt;/li&gt;
&lt;li&gt;supports functional scalability: If a new function is required, just get your request to the SDK provider.&lt;/li&gt;
&lt;li&gt;requires much less cost than in-house development.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Process of super live chat implementation&lt;br&gt;
When you choose to integrate a commercial SDK, follow the process below to implement super live chat:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply for a user account and get the password from the SDK provider.&lt;/li&gt;
&lt;li&gt;Develop a service backend used to calculate the authentication information.&lt;/li&gt;
&lt;li&gt;Integrate the SDK and develop your app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's take sending/receiving messages as an example. Modules interact with each other, as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F04%2Fsuper-chat-live.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fresource.zegocloud.com%2Fcontent_resource%2F2022%2F07%2F04%2Fsuper-chat-live.jpg" alt="Super chat live modules interact"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To sum up, if you choose this method, all you need to do is develop a simple service backend, integrate the SDK, and develop your app. With all being done, you can launch your app quickly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Recommended SDK providers
&lt;/h2&gt;

&lt;p&gt;There are many mature IM SDK providers on the market. I would like to recommend some of them.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://www.zegocloud.com?_source=dev&amp;amp;article=22" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;ZEGOCLOUD, a global cloud communication service provider that founded in June 2015.&lt;/p&gt;

&lt;p&gt;It provides high-quality audio/video communication and IM services for more than 4,000 clients around the world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.zegocloud.com/article/13918?_source=dev&amp;amp;article=22" rel="noopener noreferrer"&gt;ZEGOCLOUD's IM SDK&lt;/a&gt; is specially developed for audio/video communications. It can be used with &lt;a href="https://docs.zegocloud.com/article/5540?_source=dev&amp;amp;article=22" rel="noopener noreferrer"&gt;voice and video SDKs&lt;/a&gt; to enable, for example, real-time engagement during live-streamed content. If your app's audio/video and the IM capabilities are built on products from different suppliers, users may experience a huge stream delay. ZEGOCLOUD's IM SDK can address this problem.&lt;/p&gt;

&lt;p&gt;You can choose ZEGOCLOUD if you need to build IM into your audio/video-related platforms, such as live streaming, conference, education, and games. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=22" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD,  get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://www.cometchat.com" rel="noopener noreferrer"&gt;CometChat&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Founded in 2009, CometChat is committed to IM technology development and supports many platforms and frameworks, such as iOS, Android, React, Angular, and Vue.&lt;/p&gt;

&lt;p&gt;It also provides developers with various solutions, such as Chat Widgets, Chat UI Kits, and Chat SDKs.&lt;/p&gt;

&lt;p&gt;If you are developing a dating app with IM as the core feature, CometChat would be a good choice for you.&lt;/p&gt;
&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/zegocloud" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5598%2F20206223-b22f-4f3a-873c-9353817172da.png" alt="ZEGOCLOUD"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/zegocloud/how-to-build-a-clubhouse-clone-app-with-android-and-zegocloud-a-social-audio-app-development-2pod" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to Build a Clubhouse Clone App with Android and ZEGOCLOUD - A Social Audio App Development&lt;/h2&gt;
      &lt;h3&gt;DavidRelo for ZEGOCLOUD ・ Jun 29 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/movies-together-online-in-a-few-hours-source-code-inside-40o0" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Built an App to Watch Movies Together Online in a Few Hours (source code inside)&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Mar 11 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#video&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#twilio&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829000%2F365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/improve-live-streaming-experience-with-stream-mixing-345o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Improve live streaming experience with stream mixing&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jun 21 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Build a Clubhouse Clone App with Android and ZEGOCLOUD - A Social Audio App Development</title>
      <dc:creator>DavidRelo</dc:creator>
      <pubDate>Wed, 29 Jun 2022 09:00:14 +0000</pubDate>
      <link>https://dev.to/zegocloud/how-to-build-a-clubhouse-clone-app-with-android-and-zegocloud-a-social-audio-app-development-2pod</link>
      <guid>https://dev.to/zegocloud/how-to-build-a-clubhouse-clone-app-with-android-and-zegocloud-a-social-audio-app-development-2pod</guid>
      <description>&lt;p&gt;Because of a conversation with Musk, ClubHouse caught fire worldwide and reached a staggering 9.6 million monthly downloads.&lt;/p&gt;

&lt;p&gt;Faced with a new social model, how to quickly clone Clubhouse's social gameplay. Enrich the interaction form of your own application.&lt;/p&gt;

&lt;p&gt;Today we will introduce how to use &lt;a href="https://docs.zegocloud.com/article/13746.html?_source=dev&amp;amp;article=20"&gt;ZEGOCLOUD's ZEGOLiveAudioRoom SDK&lt;/a&gt; to quickly build a Social Audio App in 10 minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sNYt-cx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/demo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sNYt-cx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/demo.gif" alt="Demo" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a project in &lt;a href="https://console.zegocloud.com?_source=dev&amp;amp;article=20"&gt;ZEGOCLOUD Admin Console&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.zegocloud.com/talk?_source=dev&amp;amp;article=20"&gt;Contact us&lt;/a&gt; to activate the Live Audio Room service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Understand the process
&lt;/h2&gt;

&lt;p&gt;The following diagram shows the basic process of creating a live audio room and taking speaker seats to speak:&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PCSdhNzm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/16563153921560.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PCSdhNzm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/16563153921560.png" alt="process" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Integrate the zegoliveaudioroom SDK
&lt;/h2&gt;

&lt;p&gt;To integrate the SDK, do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the &lt;a href="https://github.com/ZEGOCLOUD/live_audio_room_android"&gt;Sample codes&lt;/a&gt;, copy the &lt;code&gt;zegoliveaudioroom&lt;/code&gt; module to your project (if you have no project, create a new one).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following code to the &lt;code&gt;settings.gradle&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s1"&gt;':zegoliveaudioroom'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Modify the &lt;code&gt;build.gradle&lt;/code&gt; file of your application, add the following code to the &lt;code&gt;dependencies&lt;/code&gt; node:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="nf"&gt;project&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;':zegoliveaudioroom'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QlZg6PL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/16563155088049.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QlZg6PL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/16563155088049.png" alt="build.gradle" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Modify the &lt;code&gt;build.gradle&lt;/code&gt; file of your project, add the following code to the &lt;code&gt;repositories&lt;/code&gt; node:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;maven&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="s1"&gt;'https://www.jitpack.io'&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_NbGdusI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/16563156312553.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_NbGdusI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://resource.zegocloud.com/content_resource/2022/06/29/16563156312553.png" alt="repositories" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;code&gt;sync now&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Add permissions
&lt;/h2&gt;

&lt;p&gt;Permissions can be set as needed.&lt;/p&gt;

&lt;p&gt;Open the file &lt;code&gt;app/src/main/AndroidManifest.xml&lt;/code&gt;, and add the following code:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Note: For Android 6.0 or later, some important permissions must be requested at runtime rather than declared statically in the file &lt;code&gt;AndroidMainfest.xml&lt;/code&gt;, therefore, you need to add the following code to do so (requestPermissions is a method of an Android Activity).&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Prevent class name obfuscation
&lt;/h2&gt;

&lt;p&gt;To prevent the ZEGOCLOUD SDK public class names from being obfuscated, you can add the following code in the file &lt;code&gt;proguard-rules.pro&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="err"&gt;**.&lt;/span&gt;&lt;span class="nc"&gt;zego&lt;/span&gt;&lt;span class="o"&gt;.**{*;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Initialize the zegoliveaudioroom SDK
&lt;/h2&gt;

&lt;p&gt;To initialize the zegoliveaudioroom SDK, get the &lt;code&gt;ZegoRoomManager&lt;/code&gt; instance, pass the AppIDof your project. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;To receive event callbacks, call the &lt;code&gt;setListener&lt;/code&gt; to listen for and handle various events as needed.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Log in
&lt;/h2&gt;

&lt;p&gt;To access the signaling service of Live Audio Room with the &lt;code&gt;zegoliveaudioroom&lt;/code&gt; SDK, you must log in first.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Create/Join a live audio room
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You become a &lt;strong&gt;Host&lt;/strong&gt; after creating a live audio room, and you owe more permissions, such as closing untaken speaker seats, removing a specified listener from the speaker seat, etc.&lt;/li&gt;
&lt;li&gt;You become a &lt;strong&gt;Listener&lt;/strong&gt; after joining a live audio room, you can take a speaker seat to be a speaker or leave the speaker seat to become a listener again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To create a live audio room, call the &lt;code&gt;createRoom&lt;/code&gt; method: &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;To join a live audio room, call the &lt;code&gt;joinRoom&lt;/code&gt; method:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Send/Receive messages in the room
&lt;/h2&gt;

&lt;p&gt;In a live audio room, both &lt;strong&gt;Host&lt;/strong&gt; and &lt;strong&gt;Listeners&lt;/strong&gt; can send and receive messages. &lt;/p&gt;

&lt;p&gt;To send messages, call the &lt;code&gt;sendTextMessage&lt;/code&gt; method with message content.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;To receive messages, listen for the &lt;code&gt;ZegoMessageServiceListener&lt;/code&gt; callback. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Take a speaker seat
&lt;/h2&gt;

&lt;p&gt;To take a speaker seat to speak, call the &lt;code&gt;takeSeat&lt;/code&gt; method. And the SDK publishes streams simultaneously. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;When there is a new listener takes a seat and becomes a speaker, all participants in the room receive notifications through the &lt;code&gt;ZegoSpeakerSeatServiceListener&lt;/code&gt; callback. You can set up a UI refresh action for this callback as needed.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;p&gt;&lt;a href="https://console.zegocloud.com/account/signup?_source=dev&amp;amp;article=20"&gt;Sign up&lt;/a&gt; with ZEGOCLOUD, get &lt;strong&gt;10,000 minutes&lt;/strong&gt; free every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did you know? 👏
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt; and &lt;strong&gt;Follow&lt;/strong&gt; is the biggest encouragement to me&lt;br&gt;
&lt;strong&gt;Follow me&lt;/strong&gt; to learn more technical knowledge&lt;br&gt;
Thank you for reading :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;This is one of the live technical articles. Welcome to other articles:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/movies-together-online-in-a-few-hours-source-code-inside-40o0" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Built an App to Watch Movies Together Online in a Few Hours (source code inside)&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Mar 11 '22 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#video&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#twilio&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/all-live-streaming-features-in-one-article-29n6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;All Live Streaming Features in One Article&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jun 10 '22 ・ 6 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/davidrelo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QnR4QErY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--JD6g4sMD--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/829000/365dd555-e407-4d23-b275-57c0c9f589a2.jpg" alt="davidrelo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/davidrelo/improve-live-streaming-experience-with-stream-mixing-345o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Improve live streaming experience with stream mixing&lt;/h2&gt;
      &lt;h3&gt;DavidRelo ・ Jun 21 '22 ・ 4 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>android</category>
      <category>mobile</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
