Herhangi bir öğeden video akışı yakalayın

Furkan
François Beaufort
Elif Alon
Elad Alon

Screen Capture API ile geçerli sekmenin tamamını yakalayabilirsiniz. Öğe Yakalama API'sı belirli bir HTML öğesini yakalayıp kaydetmenizi sağlar. Sekmenin tamamının yakalanmasını, belirli bir DOM alt ağacının yakalamasına dönüştürür ve hedef öğenin yalnızca doğrudan alt öğelerini yakalar. Diğer bir deyişle, hem gizlenen hem de kapanan içerikleri kırpıp kaldırır.

Öğe Yakalamayı neden kullanmalısınız?

Bir video konferans uygulamasının gereksinimlerini göz önünde bulundurmak, Öğe Yakalamanın hangi noktalarda faydalı olduğunu anlamanıza yardımcı olabilir. Bir iframe'e üçüncü taraf uygulamaları yerleştirmenize olanak tanıyan bir video konferans uygulamanız varsa, bazen o iframe'i video olarak yakalamak ve uzak katılımcılara aktarmak isteyebilirsiniz.

Chrome'daki bir video konferans görüşmesinin ekran görüntüsü.
Elad, Faruk ile video konferans görüşmesi yaparken üçüncü taraf bir uygulama kullanıyor.

getDisplayMedia() çağrılıp kullanıcının mevcut sekmeyi seçmesine izin verildiğinde mevcut sekmenin tamamı aktarılır. Bu büyük olasılıkla kullanıcıların kendi videosunu onlara geri gönderir. Bölge Yakalama özelliğini kullanarak bu resmi kırpabilirsiniz.

Ancak, sunumu yapan kişi video konferans uygulamasıyla etkileşimde bulunursa ve bir içerik (açılır liste gibi), yakalanması amaçlanan içeriğin üzerine çizim yaparsa ne olur?

Yakalanması amaçlanan içeriği kapsayan bir açılır listenin ekran görüntüsü.
Yakalanması istenen içeriğin üstünde bir açılır liste gösterilir.

Bölge Yakalama bu konuda size yardımcı olmaz. Açılır listenin bir bölümü, uzaktaki katılımcıların ekranlarında görünebilir.

Açılır listenin ekran görüntüsü.
François'ın aldığı içeriklerin üst kısmında Elad'ın açılır listesi gösteriliyor.

Bölge Yakalama özelliğinin öğelerin parçalarını bu şekilde yakalaması (içeriği doldurma olarak bilinir) birden çok soruna neden olur:

  • İçerik gizlemek, kullanıcının paylaşmak istediği içeriğin görüntülenmesini engelleyebilir.
  • Gizli içerikler gizli olabilir (sohbet bildirimlerini düşünün).
  • İçeriği gizlemek kafa karıştırıcı olabilir. (Örneğin, uygulamanın yeniden düzenlenmesi, uzaktaki katılımcıların kendi videolarını kısa süreliğine hedeflenen hedefe taşımanızı sağlayabilir.)

Element Capture API, paylaşmak istediğiniz öğeyi hedeflemenize olanak tanıyarak bu sorunların tümünü çözer.

Görünürde açılır liste olmayan hedef öğenin ekran görüntüsü.
François, Elif'in açılır listesini görmüyor.

Öğe Yakalama'yı nasıl kullanabilirim?

captureTarget, sayfanızda kullanıcının yakalamak istediği içeriği barındıran bir Öğe'dir. Video konferans web uygulamasının, captureTarget adlı katılımcıyı yakalamasını ve uzak katılımcılarla paylaşmasını istiyorsunuz. Dolayısıyla, captureTarget değerinden bir RestrictionTarget elde edersiniz. Bu RestrictionTarget kullanılarak video parçası kısıtlandıktan sonra söz konusu video kanalındaki kareler artık yalnızca captureTarget öğesinin ve doğrudan DOM alt öğelerinin parçası olan piksellerden oluşur.

captureTarget boyutu, şekli veya konumu değişirse video parçası, web uygulamasından ek giriş gerektirmeden takip edilir. İçeriğin görünmesi, kaybolması veya yerini değiştirmesi de benzer şekilde özel bir işlem gerektirmez.

Aşağıdaki adımları tekrar inceleyin:

Kullanıcının mevcut sekmeyi yakalamasına izin vererek başlayın.

// Ask the user for permission to start capturing the current tab.
const stream = await navigator.mediaDevices.getDisplayMedia({
 preferCurrentTab: true,
});
const [track] = stream.getVideoTracks();

Giriş olarak seçtiğiniz bir öğeyle RestrictionTarget.fromElement() çağırarak bir RestrictionTarget tanımlayın.

// Associate captureTarget with a new RestrictionTarget
const captureTarget = document.querySelector("#captureTarget");
const restrictionTarget = await RestrictionTarget.fromElement(captureTarget);

