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.3 RTCRtpReceiver Arayüzü
RTCRtpReceiver arayüzü, bir uygulamanın bir
MediaStreamTrack alımını incelemesine olanak tanır.
Bir dize olan kind ile bir RTCRtpReceiver oluşturmak için
aşağıdaki adımları izleyin:
-
receiveryeni birRTCRtpReceivernesnesi olsun. -
track, [GETUSERMEDIA] tarafından belirtilen yeni birMediaStreamTracknesnesi olsun.track’in kaynağı,receivertarafından sağlanan uzak bir kaynaktır.track.iddeğerinin kullanıcı aracısı tarafından üretildiğini ve uzak taraftaki herhangi bir iz kimliğiyle eşleşmediğini unutmayın. -
track.kinddeğerinikindolarak başlatın. -
track.labeldeğerini,"remote "dizesi ilekinddeğerinin birleştirilmesi sonucuyla başlatın. -
track.readyStatedeğeriniliveolarak başlatın. -
track.muteddeğerinitrueolarak başlatın.mutedözniteliğinin birMediaStreamTrack’in medya verisi alıp almadığını nasıl yansıttığına ilişkin MediaStreamTrack bölümüne bakın. -
receiveriçin[[ReceiverTrack]]dahili yuvasınıtrackile başlatın. -
receiveriçin[[ReceiverTransport]]dahili yuvasınınullile başlatın. -
receiveriçin[[LastStableStateReceiverTransport]]dahili yuvasınınullile başlatın. -
receiveriçin, bu alıcınınMediaStreamTracknesnesinin ilişkilendirildiğiMediaStreamnesnelerinin bir listesini temsil eden[[AssociatedRemoteMediaStreams]]dahili yuvasını oluşturun ve boş bir liste ile başlatın. -
receiveriçin[[LastStableStateAssociatedRemoteMediaStreams]]dahili yuvasını oluşturun ve boş bir liste ile başlatın. -
receiveriçin,RTCRtpCodecParameterssözlüklerinden oluşan bir listeyi temsil eden[[ReceiveCodecs]]dahili yuvasını oluşturun ve boş bir liste ile başlatın. -
receiveriçin[[LastStableStateReceiveCodecs]]dahili yuvasını oluşturun ve boş bir liste ile başlatın. -
receiveriçin[[JitterBufferTarget]]dahili yuvasınınullile başlatın. receiver’ı döndürün.
WebIDL[Exposed=Window]
interface RTCRtpReceiver {
readonly attribute MediaStreamTrack track;
readonly attribute RTCDtlsTransport? transport;
static RTCRtpCapabilities? getCapabilities(DOMString kind);
RTCRtpReceiveParameters getParameters();
sequence<RTCRtpContributingSource> getContributingSources();
sequence<RTCRtpSynchronizationSource> getSynchronizationSources();
Promise<RTCStatsReport> getStats();
attribute DOMHighResTimeStamp? jitterBufferTarget;
};
Öznitelikler
track türü MediaStreamTrack, salt okunur
track özniteliği, bu RTCRtpReceiver nesnesi
receiver ile ilişkilendirilmiş izdir.
track.stop() çağrısının nihai olduğunu,
klonların ise etkilenmediğini unutmayın.
receiver.track.stop() çağrısı
receiver’ı örtük olarak durdurmadığından, Alıcı Raporları
gönderilmeye devam eder. Getirildiğinde, öznitelik MUST
[[ReceiverTrack]] yuvasının
değerini döndürmelidir.
transport türü RTCDtlsTransport, salt okunur,
null olabilir
transport özniteliği, alıcının track’i için
medyanın RTP paketleri biçiminde alındığı taşıma katmanıdır.
RTCDtlsTransport nesnesi oluşturulmadan önce
transport özniteliği null olacaktır.
Birleştirme (bundling) kullanıldığında, birden fazla
RTCRtpReceiver nesnesi tek bir
transport paylaşır ve hepsi RTP ve RTCP’yi aynı taşıma
üzerinden alır.
Getirildiğinde, öznitelik MUST
[[ReceiverTransport]] yuvasının
değerini döndürmelidir.
jitterBufferTarget türü DOMHighResTimeStamp,
null olabilir
RTCRtpReceiver’ın jitter
arabelleğinin tutacağı medya için milisaniye cinsinden hedef bir süre
belirtmesine olanak tanır. Bu, kullanıcı aracısı tarafından yapılan
arabelleğe alma miktarını etkiler; bu da yeniden iletimleri ve paket
kaybı kurtarmasını etkiler. Hedef değerin değiştirilmesi, uygulamaların
oynatma gecikmesi ile ağ jitter’ı nedeniyle ses veya video karelerinin
tükenmesi riski arasındaki dengeyi kontrol etmesine olanak tanır.
Kullanıcı aracısı, ağ koşulları ve bellek kısıtlamalarına bağlı olarak sağlayabildiği veya sağlamayı tercih ettiği sınırları yansıtan, her an değişebilen, izin verilen bir asgari hedef ve bir azami hedefe MUST sahip olmalıdır.
jitterBufferDelay deltası bölü
jitterBufferEmittedCount deltası olarak ölçülebilir.
DTX kullanılsa bile ortalama bir gecikme beklenir. Örneğin, DTX kullanılıyorsa ve sessizlikten sonra paketler akmaya başlarsa, daha büyük hedefler kullanıcı aracısının bu paketleri çalmak yerine arabelleğe almasını etkileyebilir.
Alınırken, bu öznitelik
[[JitterBufferTarget]] iç
yuvasının değerini MUST döndürmelidir.
Ayarlanırken, kullanıcı aracısı aşağıdaki adımları MUST çalıştırmalıdır:
-
receiver, ayarlayıcının çağrıldığıRTCRtpReceivernesnesi olsun. target, ayarlayıcıya verilen argüman olsun.-
targetnegatifse veya 4000 milisaniyeden büyükse, birRangeErrorfırlatın. -
receivernesnesinin[[JitterBufferTarget]]değerinitargetolarak ayarlayın. -
track,receivernesnesinin[[ReceiverTrack]]değeri olsun. - paralel olarak, aşağıdaki adımları yürütmeye başlayın:
-
Alttaki sistemi yeni
targethakkında veyatargetnullise bir uygulama tercihi olmadığı konusunda güncelleyin.
Eğer track,
ses/görüntü senkronizasyonu
için başka bir RTCRtpReceiver nesnesinin parçası ile
senkronize ise, kullanıcı aracısı her iki alıcı için de iki alıcının
[[JitterBufferTarget]]
değerlerinden daha büyük olanını SHOULD kullanmalıdır.
Alttaki sistem bir jitter arabellek hedefi uygularken, gerçek jitter arabellek hedefinin izin verilen en düşük hedef ile izin verilen en yüksek hedef arasında sınırlandırıldığından sürekli olarak emin olacaktır.
[[JitterBufferTarget]] iç
yuvasına yansıtılmaz.
- Alttaki sistemin jitter arabellek hedefinin değiştirilmesi, kullanıcı deneyimine zarar vermemek için dahili ses veya video arabelleğe almayı kademeli olarak etkilemelidir. Ses örnekleri veya video kareleri, ses/görüntü senkronizasyonu için yapıldığı gibi veya tıkanıklık denetimine yanıt olarak, oynatım öncesinde SHOULD hızlandırılmalı ya da yavaşlatılmalıdır.
Hızlandırma veya yavaşlatma oranı, ağ koşullarına veya alınan sesin türüne (örneğin konuşma veya arka plan gürültüsü) bağlı olarak değişebilir. Paketlerin alındığı varsayıldığında, 1 saniyelik arabelleğe alma elde etmek birkaç saniye MAY sürebilir ancak 30 saniyeden fazla SHOULD sürmemelidir. Hız, ses ve video için farklı MAY olabilir.
insertedSamplesForDeceleration ve
removedSamplesForAcceleration ile ölçülebilir. Video için
bu durum aynı karenin birden fazla kez oluşturulmasına veya karelerin
düşürülmesine yol açabilir.
Yöntemler
getCapabilities · static
Statik RTCRtpReceiver.getCapabilities() yöntemi, herhangi bir kaynak, port veya başka bir
durum ayırmadan, kullanıcı aracısının verilen türde ortam almaya
yönelik desteklediği yetenek türlerini keşfetmenin bir yolunu
sağlar.
getCapabilities yöntemi çağrıldığında, kullanıcı
aracısı aşağıdaki adımları MUST çalıştırmalıdır:
kind, yöntemin ilk argümanı olsun.-
kindne"video"ne de"audio"isenulldöndürün. -
codecsüyesikindiçin uygulanmış alma codec’leri listesiyle,headerExtensionsüyesi isekindiçin alma amacıyla uygulanmış başlık uzantıları listesiyle başlatılmış yeni birRTCRtpCapabilitiessözlüğü döndürün.
Verilen kind için uygulanmış alma codec’leri listesi,
kullanıcı aracısının verilen türde (video veya ses) ortam almaya yönelik
desteklediği codec’lerin en iyimser görünümünü temsil eden, uygulamaya
özgü bir RTCRtpCodec sözlükleri listesidir.
Verilen kind için uygulanmış alma başlık uzantıları
listesi, kullanıcı aracısının verilen türde (video veya ses) ortam
almaya yönelik desteklediği başlık uzantılarının iyimser bir görünümünü
temsil eden, uygulamaya özgü bir
RTCRtpHeaderExtensionCapability sözlükleri listesidir.
Bu yetenekler, cihaz hakkında genellikle kalıcı ve çapraz-kökenli bilgiler sağlar ve dolayısıyla uygulamanın parmak izi çıkarma yüzeyini artırır. Gizliliğe duyarlı bağlamlarda, kullanıcı aracılarının yalnızca yeteneklerin ortak bir alt kümesini raporlamak gibi azaltıcı önlemleri MAY değerlendirmesi mümkündür. !(Bu bir parmak izi vektörüdür.){width="15" height="21"}
setCodecPreferences() algoritmasını ve hangi girdilerde
InvalidModificationError fırlattığını etkiler ve gizlilik
azaltmalarının etkili olmasını sağlamak için, alım için müzakere
edilen codec’ler hakkında createOffer() ve
createAnswer() tarafından ortaya çıkarılan
bilgilerle de tutarlı olmalıdır.
getParameters
getParameters() yöntemi,
RTCRtpReceiver nesnesinin track öğesinin nasıl
çözüldüğüne ilişkin geçerli parametrelerini döndürür.
getParameters çağrıldığında,
RTCRtpReceiveParameters sözlüğü aşağıdaki şekilde
oluşturulur:
-
headerExtensionsdizisi, alıcının şu anda almaya hazır olduğu başlık uzantılarına göre doldurulur. -
codecs,[[ReceiveCodecs]]iç yuvasının değerine ayarlanır.
getParameters çağrısından hepsini
döndürecektir. Ancak uzak uç yalnızca iki codec ile yanıt verirse,
eksik olan codec artık alıcının onu almaya hazır olması
gerekmediğinden getParameters tarafından döndürülmez.
-
rtcp.reducedSize, alıcı şu anda küçültülmüş boyutlu RTCP paketlerini almaya hazırsatrue, aksi haldefalseolarak ayarlanır.rtcp.cnamedışarıda bırakılır.
getContributingSources
RTCRtpReceiver tarafından son 10 saniye içinde alınan
her benzersiz CSRC tanımlayıcısı için, azalan
timestamp sırasına göre bir
RTCRtpContributingSource döndürür.
getSynchronizationSources
RTCRtpReceiver tarafından son 10 saniye içinde alınan
her benzersiz SSRC tanımlayıcısı için, azalan
timestamp sırasına göre bir
RTCRtpSynchronizationSource döndürür.
getStats
getStats() yöntemi çağrıldığında, kullanıcı
aracısı aşağıdaki adımları MUST çalıştırmalıdır:
-
selector, yöntemin çağrıldığıRTCRtpReceivernesnesi olsun. -
p, yeni bir promise olsun ve aşağıdaki adımları paralel olarak çalıştırın: -
İstatistik seçim algoritmasına göre
selectortarafından belirtilen istatistikleri toplayın. -
Toplanan istatistikleri içeren
RTCStatsReportnesnesiylepsözünü çözmek için, geçerli realm’in küresel nesnesiglobalolarak verilmiş ağ görev kaynağı üzerinde küresel bir görev kuyruğa alın. pdeğerini döndürün.
RTCRtpContributingSource ve
RTCRtpSynchronizationSource sözlükleri, sırasıyla belirli
bir katkı kaynağı (CSRC) veya senkronizasyon kaynağı (SSRC) hakkında
bilgi içerir. Bir veya daha fazla RTP paketinden gelen bir ses veya
video karesi RTCRtpReceiver nesnesinin
MediaStreamTrack öğesine iletildiğinde, kullanıcı aracısı
bu paketlerin içeriğine dayanarak
RTCRtpContributingSource ve
RTCRtpSynchronizationSource sözlükleri için ilgili
bilgileri güncellemek üzere bir görev MUST kuyruğa almalıdır.
SSRC tanımlayıcısına karşılık gelen
RTCRtpSynchronizationSource sözlüğü için ilgili bilgiler
her seferinde güncellenir ve bir RTP paketi CSRC tanımlayıcıları
içeriyorsa, bu CSRC tanımlayıcılarına karşılık gelen
RTCRtpContributingSource sözlükleri için ilgili bilgiler de
güncellenir. Kullanıcı aracısı RTP paketlerini artan RTP zaman damgası
sırasına göre MUST işlemelidir. Kullanıcı aracısı, önceki 10
saniye içinde RTCRtpReceiver nesnesinin
MediaStreamTrack öğesine iletilen RTP paketlerinden gelen
bilgileri MUST saklamalıdır.
MediaStreamTrack herhangi bir oynatım hedefinə bağlı
olmasa bile, parça sona ermediği sürece
getSynchronizationSources ve
getContributingSources güncel bilgileri döndürür; RTP
paketlerinin çözülmesi için hedefler bir ön koşul değildir.
RTCRtpReceiver için döndürülen tüm
RTCRtpSynchronizationSource ve
RTCRtpContributingSource sözlüklerinin RTP akışındaki tek
bir noktadan gelen bilgileri içermesidir.
WebIDLdictionary RTCRtpContributingSource {
required DOMHighResTimeStamp timestamp;
required unsigned long source;
double audioLevel;
required unsigned long rtpTimestamp;
};
Sözlük RTCRtpContributingSource Üyeleri
timestamp türü DOMHighResTimeStamp, gerekli
RTCRtpReceiver nesnesinin
MediaStreamTrack öğesine iletildiğini gösteren
timestamp. timestamp, o andaki
Performance.timeOrigin +
Performance.now()
olarak tanımlanır.
source türü unsigned long, gerekli
audioLevel türü double
CSRC’ler için, RFC 6465 başlık uzantısı mevcutsa bu değer [RFC6465]’te tanımlanan seviye değerinden MUST dönüştürülmelidir; aksi halde bu üye MUST bulunmamalıdır.
SSRC’ler için, bu değer [RFC6464]’te tanımlanan seviye değerinden MUST dönüştürülmelidir. Alınan paketlerde RFC 6464 başlık uzantısı mevcut değilse (örneğin karşı uç bir kullanıcı aracısı değilse veya eski bir uç nokta ise), bu değer SHOULD bulunmamalıdır.
Her iki RFC de seviyeyi, sistemin olası olarak kodlayabileceği en yüksek sinyale göre negatif desibel cinsinden ses seviyesini temsil eden, 0 ile 127 arasında tam sayı bir değer olarak tanımlar. Buna göre 0, sistemin kodlayabileceği en yüksek sinyali, 127 ise sessizliği temsil eder.
Bu değerleri doğrusal 0..1 aralığına dönüştürmek için, 127 değeri 0’a
dönüştürülür ve diğer tüm değerler şu denklem kullanılarak dönüştürülür:
10^(-rfc_level/20).
rtpTimestamp türü unsigned long, gerekli
timestamp anında oynatılan ortamın, [RFC3550] Bölüm 5.1’de
tanımlandığı şekliyle RTP zaman damgası.
WebIDLdictionary RTCRtpSynchronizationSource : RTCRtpContributingSource {};
RTCRtpSynchronizationSource sözlüğünün, yalnızca SSRC’lerde
mevcut olan verileri ortaya çıkarmak için belirtim açısından bir
genişletme noktası olarak hizmet etmesi beklenmektedir.