WebRTC'yi kullanmaya başlama

WebRTC, açık ve sınırsız web için verilen uzun savaşın yeni bir cephesidir.

Brendan Eich, JavaScript'in mucidi

Telefonunuzun, TV'nizin ve bilgisayarınızın ortak bir platform üzerinde iletişim kurabileceği bir dünya hayal edin. Web uygulamanıza görüntülü sohbet ve eşler arası veri paylaşımı eklemenin kolay olduğunu düşünün. WebRTC'nin vizyonu bu.

Denemek ister misiniz? WebRTC, masaüstü ve mobil cihazlarda Google Chrome, Safari, Firefox ve Opera'da kullanılabilir. appr.tc adresindeki basit görüntülü sohbet uygulamasını kullanarak başlayabilirsiniz:

  1. appr.tc'yi tarayıcınızda açın.
  2. Bir sohbet odasına katılmak ve uygulamanın web kameranızı kullanmasına izin vermek için Katıl'ı tıklayın.
  3. Sayfanın sonunda görüntülenen URL'yi yeni bir sekmede veya daha iyisi, farklı bir bilgisayarda açın.

Hızlı başlangıç

Bu makaleyi okumaya zamanınız yok veya yalnızca kod mu istiyorsunuz?

  • WebRTC'ye genel bakış için aşağıdaki Google I/O videosunu izleyin veya bu slaytları görüntüleyin:
  • getUserMedia API'sini kullanmadıysanız HTML5'te ses ve video çekme ve simpl.info getUserMedia'ya bakın.
  • RTCPeerConnection API hakkında bilgi edinmek için aşağıdaki örneğe ve 'simpl.info RTCPeerConnection'a göz atın.
  • WebRTC'nin sinyal, güvenlik duvarı ve NAT geçişi için sunucuları nasıl kullandığını öğrenmek istiyorsanız appr.tc'deki kod ve konsol günlüklerine bakın.
  • Sabırsızlanıyorum ve hemen WebRTC'yi denemek mi istiyorsunuz? WebRTC JavaScript API'lerini kullanan 20'den fazla demodan bazılarını deneyin.
  • Makineniz ve WebRTC ile ilgili sorun mu yaşıyorsunuz? WebRTC troubleshooter (WebRTC Sorun Giderici) sayfasını ziyaret edin.

Alternatif olarak, basit bir sinyal sunucusu da dahil olmak üzere eksiksiz bir görüntülü sohbet uygulamasının nasıl oluşturulacağını adım adım açıklayan WebRTC codelab adlı kılavuza doğrudan geçebilirsiniz.

WebRTC'nin çok kısa bir geçmişi vardır

Web'in karşılaştığı en büyük zorluklardan biri de insan iletişimini ses ve video üzerinden yapabilmek. Gerçek zamanlı iletişim ya da kısaca RTC. RTC, bir web uygulamasında metin girişine metin girmek kadar doğal olmalıdır. Bu olmadan, yenilik yapma ve insanların etkileşim kurması için yeni yollar geliştirme imkanlarınız kısıtlı olur.

Geçmişte, RTC kurumsal ve karmaşık bir yapıya sahipti ve pahalı ses ve video teknolojilerinin şirket içinde lisanslanmasını veya geliştirilmesini gerektiriyordu. RTC teknolojisini mevcut içerik, veri ve hizmetlere entegre etmek özellikle web'de zor ve zaman alan bir işti.

Gmail görüntülü sohbet 2008'de popüler hale geldi ve 2011'de Google, Gmail gibi Talk kullanan Hangouts'u kullanıma sundu. Google, codec'ler ve yankı giderme teknikleri gibi RTC için gereken birçok bileşeni geliştiren GIPS'yi satın aldı. Google, sektörde fikir birliği sağlamak için GIPS tarafından geliştirilen teknolojileri açık kaynaklı hale getirdi ve İnternet Mühendisliği Görev Gücü (IETF) ve World Wide Web Konsorsiyumu'ndaki (W3C) ilgili standart kuruluşlarıyla birlikte çalıştı. Ericsson, Mayıs 2011'de WebRTC'nin ilk uygulamasını geliştirdi.

WebRTC gerçek zamanlı, eklentisiz video, ses ve veri iletişimi için açık standartlar uyguladı. İhtiyaç gerçek bir ihtiyaçtı:

  • Birçok web hizmeti RTC'yi kullanıyordu, ancak indirmelere, yerel uygulamalara veya eklentilere ihtiyaç duyuyordu. Skype, Facebook ve Hangouts bu uygulamalar arasında yer alıyordu.
  • Eklentileri indirmek, yüklemek ve güncellemek karmaşık, hataya açık ve can sıkıcıdır.
  • Eklentileri dağıtmak, hata ayıklamak, sorun gidermek, test etmek ve yönetmek zordur. Ayrıca, karmaşık ve pahalı teknolojilerle lisanslama ve entegrasyon işlemleri gerekebilir. Kullanıcıları eklenti yüklemeye ikna etmek genellikle zordur!

