MediaStreamTrack içeriği, üzerinde değişiklik yapılabilecek veya yeni içerik oluşturmak için kullanılabilecek bir akış olarak gösterilir.
Arka plan
Media Capture and Streams API bağlamında MediaStreamTrack arayüzü, bir akış içindeki tek bir medya parçasını temsil eder. Bunlar genellikle ses veya video parçalarıdır ancak başka parça türleri de olabilir.
MediaStream nesneleri, çeşitli ses veya video parçalarını temsil eden sıfır ya da daha fazla MediaStreamTrack nesnesinden oluşur. Her MediaStreamTrack bir veya daha fazla kanala sahip olabilir. Kanal, bir medya akışının en küçük birimini temsil eder. Örneğin, stereo ses parçasında sol veya sağ gibi belirli bir hoparlörle ilişkili ses sinyali.
MediaStreamTrack için yerleştirilebilir yayınlar nedir?
MediaStreamTrack için eklenebilir akışların temel amacı, MediaStreamTrack içeriğini bir akış koleksiyonu olarak (WHATWG Streams API'si tarafından tanımlandığı şekilde) kullanıma sunmaktır. Bu akışlar, yeni bileşenler eklemek için değiştirilebilir.
Geliştiricilere video (veya ses) akışına doğrudan erişim izni vermek, akışta doğrudan değişiklik yapmalarına olanak tanır. Buna karşılık, aynı video manipülasyonu görevini geleneksel yöntemlerle gerçekleştirmek için geliştiricilerin <canvas> öğeleri gibi aracıları kullanması gerekir. (Bu tür bir işlemle ilgili ayrıntılar için örneğin video + canvas = magic başlıklı makaleye bakın.)
Tarayıcı desteği
MediaStreamTrack için eklenebilir akışlar Chrome 94'ten itibaren desteklenir.
Kullanım alanları
MediaStreamTrack için eklenebilir yayınlara yönelik kullanım alanları şunlardır ancak bunlarla sınırlı değildir:
- "Komik şapkalar" veya sanal arka planlar gibi video konferans araçları.
- Yazılım vokoderleri gibi ses işleme.
MediaStreamTrack için eklenebilir yayınları kullanma
Özellik algılama
MediaStreamTrack desteği için eklenebilir akışları aşağıdaki gibi özellik algılama yoluyla ekleyebilirsiniz.
if ('MediaStreamTrackProcessor' in window && 'MediaStreamTrackGenerator' in window) {
// Insertable streams for `MediaStreamTrack` is supported.
}
Temel kavramlar
MediaStreamTrack için eklenebilir akışlar, daha önce WebCodecs tarafından önerilen kavramlara dayanır ve MediaStreamTrack'yı kavramsal olarak iki bileşene ayırır:
MediaStreamTrackProcessor,MediaStreamTracknesnesinin kaynağını tüketir ve özellikleVideoFrameveyaAudioFrame) nesneleri olmak üzere bir medya çerçevesi akışı oluşturur. Bunu, parçadaki kodlanmamış kareleriReadableStreamolarak gösterebilen bir parça havuzu olarak düşünebilirsiniz.- Bir medya kareleri akışını kullanan ve
MediaStreamTrackGeneratorarayüzü sunanMediaStreamTrack.getUserMedia()'daki bir parça gibi herhangi bir çıkışa sağlanabilir. Giriş olarak medya karelerini alır.
MediaStreamTrackProcessor
MediaStreamTrackProcessor nesnesi, readable özelliğini kullanıma sunar. MediaStreamTrack'dan kare okumaya olanak tanır. Parça bir video parçasıysa readable konumundan okunan parçalar VideoFrame nesneleri olur. Parça bir ses parçasıysa readable öğesinden okunan parçalar AudioFrame nesneleri olur.
MediaStreamTrackGenerator
Benzer şekilde, bir MediaStreamTrackGenerator nesnesi de bir özelliği (writable) kullanıma sunar. Bu özellik, MediaStreamTrackGenerator'ya medya çerçeveleri yazmaya olanak tanıyan bir WritableStream'dir. MediaStreamTrackGenerator ise MediaStreamTrack'dir. kind özelliği "audio" ise akış AudioFrame nesnelerini kabul eder ve diğer tüm türlerde başarısız olur. Tür "video" ise akış, VideoFrame nesnelerini kabul eder ve diğer tüm türlerde hata verir. Bir çerçeve writable öğesine yazıldığında, çerçevenin close() yöntemi otomatik olarak çağrılır. Böylece medya kaynaklarına artık JavaScript'ten erişilemez.
MediaStreamTrackGenerator, writable alanına medya çerçeveleri yazılarak özel bir kaynak uygulanabilen bir parçadır.
Tümünü bir araya getirin
Temel fikir, aşağıdaki gibi bir işleme zinciri oluşturmaktır:
Platform Track → Processor → Transform → Generator → Platform Sinks
Aşağıdaki örnekte, canlı video akışında algılanan barkodu vurgulayan bir barkod tarayıcı uygulaması için bu zincir gösterilmektedir.
const stream = await getUserMedia({ video: true });
const videoTrack = stream.getVideoTracks()[0];
const trackProcessor = new MediaStreamTrackProcessor({ track: videoTrack });
const trackGenerator = new MediaStreamTrackGenerator({ kind: 'video' });
const transformer = new TransformStream({
async transform(videoFrame, controller) {
const barcodes = await detectBarcodes(videoFrame);
const newFrame = highlightBarcodes(videoFrame, barcodes);
videoFrame.close();
controller.enqueue(newFrame);
},
});
trackProcessor.readable.pipeThrough(transformer).pipeTo(trackGenerator.writable);
const videoBefore = document.getElementById('video-before');
const videoAfter = document.getElementById('video-after');
videoBefore.srcObject = stream;
const streamAfter = new MediaStream([trackGenerator]);
videoAfter.srcObject = streamAfter;
Demo
Yukarıdaki bölümde yer alan QR kodu tarayıcı demosunu masaüstü veya mobil tarayıcıda görebilirsiniz. Kameranın önüne bir QR kodu tuttuğunuzda uygulama kodu algılayıp vurgular. Uygulamanın kaynak kodunu GitHub'da görebilirsiniz.

