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

François Beaufort
François Beaufort

Ekran Görüntüsü Alma API ile geçerli sekmenin tamamını yakalayabilirsiniz. Element Capture API, belirli bir HTML öğesini yakalamanıza ve kaydetmenize olanak tanır. Bu işlev, sekmenin tamamının yakalanmasını belirli bir DOM alt ağacının yakalanmasına dönüştürerek yalnızca hedef öğenin doğrudan alt öğelerini yakalar. Başka bir deyişle, hem kapatan hem de kapatılan içeriği kırpar ve kaldırır.

Neden öğe yakalama özelliğini kullanmalısınız?

Video konferans uygulamalarının gereksinimlerini göz önünde bulundurmak, Element Capture'ın nerede faydalı olduğunu anlamanıza yardımcı olabilir. Üçüncü taraf uygulamalarını bir iFrame'e yerleştirmenize olanak tanıyan bir video konferans uygulamanız varsa bazen bu iFrame'i video olarak kaydetmek ve uzaktaki katılımcılara iletmek isteyebilirsiniz.

Chrome'da yapılan bir video konferans görüşmesinin ekran görüntüsü.
Elad, François ile yaptığı video konferans görüşmesinde üçüncü taraf bir uygulama kullanıyor.

getDisplayMedia() işlevini çağırmak ve kullanıcının mevcut sekmeyi seçmesine izin vermek, mevcut sekmenin tamamını iletirdi. Bu, kullanıcıların kendi videolarını onlara geri iletmek için kullanılabilir. Bölge yakalama özelliğini kullanarak bu alanı kırpabilirsiniz.

Ancak sunum yapan kişi video konferans uygulamasıyla etkileşime girerse ve açılır liste gibi bazı içerikler, yakalanması amaçlanan içeriğin üzerine çizilirse ne olur?

Yakalanması amaçlanan içeriği kapatan bir açılır listenin ekran görüntüsü.
Yakalanması amaçlanan içeriğin üzerinde bir açılır liste gösteriliyor.

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

Açılır listenin ekran görüntüsü alınır.
Elad'ın açılır listesi, François'nın aldığı içeriğin üzerinde gösteriliyor.

Bölge yakalama özelliğinin öğelerin bir kısmını bu şekilde yakalaması (içeriği kapatma olarak bilinir) birden fazla soruna yol açar:

  • İçeriği kapatmak, kullanıcının paylaşmak istediği içeriğin görünmesini engelleyebilir.
  • Kapatılan içerik özel olabilir (ör. sohbet bildirimleri).
  • Kapatılan içerik 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 yakalanan hedefin üzerine getirebilir.)

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

Hedef öğenin, görüntüde açılır liste olmayan ekran görüntüsü.
François, Elad'ın açılır listesini görmüyor.

Element Capture nasıl kullanılır?

captureTarget, kullanıcının yakalamak istediği içeriği içeren, sayfanızdaki bir öğedir. Video konferans web uygulamasının captureTarget yakalamasını ve uzaktaki katılımcılarla paylaşmasını istiyorsanız. Bu nedenle, captureTarget öğesinden RestrictionTarget türetirsiniz. Video parçasını bu RestrictionTarget ile kısıtladıktan sonra, söz konusu video parçasındaki kareler artık yalnızca captureTarget ve doğrudan DOM alt öğelerinin parçası olan piksellerden oluşur.

captureTarget boyutu, şekli veya konumu değişirse video parçası da değişir. Bu durumda, web uygulamasından ek giriş yapılması gerekmez. Benzer şekilde, görünen, kaybolan veya hareket eden içeriklerin kapatılması için de özel bir işlem yapılması gerekmez.

Bu 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 istediğiniz bir öğeyle RestrictionTarget.fromElement() işlevini çağırarak 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 parçasında restrictTo() işlevini çağırın. Son söz çözüldüğünde 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() öğesinin desteklenip desteklenmediğini kontrol etmek için:

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

RestrictionTarget türetme

captureTarget adlı Element'e odaklanın. Bundan RestrictionTarget elde etmek için RestrictionTarget.fromElement(captureTarget) işlevini çağırın. Başarılı olursa döndürülen Promise, yeni bir RestrictionTarget nesnesiyle çözümlenir. Aksi takdirde, makul olmayan sayıda RestrictionTarget nesnesi oluşturduysanız reddedilir.

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

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

Kısıtlanıyor

Bir sekme yakalanırken video parçası restrictTo() değerini gösterir. Mevcut sekme yakalanırken restrictTo(), null veya mevcut sekmedeki bir öğeden türetilen herhangi bir RestrictionTarget ile çağrılabilir.

restrictTo(restrictionTarget), video parçasını DOM'un geri kalanından bağımsız olarak kendi başına çizilmiş gibi captureTarget yakalamasına dönüştürme çağrıları. captureTarget öğesinin tüm alt öğeleri de yakalanır. captureTarget öğesinin kardeş öğeleri yakalamadan çıkarılır. Sonuç olarak, parçada sunulan tüm kareler captureTarget'nın hatlarına göre kırpılmış gibi görünür ve kapatan ve kapatılan tüm içerikler kaldırılır.

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