WebRTC projesinin yol gösterici ilkeleri, API'lerinin açık kaynaklı, ücretsiz, standartlaştırılmış, web tarayıcılarında yerleşik olması ve mevcut teknolojilerden daha verimli olması gerektiğidir.

Şimdi neredeyiz?

WebRTC, Google Meet gibi çeşitli uygulamalarda kullanılır. WebRTC ayrıca WebKitGTK+ ve Qt yerel uygulamalarıyla da entegre edilmiştir.

WebRTC, şu üç API'yi uygular: - MediaStream (getUserMedia olarak da bilinir) - RTCPeerConnection - RTCDataChannel

API'ler şu iki spesifikasyonda tanımlanmıştır:

Chrome, Safari, Firefox, Edge ve Opera tarafından mobil ve masaüstünde üç API de desteklenir.

getUserMedia: Demolar ve kod için WebRTC örneklerine bakın veya web sesi girişi olarak getUserMedia kullanan Chris Wilson'ın muhteşem örnekleri deneyin.

RTCPeerConnection: Basit bir demo ve tam işlevli bir görüntülü sohbet uygulaması için sırasıyla WebRTC samples Peer link ve appr.tc'ye göz atın. Bu uygulama, tarayıcı farklılıklarını ve spesifikasyon değişikliklerini soyutlamak için WebRTC topluluğunun yardımıyla Google tarafından yönetilen bir JavaScript dolgusu olan adapter.js'yi kullanır.

RTCDataChannel: Bu uygulamanın işleyiş şeklini görmek için WebRTC örneklerine göz atarak veri kanalı demolarından birine göz atın.

WebRTC codelab'de, görüntülü sohbet ve dosya paylaşımı için basit bir uygulama oluşturmak üzere bu üç API'nin nasıl kullanılacağı gösterilmektedir.

İlk WebRTC'niz

WebRTC uygulamalarının birkaç işlem yapması gerekir:

  • Akışlı ses, video veya diğer verileri alın.
  • IP adresleri ve bağlantı noktaları gibi ağ bilgilerini alıp NAT'lar ve güvenlik duvarları üzerinden bile bağlantıyı etkinleştirmek için bu bilgileri diğer WebRTC istemcileriyle (eşler olarak bilinir) değiştirin.
  • Hataları bildirmek ve oturumları başlatmak veya kapatmak için iletişimi koordine edin.
  • Çözünürlük ve codec'ler gibi medya ve istemci özellikleri hakkında bilgi alışverişinde bulunma
  • Ses, video veya veri akışı sağlayın.

WebRTC, akış verilerini almak ve iletmek için aşağıdaki API'leri uygular:

  • MediaStream, kullanıcının kamerası ve mikrofonu gibi veri akışlarına erişebilir.
  • RTCPeerConnection, şifreleme ve bant genişliği yönetimi için imkanlarla sesli veya görüntülü görüşme yapılmasına olanak tanır.
  • RTCDataChannel, genel verilerin eşler arası iletişim kurmasını sağlar.