Ardından giriş olarak RestrictionTarget ile video kanalında restrictTo() adlı kişiyi çağırın. Son söz kesinleştikten sonra sonraki tüm kareler kısıtlanır.

// Start restricting the self-capture video track using the RestrictionTarget.
await track.restrictTo(restrictionTarget);

// Enjoy! Transmit remotely.

Ayrıntılı inceleme

Özellik algılama

RestrictionTarget.fromElement() hizmetinin desteklenip desteklenmediğini kontrol etmek için şunu kullanın:

if ("RestrictionTarget" in self && "fromElement" in RestrictionTarget) {
  // Deriving a restriction target is supported.
}

Kısıtlama Hedefi Türet

captureTarget adlı Öğeye odaklanın. Bundan bir RestrictionTarget elde etmek için RestrictionTarget.fromElement(captureTarget) işlevini çağırın. Döndürülen Söz başarılı olursa yeni bir RestrictionTarget nesnesiyle çözümlenir. Aksi takdirde, makul olmayan sayıda RestrictionTarget nesne bastıysanız reddedilir.

const captureTarget = document.querySelector("#captureTarget");
const restrictionTarget = await RestrictionTarget.fromElement(captureTarget);

Bir Element'in aksine, RestrictionTarget nesnesi serileştirilebilir. Örneğin, Window.postMessage() kullanılarak başka bir dokümana aktarılabilir.

Kısıtlanıyor

Bir sekme yakalanırken video kanalı, restrictTo() görünür. Geçerli sekmeyi yakalarken, restrictTo() öğesini null veya geçerli sekmedeki bir Öğeden türetilmiş herhangi bir RestrictionTarget ile çağırmak geçerlidir.

restrictTo(restrictionTarget) çağrıları, video parçasını DOM'nin geri kalanından bağımsız olarak tek başına çizilmiş gibi bir captureTarget yakalamasına dönüştürür. captureTarget öğesinin tüm alt öğeleri de yakalanır; captureTarget öğesinin kardeşleri yakalamadan çıkarılır. Bunun sonucunda, kanalda yayınlanan tüm kareler captureTarget sınırlarına göre kırpılmış gibi görünür ve başka herhangi bir içeriği gizleyen içerikler kaldırılır.

// Start restricting the self-capture video track using the RestrictionTarget.
await track.restrictTo(restrictionTarget);

restrictTo(null) için yapılan aramalar, parçayı orijinal durumuna geri döndürür.

// Stop restricting.
await track.restrictTo(null);

restrictTo() çağrısı başarılı olursa döndürülen Söz, sonraki tüm video karelerinin captureTarget ile kısıtlanacağı garanti edilebildiğinde çözüme kavuşturulur.

Başarısız olursa söz reddedilir. restrictTo() aramasının başarısız olmasının nedeni aşağıdakilerden biri olabilir:

  • restrictionTarget, yakalananın dışında bir sekmede basılmışsa. ("Bunun yerine bu sekmeyi paylaş" düğmesini kullanarak, kullanıcıların herhangi bir zamanda hangi sekmenin yakalanacağını değiştirebileceğini unutmayın.)
  • restrictionTarget artık mevcut olmayan bir öğeden türetilmişse.
  • Kanalda klonlar olup olmadığı. (1509418 numaralı sayıya bakın.)
  • Mevcut parça, kendi kendini gösteren bir video parçası değilse.
  • restrictionTarget öğesinin türetildiği öğe kısıtlama için uygun değilse.

Kendini yakalama konusunda dikkat edilmesi gereken noktalar

Bir uygulama getDisplayMedia() işlevini çağırdığında ve kullanıcı uygulamanın kendi sekmesini yakalamayı seçtiğinde buna "kendini yakalama" adı verilir.

restrictTo() yöntemi, yalnızca kendi kendini yakalamak için değil, sekmeyle yakalama yapılan tüm video kanallarında gösterilir. Ancak Öğe Yakalama şimdilik yalnızca kendi yakalamanız için etkinleştirilmiştir. Dolayısıyla, kullanıcının, kanalı kısıtlamaya çalışmadan önce, geçerli sekmeyi seçip seçmediğini kontrol etmeniz önerilir. Bu işlem, Herkese açık kullanıcı adı kullanılarak yapılabilir. Tarayıcının, preferCurrentTab kullanarak kullanıcıyı kendisinin fotoğrafını çekmeye yönlendirmesi de mümkündür.

Şeffaflık

