← WebRTC 1.0 Spesifikasyonu

RTP Medya API

W3C WebRTC 1.0 Spesifikasyonu — Türkçe Çeviri

5. RTP Medya API

RTP medya API’si, bir web uygulamasının eşler arası bir bağlantı üzerinden MediaStreamTrack’ler göndermesine ve almasına olanak tanır. İzler bir RTCPeerConnection’a eklendiğinde sinyalleşmeye yol açar; bu sinyalleşme uzak bir eşe iletildiğinde, uzak tarafta karşılık gelen izlerin oluşturulmasına neden olur.

Bir RTCPeerConnection tarafından gönderilen izler ile diğeri tarafından alınan izler arasında bire bir (1:1) tam bir eşleşme yoktur. Öncelikle, gönderilen izlerin kimlikleri alınan izlerin kimlikleriyle eşleşmez. Ayrıca, replaceTrack, bir RTCRtpSender tarafından gönderilen izi, alıcı tarafında yeni bir iz oluşturmadan değiştirir; karşılık gelen RTCRtpReceiver yalnızca tek bir ize sahip olur ve bu iz, potansiyel olarak bir araya getirilmiş birden fazla medya kaynağını temsil edebilir. Hem addTransceiver hem de replaceTrack, aynı izin birden fazla kez gönderilmesine neden olacak şekilde kullanılabilir; bu durum alıcı tarafında, her biri kendi ayrı izine sahip birden fazla alıcı olarak gözlemlenir. Bu nedenle, gerekirse RTCRtpTransceiver’ın mid’i kullanılarak göndericiler ve alıcılar eşleştirilmek suretiyle, bir taraftaki bir RTCRtpSender ile diğer taraftaki bir RTCRtpReceiver’ın izi arasında bire bir bir ilişki olduğunu düşünmek daha doğrudur.

Medya gönderilirken, göndericinin; SDP tarafından müzakere edilen zarf, kodlayıcının hizalama kısıtları ya da hatta CPU aşırı kullanım tespiti veya bant genişliği kestirimi gibi çeşitli gereksinimleri karşılamak için medyayı yeniden ölçeklendirmesi veya yeniden örneklemesi gerekebilir.

[RFC9429]’daki kurallara (bölüm 3.6.) uygun olarak, video AZALTILABİLİR. Girdi kaynağında meydana gelmemiş sahte veriler oluşturmak için medya BÜYÜTÜLMEMELİDİR; piksel sayıları üzerindeki kısıtları karşılamak için gerekli olanlar dışında medya KIRPILMAMALIDIR ve en-boy oranı DEĞİŞTİRİLMEMELİDİR.

WebRTC Çalışma Grubu, bu durumun daha karmaşık bir şekilde ele alınmasının gerekliliği ve zamanlaması konusunda uygulama geri bildirimi aramaktadır. Olası bazı tasarımlar GitHub issue 1283 içinde tartışılmıştır.

Video, scaleResolutionDownBy sonucunda yeniden ölçeklendirildiğinde, ortaya çıkan genişlik veya yüksekliğin bir tam sayı olmadığı durumlar meydana gelebilir. Kullanıcı aracısı, bir kodlayıcının asgari çözünürlüğüne uymak dışında, scaleResolutionDownBy’dan elde edilen ölçeklenmiş genişlik ve yüksekliğin tam sayı kısmından daha büyük video GÖNDERMEMELİDİR. Ölçeklenmiş genişlik veya yüksekliğin tam sayı kısmının sıfır olması durumunda neyin gönderileceği uygulamaya bağlıdır.

MediaStreamTrack’lerin gerçek kodlanması ve iletimi RTCRtpSender olarak adlandırılan nesneler aracılığıyla yönetilir. Benzer şekilde, MediaStreamTrack’lerin alınması ve kod çözümü RTCRtpReceiver olarak adlandırılan nesneler aracılığıyla yönetilir. Her RTCRtpSender en fazla bir izle ilişkilidir ve alınacak her iz tam olarak bir RTCRtpReceiver ile ilişkilidir.

Her bir MediaStreamTrack’in kodlanması ve iletimi, özelliklerinin (video izleri için width, height ve frameRate; ses izleri için sampleSize, sampleRate ve channelCount) makul bir ölçüde uzak tarafta oluşturulan iz tarafından korunacak şekilde YAPILMALIDIR. Bunun geçerli olmadığı durumlar vardır; örneğin her iki uçta ya da ağda kaynak kısıtları olabilir veya uygulamanın farklı davranmasını talimatlandıran RTCRtpSender ayarları uygulanmış olabilir.

