Interactive Media Ads (IMA) Dinamik Reklam Ekleme (DAI) SDK'sı, izleyicilerin konumlarını ve istemci tarafı reklam etkinliklerini izlemek için akışın medya segmentlerine yerleştirilmiş meta veri bilgilerine (bant içi meta veriler) veya akış manifest dosyasına (manifest içi meta veriler) dayanır. Meta veriler, oynatılan akışın türüne bağlı olarak farklı biçimlerde gönderilir.
Video oynatıcı, zamanlanmış meta verileri gruplar halinde alır. Oynatıcıya bağlı olarak, meta veriler planlanan zamanda veya toplu olarak gösterilebilir. Her meta veri dizesinin, ne zaman tetiklenmesi gerektiğini belirten ilişkili bir sunum zaman damgası (PTS) vardır.
Uygulamanız, meta verileri yakalamaktan ve IMA DAI SDK'ya iletmekten sorumludur. SDK, bu bilgileri iletmek için aşağıdaki yöntemleri sunar:
- onTimedMetadata
Bu yöntem, işlenmeye hazır meta veri dizelerini SDK'ya iletir. Tek bir bağımsız değişken alır:
metadata
:TXXX
anahtarını içeren vegoogle_
ile başlayan ilişkili bir dize değerine sahip bir nesne.
- processMetadata
Bu yöntem, belirtilen PTS'den sonra SDK tarafından işlenecek meta veri dizelerini planlar. Aşağıdaki bağımsız değişkenleri alır:
type
: İşlenen etkinliğin türünü içeren bir dize. Kabul edilen değerler, HLS içinID3
veya DASH içinurn:google:dai:2018
'dir.data
:google_
ile başlayan bir dize değeri veya şu biçimi izleyen bir bayt dizisiID3:u\0004u\000u\000u\0000TXXXu\0004u\000u\000u\0000google_xxxxxxxx
.timestamp
: Verilerin işlenmesi gereken zaman damgası (saniye cinsinden).
IMA DAI SDK'nın desteklediği her akış türü, aşağıdaki bölümlerde açıklandığı gibi benzersiz bir zamanlanmış meta veri biçimi kullanır.
HLS MPEG2TS akışları
MPEG2TS segmentlerini kullanan doğrusal DAI HLS akışları, bant içi ID3 etiketleri aracılığıyla zamanlanmış meta verileri video oynatıcıya iletir. Bu ID3 etiketleri, MPEG2TS segmentlerine yerleştirilir ve TXXX alan adı (özel kullanıcı tanımlı metin içeriği için) verilir.
Safari'de oynatma
Safari, ID3 etiketlerini otomatik olarak gizli bir parça şeklinde işler. Böylece, her bir meta verinin işlenmesi için cuechange etkinlikleri doğru zamanda tetiklenir. İçerik veya türden bağımsız olarak tüm meta verileri IMA DAI SDK'sına iletebilirsiniz. Alakasız meta veriler otomatik olarak filtrelenir.
Aşağıda bununla ilgili bir örnek verilmiştir:
videoElement.textTracks.addEventListener('addtrack', (e) => {
const track = e.track;
if (track.kind === 'metadata') {
track.mode = 'hidden';
track.addEventListener('cuechange', () => {
for (const cue of track.activeCues) {
const metadata = {};
metadata[cue.value.key] = cue.value.data;
streamManager.onTimedMetadata(metadata);
}
});
}
});
...
HLS.js
HLS.js, FRAG_PARSING_METADATA
etkinliği aracılığıyla ID3 etiketlerini örnek dizisi olarak toplu şekilde sağlar. HLS.js, ID3 verilerini bayt dizilerinden dizelere çevirmez ve etkinlikleri ilgili PTS'lerine göre kaydırmaz. IMA DAI SDK bu kod çözme ve filtreleme işlemlerini otomatik olarak gerçekleştirdiğinden, örnek verilerin bayt dizisinden dizeye kodunun çözülmesi veya alakasız ID3 etiketlerinin filtrelenmesi gerekmez.
Aşağıda bununla ilgili bir örnek verilmiştir:
hls.on(Hls.Events.FRAG_PARSING_METADATA, (e, data) => {
if (streamManager && data) {
data.samples.forEach((sample) => {
streamManager.processMetadata('ID3', sample.data, sample.pts);
});
}
});
...
HLS CMAF akışları
Common Media Application Framework (CMAF) kullanan doğrusal DAI HLS akışları, ID3 through CMAF standardına uygun olarak bant içi eMSGv1 kutuları aracılığıyla zamanlanmış meta verileri iletir. Bu eMSG kutuları, her medya segmentinin başına yerleştirilir. Her ID3 eMSG'si, akışta son kesintiye göre bir PTS içerir.
HLS.js'nin 1.2.0 sürümünden itibaren, önerdiğimiz her iki oynatıcı da ID3'ü CMAF üzerinden kullanıcıya ID3 etiketleri gibi aktarıyor. Bu nedenle, aşağıdaki örnekler HLS MPEG2TS akışlarıyla aynıdır. Ancak bu durum tüm oynatıcılarda geçerli olmayabilir. Bu nedenle, HLS CMAF akışları için destek uygulamak, ID3'ü eMSG üzerinden ayrıştırmak için benzersiz bir kod gerektirebilir.
Safari'de oynatma
Safari, eMSG meta verileri aracılığıyla ID3'ü sözde ID3 etkinlikleri olarak değerlendirir ve bunları toplu olarak, otomatik şekilde, gizli bir parça olarak sağlar. Böylece, her bir meta veri parçasını işlemek için cuechange etkinlikleri doğru zamanda tetiklenir. Zamanlamayla alakalı olsun olmasın tüm meta verileri IMA DAI SDK'sına iletebilirsiniz. DAI ile ilgili olmayan tüm meta veriler otomatik olarak filtrelenir.
Aşağıda bununla ilgili bir örnek verilmiştir:
videoElement.textTracks.addEventListener('addtrack', (e) => {
const track = e.track;
if (track.kind === 'metadata') {
track.mode = 'hidden';
track.addEventListener('cuechange', () => {
for (const cue of track.activeCues) {
const metadata = {};
metadata[cue.value.key] = cue.value.data;
streamManager.onTimedMetadata(metadata);
}
});
}
});
...
HLS.js
HLS.js, 1.2.0 sürümünden itibaren eMSG meta verileri aracılığıyla ID3'ü sözde ID3
etkinlikleri olarak ele alır ve bunları FRAG_PARSING_METADATA
etkinliği aracılığıyla örnek dizisi olarak gruplar halinde sağlar. HLS.js, ID3 verilerini bayt dizilerinden dizelere çevirmez ve etkinlikleri ilgili PTS'lerine göre kaydırmaz. IMA DAI SDK bu kod çözme işlemini otomatik olarak gerçekleştirdiğinden örnek verilerin bayt dizisinden dizeye çözülmesi gerekmez.
Aşağıda bununla ilgili bir örnek verilmiştir:
hls.on(Hls.Events.FRAG_PARSING_METADATA, (e, data) => {
if (streamManager && data) {
data.samples.forEach((sample) => {
streamManager.processMetadata('ID3', sample.data, sample.pts);
});
}
});
...
DASH akışları
Doğrusal DAI DASH yayınları, meta verileri özel schemeIdUri
değeri urn:google:dai:2018
ile bir etkinlik akışında manifest etkinlikleri olarak iletir. Bu akışlardaki her etkinlik bir metin yükü ve PTS içerir.
DASH.js
Dash.js, her etkinlik akışının schemeIdUri değerine göre adlandırılmış özel etkinlik işleyicileri sağlar. Bu özel işleyiciler toplu olarak tetiklenir. Etkinliğin zamanlamasını doğru yapmak için PTS değerini işlemeniz gerekir. IMA DAI SDK'sı, streamManager yöntemiyle processMetadata()
bu işlemi sizin için gerçekleştirebilir.
Aşağıda bununla ilgili bir örnek verilmiştir:
const dash = dashjs.MediaPlayer().create();
dash.on('urn:google:dai:2018', (payload) => {
const mediaId = payload.event.messageData;
const pts = payload.event.calculatedPresentationTime;
streamManager.processMetadata('urn:google:dai:2018', mediaId, pts);
});
...
Shaka Player
Shaka Player, etkinlikleri timelineregionenter
etkinliğinin bir parçası olarak gösterir. Shaka Player ile biçimlendirme uyumsuzluğu nedeniyle meta veri değeri, ayrıntı özelliği eventNode.attributes['messageData']
aracılığıyla ham olarak alınmalıdır.
Aşağıda bununla ilgili bir örnek verilmiştir:
player.addEventListener('timelineregionenter', function(event) {
const detail = event.detail;
if ( detail.eventNode.attributes &&
detail.eventNode.attributes['messageData']) {
const mediaId = detail.eventNode.attributes['messageData'];
const pts = detail.startTime;
streamManager.processMetadata("urn:google:dai:2018", mediaId, pts);
}
});
...
Kapsül yayınlama
Pod yayınında, zamanlanmış meta verilerin iletilmesi için aşağıdaki ölçütlere bağlı olarak farklı yapılandırmalar vardır:
- Canlı veya seç-izle yayın türü
- HLS veya DASH akış biçimi
- Kullanılan oynatıcının türü
- Kullanılan DAI arka ucu türü
HLS akış biçimi (canlı ve VOD akışları, HLS.js oynatıcı)
HLS.js oynatıcı kullanıyorsanız ID3 meta verilerini almak için HLS.js FRAG_PARSING_METADATA
etkinliğini dinleyin ve StreamManager.processMetadata()
ile SDK'ya iletin.
Her şey yüklendikten ve hazır olduktan sonra videoyu otomatik olarak oynatmak için oynatmayı tetiklemek üzere HLS.js MANIFEST_PARSED
etkinliğini dinleyin.
function loadStream(streamID) {
hls.loadSource(url);
hls.attachMedia(videoElement);
// Timed metadata is passed HLS stream events to the streamManager.
hls.on(Hls.Events.FRAG_PARSING_METADATA, parseID3Events);
hls.on(Hls.Events.MANIFEST_PARSED, startPlayback);
}
function parseID3Events(event, data) {
if (streamManager && data) {
// For each ID3 tag in the metadata, pass in the type - ID3, the
// tag data (a byte array), and the presentation timestamp (PTS).
data.samples.forEach((sample) => {
streamManager.processMetadata('ID3', sample.data, sample.pts);
});
}
}
function startPlayback() {
console.log('Video Play');
videoElement.play();
}
DASH.js (DASH akış biçimi, canlı ve VOD akış türü)
DASH.js oynatıcı kullanıyorsanız canlı veya VOD yayınlarındaki ID3 meta verilerini dinlemek için farklı dizeler kullanmanız gerekir:
- Canlı yayınlar:
'https://developer.apple.com/streaming/emsg-id3'
- VOD akışları:
'urn:google:dai:2018'
ID3 meta verilerini StreamManager.processMetadata()
ile SDK'ya iletin.
Her şey yüklendikten ve hazır olduktan sonra video kontrollerini otomatik olarak göstermek için DASH.js MANIFEST_LOADED
etkinliğini dinleyin.
const googleLiveSchema = 'https://developer.apple.com/streaming/emsg-id3';
const googleVodSchema = 'urn:google:dai:2018';
dashPlayer.on(googleLiveSchema, processMetadata);
dashPlayer.on(googleVodSchema, processMetadata);
dashPlayer.on(dashjs.MediaPlayer.events.MANIFEST_LOADED, loadlistener);
function processMetadata(metadataEvent) {
const messageData = metadataEvent.event.messageData;
const timestamp = metadataEvent.event.calculatedPresentationTime;
// Use StreamManager.processMetadata() if your video player provides raw
// ID3 tags, as with dash.js.
streamManager.processMetadata('ID3', messageData, timestamp);
}
function loadlistener() {
showControls();
// This listener must be removed, otherwise it triggers as addional
// manifests are loaded. The manifest is loaded once for the content,
// but additional manifests are loaded for upcoming ad breaks.
dashPlayer.off(dashjs.MediaPlayer.events.MANIFEST_LOADED, loadlistener);
}
Canlı yayınlarla Shaka Player (DASH akış biçimi)
Canlı yayın oynatma için Shaka Player kullanıyorsanız meta veri etkinliklerini dinlemek için 'emsg'
dizesini kullanın.
Ardından, StreamManager.onTimedMetadata()
çağrınızda etkinlik mesajı verilerini kullanın.
shakaPlayer.addEventListener('emsg', (event) => onEmsgEvent(event));
function onEmsgEvent(metadataEvent) {
// Use StreamManager.onTimedMetadata() if your video player provides
// processed metadata, as with Shaka player livestreams.
streamManager.onTimedMetadata({'TXXX': metadataEvent.detail.messageData});
}
VOD akışları içeren Shaka Player (DASH akışları biçimi)
VOD akışı oynatma için Shaka Player kullanıyorsanız meta veri etkinliklerini dinlemek için 'timelineregionenter'
dizesini kullanın. Ardından, 'urn:google:dai:2018'
dizesiyle birlikte StreamManager.processMetadata()
çağrınızda etkinlik mesajı verilerini kullanın.
shakaPlayer.addEventListener('timelineregionenter', (event) => onTimelineEvent(event));
function onTimelineEvent(metadataEvent) {
const detail = metadataEvent.detail;
if ( detail.eventElement.attributes &&
detail.eventElement.attributes['messageData'] &&
detail.eventElement.attributes['messageData'].value ) {
const mediaId = detail.eventElement.attributes['messageData'].value;
const pts = detail.startTime;
// Use StreamManager.processMetadata() if your video player provides raw
// ID3 tags, as with Shaka player VOD streams.
streamManager.processMetadata('urn:google:dai:2018', mediaId, pts);
}
}