restrictTo(null) işlevine yapılan çağrılar, parçayı orijinal durumuna döndürür.

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

restrictTo() çağrısı başarılı olursa döndürülen Promise, sonraki tüm video karelerinin captureTarget ile sınırlandırılacağı garanti edildiğinde çözülür.

Başarısız olursa Promise reddedilir. restrictTo() ile yapılan başarısız bir aramanın nedeni aşağıdakilerden biri olabilir:

  • restrictionTarget, yakalanan sekme dışında bir sekmede oluşturulduysa. ("Bunun yerine bu sekmeyi paylaş" düğmesini kullanan 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.
  • Parçada klonlar varsa (1509418 numaralı soruna bakın.)
  • Mevcut parça, kendi çekiminiz olan bir video parçası değilse.
  • restrictionTarget öğesinin türetildiği öğe kısıtlama için uygun değilse.

Kendi kendine çekim yaparken dikkat edilmesi gereken noktalar

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

restrictTo() yöntemi, yalnızca kendi kaydınız için değil, herhangi bir sekme kaydı video parçasında kullanılabilir. Ancak Element Capture şu anda yalnızca kendi kendine yakalama için etkinleştirilmiştir. Bu nedenle, parçayı kısıtlamaya çalışmadan önce kullanıcının geçerli sekmeyi seçip seçmediğini kontrol etmeniz önerilir. Bu işlem, Capture Handle kullanılarak yapılabilir. Tarayıcıdan, preferCurrentTab kullanarak kullanıcıyı kendi fotoğrafını çekmeye yönlendirmesini de isteyebilirsiniz.

Şeffaflık

Uygulamanın getDisplayMedia() aracılığıyla aldığı video kareleri alfa kanalı içermez. Bir uygulama kısmen şeffaf bir yakalama hedefi ayarlarsa alfa kanalının kaldırılmasının olası sonuçları şunlardır:

  • Renkler değişebilir. Açık arka plan üzerinde çizilen kısmen şeffaf hedef öğeler, alfa kanalı kaldırıldığında daha koyu görünebilir. Koyu arka plan üzerinde çizilenler ise daha açık görünebilir.
  • Alfa kanalı maksimuma ayarlandığında kullanıcı tarafından görünmeyen veya algılanamayan renkler, alfa kanalı kaldırıldığında görünür. Örneğin, şeffaf bölümlerin RGBA kodu rgba(0, 0, 0, 0) ise bu durum, yakalanan karelerde beklenmedik siyah bölgelere yol açabilir.
Dikdörtgen olmayan şeffaf bir yakalama hedefinin sonucunun ekran görüntüsü.
Dikdörtgen olmayan şeffaf yakalama hedefi video akışı (sağda), opak mavi bir daire içeren siyah arka planlı bir dikdörtgendir.

Uygun olmayan yakalama hedefleri

Bir parçayı geçerli bir yakalama hedefiyle her zaman sınırlayabilirsiniz. Ancak belirli koşullarda çerçeveler oluşturulmaz. Örneğin, öğe veya bir üst öğe display:none ise çerçeve oluşturulmaz. Genel gerekçe, kısıtlamanın yalnızca tek, tutarlı, iki boyutlu, dikdörtgen bir alandan oluşan ve pikselleri üst veya kardeş öğelerden bağımsız olarak mantıksal bir şekilde belirlenebilen bir öğe için geçerli olmasıdır.

Öğenin kısıtlama için uygun olmasını sağlamak açısından önemli bir nokta, öğenin kendi yığın bağlamını oluşturması gerektiğidir. Bunu sağlamak için isolation CSS özelliğini isolate olarak ayarlayabilirsiniz.

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

Hedef öğenin, örneğin uygulama CSS özelliklerini değiştirirse herhangi bir noktada kısıtlama için uygun ve uygun olmayan arasında geçiş yapabileceğini unutmayın. Uygulama, makul yakalama hedefleri kullanmalı ve özelliklerini beklenmedik şekilde değiştirmemelidir. Hedef öğe uygunsuz hale gelirse hedef öğe tekrar kısıtlama için uygun hale gelene kadar parçada yeni kareler yayınlanmaz.

Tarayıcı desteği

Öğe Yakalama yalnızca masaüstünde Chrome 132 ve sonraki sürümlerde kullanılabilir.

Güvenlik ve gizlilik

Güvenlikle ilgili ödünleri anlamak için Element Capture spesifikasyonunun Gizlilik ve Güvenlikle İlgili Dikkat Edilmesi Gerekenler bölümüne göz atın.

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

Demo

Demoyu çalıştırarak Element Capture ile denemeler yapabilirsiniz.

Geri bildirim

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

Tasarım hakkında bilgi verin

Element Capture ile ilgili beklentilerinizi karşılamayan bir durum var mı? Yoksa fikrinizi uygulamak için eksik yöntemler veya özellikler mi var? Güvenlik modeliyle ilgili sorunuz veya yorumunuz mu var?

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

Uygulamayla ilgili sorun mu yaşıyorsunuz?

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

Teşekkür

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