Güvenlik ve gizlilik ile ilgili dikkat edilmesi gerekenler
Bu API'nin güvenliği, web platformundaki mevcut mekanizmalara dayanır. Veriler VideoFrame ve AudioFrame arayüzleri kullanılarak kullanıma sunulduğunda, kaynakla kirlenmiş verilerle ilgili bu arayüzlerin kuralları geçerli olur. Örneğin, kaynaklar arası kaynaklardaki verilere, bu tür kaynaklara erişimle ilgili mevcut kısıtlamalar nedeniyle erişilemez (ör. kaynaklar arası bir resim veya video öğesinin piksellerine erişilemez). Ayrıca, kameralardan, mikrofonlardan veya ekranlardan alınan medya verilerine erişim için kullanıcı yetkilendirmesi gerekir. Bu API'nin sunduğu medya verileri, diğer API'ler aracılığıyla zaten kullanılabilir.
Geri bildirim
Chromium ekibi, MediaStreamTrack için eklenebilir akışlarla ilgili deneyimlerinizi öğrenmek istiyor.
API tasarımı hakkında bilgi verin.
API'nin beklentilerinizi karşılamayan bir yönü var mı? Yoksa fikrinizi uygulamak için eksik yöntemler veya özellikler mi var? Güvenlik modeliyle ilgili sorunuz veya yorumunuz var mı? İlgili GitHub deposunda bir spesifikasyon sorunu bildirin veya düşüncelerinizi mevcut bir soruna ekleyin.
Uygulamayla ilgili sorun bildirme
Chromium'un uygulanmasıyla ilgili bir hata mı buldunuz? Yoksa uygulama, spesifikasyondan farklı mı?
new.crbug.com adresinden hata bildirin. Mümkün olduğunca fazla ayrıntı ve hatayı yeniden oluşturmayla ilgili basit talimatlar eklediğinizden emin olun. Ayrıca Bileşenler kutusuna Blink>MediaStream girin.
API'ye desteğinizi gösterme
MediaStreamTrack için yerleştirilebilir yayınları kullanmayı planlıyor musunuz? Herkese açık desteğiniz, Chromium ekibinin özellikleri önceliklendirmesine yardımcı olur ve diğer tarayıcı satıcılarına bu özellikleri desteklemenin ne kadar önemli olduğunu gösterir.
#InsertableStreams hashtag'ini kullanarak @ChromiumDev hesabına tweet gönderin
ve nerede, nasıl kullandığınızı bize bildirin.
Faydalı bağlantılar
Teşekkür
MediaStreamTrack spesifikasyonu için eklenebilir akışlar Harald Alvestrand ve Guido Urdaneta tarafından yazılmıştır.
Bu makale Harald Alvestrand, Joe Medley,
Ben Wagner, Huib Kleinhout ve
François Beaufort tarafından incelenmiştir. Unsplash'teki Chris Montgomery'nin hero resmi.