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
,MediaStreamTrack
nesnesinin kaynağını tüketir ve özellikleVideoFrame
veyaAudioFrame
) nesneleri olmak üzere bir medya çerçevesi akışı oluşturur. Bunu, parçadaki kodlanmamış kareleriReadableStream
olarak gösterebilen bir parça havuzu olarak düşünebilirsiniz.- Bir medya kareleri akışını kullanan ve
MediaStreamTrackGenerator
arayü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.