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.
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.
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.
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):
-
transport, durum güncellemesini ve hata bildirimini alacakRTCDtlsTransportnesnesi olsun. -
transportdurumunun zaten "failed" olması hâlinde, bu adımları sonlandır. -
transport.[[DtlsTransportState]]değerini "failed" olarak ayarla. -
Uygun olduğu şekilde errorDetail özniteliği
"
dtls-failure" veya "fingerprint-failure" olarak ayarlanmış ve diğer alanlarıRTCErrorDetailTypeenum açıklamasında belirtildiği gibi doldurulmuş birRTCErrorEventarayüzü kullanaraktransportüzerindeerroradlı bir olay tetikle. -
transportüzerindestatechangeadlı 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):
-
transport, durum güncellemesini alacakRTCDtlsTransportnesnesi olsun. newState, yeni durum olsun.-
transport.[[DtlsTransportState]]değerininewStateolarak ayarla. -
newStateconnectedise,newRemoteCertificatesuzak tarafça kullanılan sertifika zinciri olsun; her bir sertifika ikili Distinguished Encoding Rules (DER) [X690] ile kodlanmış olsun vetransport.[[RemoteCertificates]]değerininewRemoteCertificatesolarak ayarla. -
transportüzerindestatechangeadlı 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
statechange’dir.onerror türü EventHandler
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.