Bir RTCPeerConnection nesnesi, eşleştirilmiş göndericileri ve alıcıları bazı paylaşılan durumlarla temsil eden bir RTCRtpTransceiver kümesi içerir. Bu küme, RTCPeerConnection nesnesi oluşturulduğunda boş küme olarak başlatılır. RTCRtpSender’lar ve RTCRtpReceiver’lar her zaman bir RTCRtpTransceiver ile aynı anda oluşturulur ve yaşam süreleri boyunca ona bağlı kalırlar. RTCRtpTransceiver’lar, uygulama addTrack() yöntemi aracılığıyla bir MediaStreamTrack’i bir RTCPeerConnection’a bağladığında örtük olarak ya da uygulama addTransceiver yöntemini kullandığında açıkça oluşturulur. Ayrıca, yeni bir medya tanımı içeren bir uzak tanım uygulandığında da oluşturulurlar. Ek olarak, uzak uç noktanın gönderilecek medyası olduğunu belirten bir uzak tanım uygulandığında, ilgili MediaStreamTrack ve RTCRtpReceiver, track olayı aracılığıyla uygulamaya sunulur.

Bir RTCRtpTransceiver’ın başka bir uç nokta ile medya gönderebilmesi ve/veya alabilmesi için, her iki uç noktanın da aynı medya tanımıyla ilişkilendirilmiş bir RTCRtpTransceiver nesnesine sahip olacak şekilde SDP ile müzakere edilmesi gerekir.

Bir teklif oluşturulurken, o uçtaki tüm transceiver’ları kapsayacak kadar medya tanımı üretilecektir. Bu teklif yerel tanım olarak ayarlandığında, ilişkilendirilmemiş tüm transceiver’lar teklifteki medya tanımlarıyla ilişkilendirilir.

Bir teklif uzak tanım olarak ayarlandığında, içindeki ve henüz bir transceiver ile ilişkilendirilmemiş tüm medya tanımları yeni veya mevcut bir transceiver ile ilişkilendirilir. Bu durumda yalnızca addTrack() yöntemiyle oluşturulmuş ve ilişkilendirilmemiş transceiver’lar ilişkilendirilebilir. Buna karşılık, addTransceiver() yöntemiyle oluşturulmuş ve ilişkilendirilmemiş transceiver’lar, uzak teklifte medya tanımları mevcut olsa bile ilişkilendirilmez. Bunun yerine, yeterli sayıda addTrack() ile oluşturulmuş transceiver yoksa, yeni transceiver’lar oluşturulur ve ilişkilendirilir. Bu durum, addTrack() ile oluşturulan ve addTransceiver() ile oluşturulan transceiver’ları, özniteliklerine bakılarak gözlemlenemeyen kritik bir şekilde birbirinden ayırır.

Bir yanıt oluşturulurken, yalnızca teklifte mevcut olan medya tanımları yanıtta listelenebilir. Bunun bir sonucu olarak, uzak teklif ayarlanırken ilişkilendirilmemiş olan tüm transceiver’lar, yerel yanıt ayarlandıktan sonra da ilişkilendirilmemiş olarak kalır. Bu durum, yanıtlayanın bir takip teklifi oluşturmasıyla, başka bir teklif/yanıt değişimini başlatmasıyla ya da addTrack() ile oluşturulmuş transceiver’lar kullanılıyorsa, ilk değişimde yeterli sayıda medya tanımının sunulduğundan emin olunmasıyla giderilebilir.

5.5 RTCDtlsTransport Arayüzü

RTCDtlsTransport arayüzü, bir uygulamanın RTCRtpSender ve RTCRtpReceiver nesneleri tarafından RTP ve RTCP paketlerinin gönderilip alındığı Datagram Transport Layer Security (DTLS) taşıması hakkında bilgiye erişmesine olanak tanır; ayrıca veri kanalları tarafından gönderilip alınan SCTP paketleri gibi diğer verilere de erişim sağlar. Özellikle, DTLS alttaki bir taşımaya güvenlik ekler ve RTCDtlsTransport arayüzü, alttaki taşıma ve eklenen güvenlik hakkında bilgilere erişim sağlar. RTCDtlsTransport nesneleri, setLocalDescription() ve setRemoteDescription() çağrıları sonucunda oluşturulur. Her bir RTCDtlsTransport nesnesi, belirli bir RTCRtpTransceiver’ın RTP veya RTCP component’i için DTLS taşıma katmanını ya da [RFC8843] aracılığıyla böyle bir grubun müzakere edilmesi durumunda bir RTCRtpTransceiver grubunu temsil eder.

Mevcut bir RTCRtpTransceiver için yeni bir DTLS ilişkilendirmesi, yeni bir nesneyle temsil edilmek yerine, state değeri buna göre güncellenecek olan mevcut bir RTCDtlsTransport nesnesiyle temsil edilir.

Bir RTCDtlsTransport, "new" olarak başlatılan bir [[DtlsTransportState]] iç yuvasına ve boş bir liste olarak başlatılan bir [[RemoteCertificates]] yuvasına sahiptir.