(WebRTC'nin ağ ve sinyal yönleri ayrıntılı olarak ileride açıklanacaktır.)

MediaStream API (getUserMedia API olarak da bilinir)

MediaStream API, senkronize edilmiş medya akışlarını temsil eder. Örneğin, kamera ve mikrofon girişinden alınan bir yayında senkronize video ve ses parçaları bulunabilir. (MediaStreamTrack öğesini <track> öğesiyle karıştırmayın. Bu öğe tamamen farklı bir özelliktir.)

MediaStream API'yi anlamanın en kolay yolu muhtemelen bu API'yi kendi ortamında incelemektir:

  1. Tarayıcınızda WebRTC samples getUserMedia'a gidin.
  2. Konsolu açın.
  3. Global kapsamdaki stream değişkenini inceleyin.

Her MediaStream öğesinin, getUserMedia() tarafından oluşturulmuş MediaStream olabilecek bir girişi ve bir video öğesine veya RTCPeerConnection öğesine iletilebilecek bir çıkışı vardır.

getUserMedia() yöntemi, MediaStreamConstraints nesne parametresi alır ve MediaStream nesnesine dönüşen bir Promise döndürür.

Her MediaStream, 'Xk7EuLhsuHKbnjLWkW4yYGNJJ8ONsgwHBvLQ' gibi bir label öğesine sahiptir. MediaStreamTrack dizisi, getAudioTracks() ve getVideoTracks() yöntemleri tarafından döndürülür.

getUserMedia örneğinde stream.getAudioTracks(), boş bir dizi döndürür (ses olmadığı için) ve çalışan bir web kamerasının bağlı olduğu varsayıldığında stream.getVideoTracks(), web kamerasından gelen akışı temsil eden bir MediaStreamTrack dizisi döndürür. Her MediaStreamTrack, bir tür ('video' veya 'audio'), label ('FaceTime HD Camera (Built-in)' gibi) içerir ve bir veya daha fazla ses ya da video kanalını temsil eder. Bu örnekte yalnızca bir video parçası ve ses yok ancak ön kameradan canlı yayın alan bir sohbet uygulaması, arka kamera, mikrofon ve ekranını paylaşan bir uygulama gibi daha fazla özelliğin kullanıldığı kullanım alanlarını kolayca düşünebiliriz.

MediaStream, srcObject özelliği ayarlanarak video öğelerine eklenebilir. Daha önce bu işlem, src özelliği URL.createObjectURL() ile oluşturulan bir nesne URL'sine ayarlanarak yapılıyordu, ancak bu özellik kullanımdan kaldırıldı.

getUserMedia, Web Audio API'sı için giriş düğümü olarak da kullanılabilir:

// Cope with browser differences.
let audioContext;
if (typeof AudioContext === 'function') {
  audioContext = new AudioContext();
} else if (typeof webkitAudioContext === 'function') {
  audioContext = new webkitAudioContext(); // eslint-disable-line new-cap
} else {
  console.log('Sorry! Web Audio not supported.');
}

// Create a filter node.
var filterNode = audioContext.createBiquadFilter();
// See https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section
filterNode.type = 'highpass';
// Cutoff frequency. For highpass, audio is attenuated below this frequency.
filterNode.frequency.value = 10000;

// Create a gain node to change audio volume.
var gainNode = audioContext.createGain();
// Default is 1 (no change). Less than 1 means audio is attenuated
// and vice versa.
gainNode.gain.value = 0.5;

navigator.mediaDevices.getUserMedia({audio: true}, (stream) => {
  // Create an AudioNode from the stream.
  const mediaStreamSource =
    audioContext.createMediaStreamSource(stream);
  mediaStreamSource.connect(filterNode);
  filterNode.connect(gainNode);
  // Connect the gain node to the destination. For example, play the sound.
  gainNode.connect(audioContext.destination);
});

Chromium tabanlı uygulamalar ve uzantılar da getUserMedia içerebilir. Manifest'e audioCapture ve/veya videoCapture izinlerinin eklenmesi, yükleme sonrasında iznin yalnızca bir kez istenmesine ve verilebilmesine imkan tanır. Ardından, kullanıcıdan kamera veya mikrofon erişimi için izin istenmez.

getUserMedia() için yalnızca bir kez izin verilmesi gerekir. İlk seferinde, tarayıcının bilgi çubuğunda İzin Ver düğmesi görüntülenir. getUserMedia() için HTTP erişimi, Güçlü özellik olarak sınıflandırılması nedeniyle 2015'in sonunda Chrome tarafından kullanımdan kaldırılmıştır.

Amaç yalnızca kamera veya mikrofon için değil, herhangi bir akış veri kaynağı için de MediaStream özelliğini etkinleştirmektir. Bu durumda, depolanan verilerden veya sensörler ya da diğer girişler gibi rastgele veri kaynaklarından akış sağlanır.

getUserMedia(), diğer JavaScript API'leri ve kitaplıklarıyla birlikte hayat buluyor:

  • Web Kamerası Oyuncağı, yerel olarak paylaşılabilen veya kaydedilebilen fotoğraflara tuhaf ve muhteşem efektler eklemek için WebGL kullanan bir fotoğraf kabini uygulamasıdır.
  • FaceKat, headtrackr.js ile geliştirilmiş bir yüz izleme oyunudur.
  • ASCII Kamera, ASCII resimler oluşturmak için Canvas API'sini kullanır.
ziyaret edin.
idevelop.ro/ascii-camera tarafından oluşturulan ASCII resim
gUM ASCII sanatı!

Sınırlamalar

getUserMedia() için video çözünürlüğü değerlerini ayarlamak üzere kısıtlamalar kullanılabilir. Bu, en boy oranı gibi diğer kısıtlamaların da desteklenmesine olanak tanır; bakan mod (ön veya arka kamera); kare hızı, yükseklik ve genişlik; ve bir applyConstraints() yöntemi içerir.

Örnek için WebRTC örnekleri getUserMedia: çözünürlük seçin bölümüne bakın.

İzin verilmeyen bir kısıtlama değeri ayarlamak, örneğin istenen bir çözünürlük mevcut değilse DOMException veya OverconstrainedError verir. Bu uygulamanın işleyiş şeklini görmek için demo için WebRTC örnekleri getUserMedia: çözünürlük seçin bölümüne bakın.

Ekran ve sekme görüntüsü

Chrome uygulamaları, chrome.tabCapture ve chrome.desktopCapture API'leri aracılığıyla tek bir tarayıcı sekmesinin veya tüm masaüstünün canlı videosunu paylaşmaya da olanak tanır. (Bir demo ve daha fazla bilgi için bkz. WebRTC ile ekran paylaşımı. Makale birkaç yıl önce yayınlanmış olsa da ilgi çekicidir.)

Ekran görüntüsü, deneysel chromeMediaSource kısıtlamasından yararlanılarak Chrome'da bir MediaStream kaynağı olarak da kullanılabilir. Ekran görüntüsü alma işleminin HTTPS gerektirdiğini ve bu yayında açıklandığı gibi, yalnızca bir komut satırı işareti aracılığıyla etkinleştirilmesi nedeniyle geliştirme amacıyla kullanılması gerektiğini unutmayın.

Sinyal: Oturum kontrolü, ağ ve medya bilgileri

WebRTC, akış verilerini tarayıcılar (eşler olarak da bilinir) arasında iletmek için RTCPeerConnection kullanır. Ancak, iletişimi koordine etmek ve kontrol mesajları göndermek için (sinyal gönderme olarak bilinen bir süreç) bir mekanizmaya da ihtiyaç duyar. Sinyal yöntemleri ve protokoller, WebRTC tarafından belirtilmez. Sinyal, RTCPeerConnection API'nin bir parçası değildir.

Bunun yerine, WebRTC uygulaması geliştiricileri SIP veya XMPP gibi istedikleri mesajlaşma protokolünü ve uygun bir çift yönlü (iki yönlü) iletişim kanalını seçebilir. appr.tc örneğinde, sinyal mekanizması olarak XHR ve Channel API kullanılır. codelab, Düğüm sunucusunda çalışan Socket.io'yu kullanır.

Sinyal, üç tür bilgi alışverişi için kullanılır:

  • Oturum kontrol mesajları: İletişimi başlatmak veya kapatmak ve hataları bildirmek için kullanılır.
  • Ağ yapılandırması: Dış dünyaya, bilgisayarınızın IP adresi ve bağlantı noktası nedir?
  • Medya özellikleri: Tarayıcınız ve iletişim kurmak istediği tarayıcı hangi codec'leri ve çözünürlükleri kullanabilir?

Eşler arası yayının başlayabilmesi için sinyal aracılığıyla bilgi aktarımının başarıyla tamamlanmış olması gerekir.

Örneğin, Aylin'in Ali ile iletişim kurmak istediğini varsayalım. Sinyal oluşturma sürecini uygulamalı olarak gösteren W3C WebRTC spesifikasyonundan bir kod örneğini burada bulabilirsiniz. Kod, createSignalingChannel() yönteminde oluşturulmuş bir sinyal mekanizmasının mevcut olduğunu varsayar. Ayrıca Chrome ve Opera'da RTCPeerConnection kodunun şu anda ön eke sahip olduğunu da unutmayın.

// handles JSON.stringify/parse
const signaling = new SignalingChannel();
const constraints = {audio: true, video: true};
const configuration = {iceServers: [{urls: 'stun:stun.example.org'}]};
const pc = new RTCPeerConnection(configuration);

// Send any ice candidates to the other peer.
pc.onicecandidate = ({candidate}) => signaling.send({candidate});

// Let the "negotiationneeded" event trigger offer generation.
pc.onnegotiationneeded = async () => {
  try {
    await pc.setLocalDescription(await pc.createOffer());
    // Send the offer to the other peer.
    signaling.send({desc: pc.localDescription});
  } catch (err) {
    console.error(err);
  }
};

// Once remote track media arrives, show it in remote video element.
pc.ontrack = (event) => {
  // Don't set srcObject again if it is already set.
  if (remoteView.srcObject) return;
  remoteView.srcObject = event.streams[0];
};

// Call start() to initiate.
async function start() {
  try {
    // Get local stream, show it in self-view, and add it to be sent.
    const stream =
      await navigator.mediaDevices.getUserMedia(constraints);
    stream.getTracks().forEach((track) =>
      pc.addTrack(track, stream));
    selfView.srcObject = stream;
  } catch (err) {
    console.error(err);
  }
}

signaling.onmessage = async ({desc, candidate}) => {
  try {
    if (desc) {
      // If you get an offer, you need to reply with an answer.
      if (desc.type === 'offer') {
        await pc.setRemoteDescription(desc);
        const stream =
          await navigator.mediaDevices.getUserMedia(constraints);
        stream.getTracks().forEach((track) =>
          pc.addTrack(track, stream));
        await pc.setLocalDescription(await pc.createAnswer());
        signaling.send({desc: pc.localDescription});
      } else if (desc.type === 'answer') {
        await pc.setRemoteDescription(desc);
      } else {
        console.log('Unsupported SDP type.');
      }
    } else if (candidate) {
      await pc.addIceCandidate(candidate);
    }
  } catch (err) {
    console.error(err);
  }
};

Öncelikle, Aylin ve Bora ağ bilgisi alışverişinde bulunacaktır. (Adayları bulma ifadesi, ICE çerçevesini kullanarak ağ arayüzlerini ve bağlantı noktalarını bulma sürecini ifade eder.)

  1. Alev, ağ adayları kullanılabilir olduğunda çalışan bir onicecandidate işleyici ile RTCPeerConnection nesnesi oluşturur.
  2. Ayşe, kullandığı sinyal kanalı (ör. WebSocket veya başka bir mekanizma) üzerinden Ahmet'e serileştirilmiş aday verilerini gönderir.
  3. Ayşe'den bir aday mesajı aldığında, adayı uzaktaki benzer açıklamasına eklemek için addIceCandidate adlı kişiyi arar.

WebRTC istemcilerinin (bu örnekte emsaller veya Ayşe ve Bora olarak da bilinir) çözünürlük ve codec özellikleri gibi yerel ve uzaktan ses ve video medya bilgilerini belirleyip değiştirmeleri gerekir. Medya yapılandırma bilgilerini gönderip almak için sinyal, Oturum Açıklaması Protokolü (SDP) ile bir offer ve bir yanıt alışverişinde bulunarak gerçekleşir:

  1. Aylin, RTCPeerConnection createOffer() yöntemini çalıştırır. Bunun dönüşü RTCSessionDescription - Aylin'in yerel oturum açıklaması iletildi.
  2. Geri aramada Aylin yerel açıklamayı setLocalDescription() ile belirler ve bu oturum açıklamasını Barış'ın sinyal kanalı üzerinden gönderir. setLocalDescription() çağrılana kadar RTCPeerConnection adlı operatörün aday toplamaya başlamayacağını unutmayın. Bu, JSEP IETF taslağı olarak kodlanmıştır.
  3. Bora, Ayşe'nin ona gönderdiği açıklamayı setRemoteDescription() kullanarak uzak açıklama olarak ayarlar.
  4. Bülent, RTCPeerConnection createAnswer() yöntemini çalıştırır ve Aylin'inkiyle uyumlu bir yerel oturum oluşturulabilmesi için bu yönteme Aylin'den aldığı uzak açıklamayı iletir. createAnswer() geri çağırması RTCSessionDescription iletildi. Bora, bunu yerel açıklama olarak belirler ve Ayşe'ye gönderir.
  5. Alice, Bulut'un oturum açıklamasını aldığında, bunu setRemoteDescription ile uzak açıklama olarak ayarlar.
  6. Ping!
ziyaret edin.

RTCSessionDescription nesneleri, Oturum Açıklama Protokolü'ne (STP) uyan blob'lardır. Bir SDP nesnesi serileştirildiğinde aşağıdaki gibi görünür:

v=0
o=- 3883943731 1 IN IP4 127.0.0.1
s=
t=0 0
a=group:BUNDLE audio video
m=audio 1 RTP/SAVPF 103 104 0 8 106 105 13 126

// ...

a=ssrc:2223794119 label:H4fjnMzxy3dPIgQ7HxuCTLb4wLLLeRHnFxh810

Ağ ve medya bilgilerinin edinilmesi ve değişimi aynı anda yapılabilir. Ancak eşler arasında ses ve video akışının başlayabilmesi için her iki işlemin de tamamlanmış olması gerekir.

Daha önce açıklanan teklif/yanıt mimarisi, JavaScript Oturum Oluşturma Protokolü veya JSEP olarak adlandırılır. (İlk WebRTC uygulaması için Ericsson'ın tanıtım videosunda sinyal verme ve akış sürecini açıklayan mükemmel bir animasyon var.)

JSEP mimari şeması
JSEP mimarisi

Sinyal verme işlemi başarıyla tamamlandıktan sonra veriler doğrudan eşler arası, arayan ve çağrılan arasında veya bu başarısız olursa ara geçiş sunucusu aracılığıyla eşler arası olarak aktarılabilir (daha sonra bu konuda daha fazla bilgi edineceksiniz). Canlı yayın RTCPeerConnection adlı içerik üreticinin işi.

RTCPeerConnection

RTCPeerConnection, veri akışı için eşler arasında istikrarlı ve verimli iletişim kuran WebRTC bileşenidir.

Aşağıda, RTCPeerConnection rolünü gösteren bir WebRTC mimari diyagramı yer almaktadır. Fark edeceğiniz gibi yeşil renkli kısımlar karmaşık.

WebRTC mimarisi şeması
WebRTC mimarisi (webrtc.org'dan)

Bu diyagramdan anlaşılması gereken en önemli şey, RTCPeerConnection ürününün, web geliştiricilerini altında gizlenen sayısız karmaşıklıktan koruduğudur. WebRTC tarafından kullanılan codec'ler ve protokoller, güvenilir olmayan ağlar üzerinden bile gerçek zamanlı iletişimi mümkün kılmak için büyük işler yapar:

  • Paket kaybını gizleme
  • Yankı giderme
  • Bant genişliği uyarlaması
  • Dinamik ses dalgalanması arabelleğe alma
  • Otomatik kazanç kontrolü
  • Gürültü azaltma ve azaltma
  • Resim temizleme

Önceki W3C kodu, sinyal açısından WebRTC'nin basitleştirilmiş bir örneğini göstermektedir. Aşağıda, çalışan iki WebRTC uygulamasının adım adım açıklamalı kılavuzları verilmiştir. İlki RTCPeerConnection için basit bir örnek, ikincisi ise tamamen işlevsel bir görüntülü sohbet istemcisidir.

Sunucular olmadan RTCPeerConnection

Aşağıdaki kod, bir web sayfasında yerel ve uzak RTCPeerConnection (ve yerel ve uzak video) içeren WebRTC örnekleri Eş bağlantısından alınmıştır. Bu çok yararlı bir şey değildir (arayan ve çağrı alan aynı sayfa üzerindedir), ancak sayfadaki RTCPeerConnection nesneleri ara sinyal mekanizmaları kullanmak zorunda kalmadan doğrudan veri ve mesaj alışverişinde bulunabildiğinden RTCPeerConnection API'nin işleyişini biraz daha anlaşılır hale getirir.

Bu örnekte pc1 yerel eşi (arayan), pc2 ise uzak eşi (çağrıyı) temsil eder.

Arayan

  1. Yeni bir RTCPeerConnection oluşturun ve getUserMedia() üzerinden akış ekleyin: ```js // Sunucular isteğe bağlı bir yapılandırma dosyasıdır. (Daha sonra TURN ve STUN tartışmasına göz atın.) pc1 = new RTCPeerConnection(servers); // ... localStream.getTracks().forEach((track) =&gt; { pc1.addTrack(track, localStream); });
  1. Bir teklif oluşturup bunu pc1 için yerel açıklama ve pc2 için uzak açıklama olarak ayarlayın. Hem arayan hem de arayan aynı sayfada olduğundan bu işlem, sinyal kullanılmadan doğrudan kodun içinde yapılabilir: js pc1.setLocalDescription(desc).then(() => { onSetLocalSuccess(pc1); }, onSetSessionDescriptionError ); trace('pc2 setRemoteDescription start'); pc2.setRemoteDescription(desc).then(() => { onSetRemoteSuccess(pc2); }, onSetSessionDescriptionError );.

Arayan

  1. pc2 oluşturun ve pc1 kaynağındaki akış eklendiğinde bunu bir video öğesinde görüntüleyin: js pc2 = new RTCPeerConnection(servers); pc2.ontrack = gotRemoteStream; //... function gotRemoteStream(e){ vid2.srcObject = e.stream; }

RTCPeerConnection API artı sunucular

Gerçek dünyada WebRTC, ne kadar basit olursa olsun sunuculara ihtiyaç duyar; dolayısıyla aşağıdakiler gerçekleşebilir:

  • Kullanıcılar birbirlerini keşfeder ve gerçek hayattan bilgiler (ör. adlar) paylaşabilir.
  • WebRTC istemci uygulamaları (eşler) ağ bilgilerini alışverişi yapar.
  • Benzerler, medya hakkında (ör. video biçimi ve çözünürlük) veri alışverişinde bulunur.
  • WebRTC istemci uygulamaları, NAT ağ geçitlerini ve güvenlik duvarlarını aktarır.

Diğer bir deyişle WebRTC, dört tür sunucu tarafı işlevine ihtiyaç duyar:

  • Kullanıcı keşfi ve iletişim
  • Sinyal
  • NAT/güvenlik duvarı geçişi
  • Eşler arası iletişimin başarısız olması durumunda geçiş sunucuları

NAT geçişi, eşler arası ağ iletişimi ve kullanıcı keşfi ve sinyal gönderme için sunucu uygulaması oluşturma gereksinimleri bu makalenin kapsamında değildir. STUN protokolü ve uzantısı olan TURN'in, RTCPeerConnection NAT geçişi ve diğer ağ belirsizlikleriyle başa çıkmasını sağlamak için ICE çerçevesi tarafından kullanıldığını söylemek yeterlidir.

ICE, iki görüntülü sohbet istemcisi gibi meslektaşları bir araya getirmeye yönelik bir çerçevedir. Başlangıçta ICE, UDP üzerinden olası en düşük gecikmeyle eşleri doğrudan bağlamaya çalışır. Bu süreçte STUN sunucularının tek bir görevi vardır: bir NAT'nin arkasındaki eşin, genel adresini ve bağlantı noktasını öğrenmesini sağlamak. (STUN ve TURN hakkında daha fazla bilgi için WebRTC uygulaması için gereken arka uç hizmetlerini oluşturma bölümüne bakın.)

Bağlantı adayları bulunuyor
Bağlantı adaylarını bulma

UDP başarısız olursa ICE TCP'yi dener. Doğrudan bağlantı, özellikle kurumsal NAT geçişi ve güvenlik duvarları nedeniyle başarısız olursa ICE bir ara (geçiş) TURN sunucusu kullanır. Başka bir deyişle ICE, eşleri doğrudan bağlamak için STUN ile STUN'u kullanır ve bağlantı kurulamazsa TURN geçiş sunucusuna geri döner. Adayları bulma ifadesi, ağ arayüzlerini ve bağlantı noktalarını bulma sürecini ifade eder.

WebRTC veri yolları
WebRTC veri yolları

WebRTC mühendisi Justin Uberti, 2013 Google I/O WebRTC sunumunda ICE, STUN ve TURN hakkında daha fazla bilgi veriyor. (Sunum slaytlarında TURN ve STUN sunucusu uygulamalarına ilişkin örnekler verilmiştir.)

Basit bir görüntülü sohbet istemcisi

appr.tc adresindeki görüntülü sohbet demosu, STUN sunucusu kullanarak sinyal ve NAT/güvenlik duvarı geçişi içeren WebRTC'yi denemek için iyi bir yerdir. Bu uygulama, uygulamaları spesifikasyon değişikliklerinden ve ön ek farklılıklarından yalıtmak için bir dolgu olan adapter.js'yi kullanır.

Kod, günlük kaydında kasıtlı olarak ayrıntılı bir şekilde eklenmiştir. Etkinliklerin sırasını anlamak için konsolu kontrol edin. Aşağıda, bu koda ilişkin ayrıntılı bir adım adım açıklamalı kılavuz yer almaktadır.

Ağ topolojileri

WebRTC, şu anda yalnızca bire bir iletişimi destekler ancak daha karmaşık ağ senaryolarında kullanılabilir. Örneğin, her biri doğrudan veya Çok Noktalı Kontrol Birimi (MCU) üzerinden iletişim kuran birden fazla eş, çok sayıda katılımcıyı yönetebilen, seçmeli yayın yönlendirme ve ses ile videonun karıştırılması ya da kaydedilmesi gibi bir sunucu üzerinden kullanılabilir.

Çok noktalı kontrol birimi topolojisi diyagramı
Çok noktalı kontrol birimi topolojisi örneği

Mevcut WebRTC uygulamalarının çoğu yalnızca web tarayıcıları arasındaki iletişimi gösterir, ancak ağ geçidi sunucuları, tarayıcıda çalışan bir WebRTC uygulamasının telefonlar (PSTN olarak da bilinir) ve VOIP sistemleriyle etkileşimde bulunmasını sağlayabilir. Mayıs 2012'de Doubango Telecom, WebRTC ve WebSocket ile oluşturulan sipml5 SIP istemcisini açık kaynaklı hale getirdi. Bu istemci, (diğer olası kullanımların yanı sıra) iOS ve Android üzerinde çalışan tarayıcılar ile uygulamalar arasında görüntülü görüşmeler yapılmasına olanak tanıyor. Google I/O'da Tethr ve Tropo, özellikli telefonlar ve bilgisayarlar arasında WebRTC aracılığıyla iletişim kurulmasını sağlamak için OpenBTS hücresi kullanan bir evrak çantasında felaket iletişimi çerçevesinde bir çerçeve sundu. Operatör olmadan telefon iletişimi!

Google I/O 2012&#39;de Tethr/Tropo demosu
Tethr/Tropo: Evrak çantasında afet iletişimleri

RTCDataChannel API<

WebRTC, ses ve videonun yanı sıra diğer veri türleri için de gerçek zamanlı iletişimi destekler.

RTCDataChannel API, düşük gecikme ve yüksek işleme hızıyla rastgele verilerin eşler arası değişimini sağlar. Tek sayfalık demolar ve basit bir dosya aktarım uygulamasının nasıl oluşturulacağını öğrenmek için sırasıyla WebRTC örnekleri ve WebRTC codelab bölümlerine bakın.

API'nin aşağıdakiler dahil birçok olası kullanım alanı vardır:

  • Oyun
  • Uzaktan masaüstü uygulamaları
  • Gerçek zamanlı metin sohbeti
  • Dosya aktarımı
  • Merkezi olmayan ağlar

API, RTCPeerConnection uygulamasından en iyi şekilde yararlanmanızı sağlayacak ve güçlü ve esnek eşler arası iletişim sağlayacak çeşitli özelliklere sahiptir:

  • RTCPeerConnection oturumu kurulumundan yararlanın
  • Önceliklendirmeli birden çok eş zamanlı kanal
  • Güvenilir ve güvenilir olmayan yayınlama semantiği
  • Yerleşik güvenlik (DTLS) ve tıkanıklık kontrolü
  • Ses veya video ile veya bunlar olmadan kullanım olanağı

Söz dizimi, send() yöntemi ve message etkinliği olan WebSocket'e kasıtlı olarak benzer:

const localConnection = new RTCPeerConnection(servers);
const remoteConnection = new RTCPeerConnection(servers);
const sendChannel =
  localConnection.createDataChannel('sendDataChannel');

// ...

remoteConnection.ondatachannel = (event) => {
  receiveChannel = event.channel;
  receiveChannel.onmessage = onReceiveMessage;
  receiveChannel.onopen = onReceiveChannelStateChange;
  receiveChannel.onclose = onReceiveChannelStateChange;
};

function onReceiveMessage(event) {
  document.querySelector("textarea#send").value = event.data;
}

document.querySelector("button#send").onclick = () => {
  var data = document.querySelector("textarea#send").value;
  sendChannel.send(data);
};

İletişim tarayıcılar arasında doğrudan gerçekleşir. Dolayısıyla, güvenlik duvarlarıyla ve NAT'lerle başa çıkmak için delik açma işlemi başarısız olduğunda geçiş (TURN) sunucusu gerekli olsa bile RTCDataChannel WebSocket'ten çok daha hızlı olabilir.

RTCDataChannel; Chrome, Safari, Firefox, Opera ve Samsung Internet'te kullanılabilir. Cube Slam oyunu, oyun durumunu bildirmek için API'yi kullanır. Bir arkadaşınızla oynayın veya ayıyla oynayın! Yenilikçi platform Sharefest, RTCDataChannel ve peerCDN üzerinden dosya paylaşımını mümkün kıldı. Bu sayede, WebRTC'nin eşler arası içerik dağıtımına nasıl olanak sağlayabileceğine dair fikir sahibi oldu.

RTCDataChannel hakkında daha fazla bilgi için IETF'nin taslak protokol spesifikasyonuna göz atın.

Güvenlik

Gerçek zamanlı iletişim uygulamaları veya eklentileri, güvenliği tehlikeye atabilir. Örneğin:

  • Şifrelenmemiş medya veya verilere tarayıcılar ya da tarayıcı ile sunucu arasında müdahale edilebilir.
  • Bir uygulama kullanıcının haberi olmadan video veya ses kaydedip dağıtabilir.
  • Kötü amaçlı yazılımlar veya virüsler, zararsız gibi görünen bir eklenti veya uygulamayla birlikte yüklenmiş olabilir.

WebRTC, bu sorunları önleyen çeşitli özelliklere sahiptir:

  • WebRTC uygulamaları, DTLS ve SRTP gibi güvenli protokolleri kullanır.
  • Sinyal mekanizmaları dahil tüm WebRTC bileşenleri için şifreleme zorunludur.
  • WebRTC bir eklenti değildir. Bileşenleri, tarayıcının korumalı alanında çalışır, ayrı bir işlemde çalışmaz. Bileşenler ayrı yükleme gerektirmez ve tarayıcı her güncellendiğinde güncellenir.
  • Kamera ve mikrofon erişimine açık bir şekilde izin verilmelidir. Kamera veya mikrofon çalışırken bu, kullanıcı arayüzü tarafından net bir şekilde gösterilmelidir.

Medya akışı güvenliğiyle ilgili konuların tamamı bu makalenin kapsamı dışındadır. Daha fazla bilgi için IETF tarafından önerilen Önerilen WebRTC Güvenlik Mimarisi'ne bakın.

Sonuç

WebRTC'nin API'leri ve standartları; telefon, oyun, video prodüksiyonu, müzik yapımı ve haber toplama da dahil olmak üzere içerik oluşturma ve iletişim araçlarını demokratikleştirebilir ve merkezi olmayan bir hale getirebilir.

Teknoloji bundan çok daha rahatsız edici değil.

Blog yazarı Phil Edholm'un söylediği gibi, "Potansiyel olarak, WebRTC ve HTML5, gerçek zamanlı iletişimde, orijinal tarayıcının bilgi için sağladığı aynı dönüşümü sağlayabilir."

Geliştirici araçları

Daha fazla bilgi

Standartlar ve protokoller

WebRTC destek özeti

MediaStream ve getUserMedia API'leri

  • Chrome masaüstü 18.0.1008 ve sonraki sürümler; Android 29 ve sonraki sürümler için Chrome
  • Opera 18 ve sonraki sürümler; Android 20 ve sonraki sürümler için Opera
  • Opera 12, Opera Mobile 12 (Presto motoruna dayalı)
  • Firefox 17 ve sonraki sürümler
  • Microsoft Edge 16 ve sonraki sürümler
  • iOS'te Safari 11.2 ve sonraki sürümler, MacOS'te 11.1 ve sonraki sürümler
  • Android'de UC 11.8 ve sonraki sürümler
  • Samsung Internet 4 ve sonraki modeller

RTCPeerConnection API'si

  • Chrome masaüstü 20 ve sonraki sürümler; Android için Chrome 29 ve sonraki sürümler (işaretsiz)
  • Opera 18 ve sonraki sürümler (varsayılan olarak etkindir); Android 20 ve sonraki sürümleri için Opera (varsayılan olarak etkindir)
  • Firefox 22 ve daha yeni sürümler (varsayılan olarak etkindir)
  • Microsoft Edge 16 ve sonraki sürümler
  • iOS'te Safari 11.2 ve sonraki sürümler, MacOS'te 11.1 ve sonraki sürümler
  • Samsung Internet 4 ve sonraki modeller

RTCDataChannel API'si

  • Chrome 25'te deneysel sürüm, ancak Chrome 26 ve sonraki sürümlerde daha kararlı (ve Firefox birlikte çalışabilirlik özelliği vardır); Android 29 ve sonraki sürümler için Chrome
  • Opera 18 ve daha sonraki sürümlerde kararlı sürüm (ve Firefox birlikte çalışabilirlik özelliği vardır); Android 20 ve sonraki sürümler için Opera
  • Firefox 22 ve daha yeni sürümler (varsayılan olarak etkindir)

API'ler için getUserMedia ve RTCPeerConnection gibi platformlar arası destek hakkında daha ayrıntılı bilgi edinmek istiyorsanız caniuse.com ve Chrome Platform Durumu sayfalarını ziyaret edin.

RTCPeerConnection için yerel API'ler webrtc.org sitesindeki dokümanlarda da mevcuttur.