Uygulamanın getDisplayMedia() üzerinden aldığı video kareleri alfa kanalı içermiyor. Bir uygulama kısmen şeffaf bir yakalama hedefi ayarlarsa alfa kanalının kaldırılmasının bazı olası sonuçları olur:

  • Renkler değişebilir. Açık renkli arka plan üzerinde çizilen kısmen şeffaf hedef öğeler, alfa kanalı kaldırıldığında daha koyu, koyu arka plan üzerine çizilen öğeler ise daha açık görünebilir.
  • Alfa kanalı maksimum değere ayarlandığında, kullanıcı tarafından görülmeyen veya algılanamayan renkler alfa kanalı kaldırıldığında gösterilecekti. Örneğin, şeffaf bölümlerde rgba(0, 0, 0, 0) RGBA kodu varsa bu durum, yakalanan çerçevelerde beklenmeyen siyah bölgelerin oluşmasına neden olabilir.
Dikdörtgen olmayan şeffaf yakalama hedefinin ekran görüntüsü.
Dikdörtgen olmayan şeffaf yakalama hedef video akışı (sağda), opak mavi bir daire içeren siyah bir arka plan dikdörtgenidir.

Uygun olmayan yakalama hedefleri

Bir parçayı her zaman geçerli herhangi bir yakalama hedefiyle kısıtlamaya başlamak mümkündür. Ancak belirli koşullarda (örneğin, öğe veya üst öğe display:none) çerçeveler oluşturulmaz. Genel mantık, kısıtlamanın yalnızca pikselleri üst veya kardeş öğelerden ayrı olarak mantıksal olarak belirlenebilen tek, birleşik, iki boyutlu, dikdörtgen bir alandan oluşan bir öğe için geçerli olmasıdır.

Öğenin kısıtlamaya uygun olmasını sağlamak için dikkat edilmesi gereken önemli bir nokta, kendi yığınma bağlamını oluşturması gerektiğidir. Bunu sağlamak için izolasyon CSS özelliğini isolate olarak ayarlayarak belirtebilirsiniz.

<div id="captureTarget" style="isolation: isolate;"></iframe>

Hedef öğenin, herhangi bir noktada (örneğin, uygulama CSS özelliklerini değiştirirse) kısıtlama için uygun ve uygun olma durumları arasında geçiş yapılabileceğini unutmayın. Makul yakalama hedefleri kullanmak ve özelliklerini beklenmedik şekilde değiştirmekten kaçınmak uygulamaya bağlıdır. Hedef öğe uygun bulunmazsa hedef öğe tekrar kısıtlama için uygun hale gelene kadar kanalda yeni kareler yayınlanmaz.

Öğe Yakalama Etkinleştiriliyor

Element Capture API, Chrome'daki masaüstü sürümünde Element Capture işaretinin arkasında bulunur ve chrome://flags/#element-capture adresinde etkinleştirilebilir.

Ayrıca bu özellik, masaüstü cihazlarda Chrome 121'de bir kaynak denemesine giriyor. Bu sayede, geliştiricilerin, sitelerini ziyaret eden kullanıcılar gerçek kullanıcılardan veri toplamak için bu özelliği etkinleştirmelerine olanak tanıyabilecekler. Kaynak denemeleri hakkında daha fazla bilgi için Kaynak denemelerini kullanmaya başlama başlıklı makaleye bakın.

Güvenlik ve gizlilik

Güvenlik dengesini anlamak için Öğe Yakalama spesifikasyonunun Gizlilik ve Güvenlikle İlgili Dikkat Edilmesi Gerekenler bölümüne bakın.

Chrome tarayıcı, yakalanan sekmelerin kenarlarına mavi bir kenarlık çizer.

Demo

Glitch'te demo sürümünü çalıştırarak Öğe Yakalama ile oynayabilirsiniz. Kaynak koduna göz atmayı unutmayın.

Geri bildirim

Chrome ekibi ve web standartları topluluğu, Element Capture deneyimlerinizi öğrenmek ister.

Bize tasarım hakkında bilgi verin

Bölge Yakalama ile ilgili beklediğiniz gibi çalışmayan bir özellik var mı? Ya da fikrinizi uygulamak için ihtiyacınız olan eksik yöntemler veya özellikler mi var? Güvenlik modeliyle ilgili sorunuz veya yorumunuz mu var?

  • GitHub deposunda spesifikasyon sorunu kaydedin veya mevcut bir soruna düşüncelerinizi ekleyin.

Uygulamayla ilgili bir sorun mu var?

Chrome'un uygulamasında bir hata buldunuz mu? Yoksa uygulama, spesifikasyondan farklı mı?

  • https://new.crbug.com adresinden hata bildiriminde bulunun. Mümkün olduğunca çok ayrıntı ve yeniden oluşturma işlemiyle ilgili basit talimatları eklediğinizden emin olun. Glitch hızlı ve kolay yeniden oluşturma paylaşımı için idealdir.

Tasdik

Fotoğraf: Paul Skorupskas'ın Unsplash'teki fotoğrafı