Alttaki DTLS taşıması, sertifika doğrulama hatası veya ölümcül bir uyarı (bkz. [RFC5246] bölüm 7.2) gibi bir hata yaşadığında, kullanıcı aracısı aşağıdaki adımları çalıştıran bir görevi kuyruğa almalıdır (MUST):

  1. transport, durum güncellemesini ve hata bildirimini alacak RTCDtlsTransport nesnesi olsun.
  2. transport durumunun zaten "failed" olması hâlinde, bu adımları sonlandır.
  3. transport.[[DtlsTransportState]] değerini "failed" olarak ayarla.
  4. Uygun olduğu şekilde errorDetail özniteliği "dtls-failure" veya "fingerprint-failure" olarak ayarlanmış ve diğer alanları RTCErrorDetailType enum açıklamasında belirtildiği gibi doldurulmuş bir RTCErrorEvent arayüzü kullanarak transport üzerinde error adlı bir olay tetikle.
  5. transport üzerinde statechange adlı bir olay tetikle.

Alttaki DTLS taşımasının, karşılık gelen RTCDtlsTransport nesnesinin durumunu başka herhangi bir nedenle güncellemesi gerektiğinde, kullanıcı aracısı aşağıdaki adımları çalıştıran bir görevi kuyruğa almalıdır (MUST):

  1. transport, durum güncellemesini alacak RTCDtlsTransport nesnesi olsun.
  2. newState, yeni durum olsun.
  3. transport.[[DtlsTransportState]] değerini newState olarak ayarla.
  4. newState connected ise, newRemoteCertificates uzak tarafça kullanılan sertifika zinciri olsun; her bir sertifika ikili Distinguished Encoding Rules (DER) [X690] ile kodlanmış olsun ve transport.[[RemoteCertificates]] değerini newRemoteCertificates olarak ayarla.
  5. transport üzerinde statechange adlı bir olay tetikle.
WebIDL[Exposed=Window]
                        interface RTCDtlsTransport : EventTarget {
                          [SameObject] readonly attribute RTCIceTransport iceTransport;
                          readonly attribute RTCDtlsTransportState state;
                          sequence<ArrayBuffer> getRemoteCertificates();
                          attribute EventHandler onstatechange;
                          attribute EventHandler onerror;
                        };

Öznitelikler

iceTransport türü RTCIceTransport, salt okunur

iceTransport özniteliği, paketlerin gönderilip alınmasında kullanılan alttaki taşımadır. Alttaki taşıma, birden fazla etkin RTCDtlsTransport nesnesi arasında paylaşılamayabilir.

state türü RTCDtlsTransportState, salt okunur

state özniteliği, okunurken MUST [[DtlsTransportState]] yuvasının değerini döndürmelidir.

onstatechange türü EventHandler

Bu olay işleyicisinin olay türü statechange’dir.

onerror türü EventHandler

Bu olay işleyicisinin olay türü error’dır.

Yöntemler

getRemoteCertificates

[[RemoteCertificates]] değerini döndürür.

5.5.1 RTCDtlsTransportState Enum

WebIDLenum RTCDtlsTransportState {
                          "new",
                          "connecting",
                          "connected",
                          "closed",
                          "failed"
                        };
Enum değeri Açıklama
new DTLS henüz müzakereye başlamamıştır.
connecting DTLS güvenli bir bağlantıyı müzakere etme ve uzak parmak izini doğrulama sürecindedir.
connected DTLS güvenli bir bağlantının müzakeresini tamamlamış ve uzak parmak izini doğrulamıştır.
closed Taşıma, close_notify uyarısının alınması veya close() çağrılması sonucunda kasıtlı olarak kapatılmıştır.
failed Taşıma, bir hata sonucunda (örneğin bir hata uyarısının alınması veya uzak parmak izinin doğrulanamaması) başarısız olmuştur.

: RTCDtlsTransportState Numaralandırma açıklaması

5.5.2 RTCDtlsFingerprint Sözlüğü

RTCDtlsFingerprint sözlüğü, [RFC4572]’de açıklandığı üzere karma işlevi algoritmasını ve sertifika parmak izini içerir.

WebIDLdictionary RTCDtlsFingerprint {
                          DOMString algorithm;
                          DOMString value;
                        };

RTCDtlsFingerprint Sözlüğü Üyeleri

algorithm · DOMString

‘Hash function Textual Names’ kayıt defterinde [IANA-HASH-FUNCTION] tanımlanan karma işlevi algoritmalarından biri.

value · DOMString

[RFC4572] Bölüm 5’teki ‘fingerprint’ sözdizimi kullanılarak ifade edilen, küçük harfli onaltılık dize biçimindeki sertifika parmak izi değeri.