คุณจะสร้างประสบการณ์การใช้งานสื่อบนอุปกรณ์เคลื่อนที่ที่ดีที่สุดบนเว็บได้อย่างไร เห็นไหมว่าง่ายนิดเดียว ทั้งหมดนี้ขึ้นอยู่กับการมีส่วนร่วมของผู้ใช้และความสำคัญที่คุณให้กับสื่อในหน้าเว็บ เราคิดว่าทุกคนคงเห็นด้วยว่าหากวิดีโอเป็นเหตุผลหลักที่ทำให้ผู้ใช้เข้าชม ประสบการณ์ของผู้ใช้จะต้องสมจริงและดึงดูดให้กลับมามีส่วนร่วมอีกครั้ง
ในบทความนี้ เราจะแสดงวิธีปรับปรุงประสบการณ์การใช้งานสื่ออย่างต่อเนื่องและทำให้สื่อสมจริงยิ่งขึ้นด้วย Web API มากมาย เราจึงจะสร้างประสบการณ์การใช้งานโปรแกรมเล่นบนอุปกรณ์เคลื่อนที่ที่เรียบง่ายพร้อมการควบคุมที่กำหนดเอง การเล่นแบบเต็มหน้าจอ และการเล่นขณะล็อกหน้าจอหรือขณะใช้แอปอื่น คุณลองใช้ตัวอย่างได้เลยตอนนี้ และดูโค้ดในที่เก็บ GitHub ของเรา
การควบคุมที่กำหนดเอง
คุณจะเห็นว่าเลย์เอาต์ HTML ที่เราจะใช้สำหรับมีเดียเพลเยอร์นั้นค่อนข้างเรียบง่าย โดยองค์ประกอบรูท <div> มีองค์ประกอบสื่อ <video> และองค์ประกอบย่อย <div> สำหรับการควบคุมวิดีโอโดยเฉพาะ
ส่วนการควบคุมวิดีโอที่เราจะพูดถึงในภายหลัง ได้แก่ ปุ่มเล่น/หยุดชั่วคราว ปุ่มเต็มหน้าจอ ปุ่มกรอไปข้างหน้าและย้อนกลับ และองค์ประกอบบางอย่างสำหรับเวลาปัจจุบัน ระยะเวลา และการติดตามเวลา
<div id="videoContainer">
<video id="video" src="file.mp4"></video>
<div id="videoControls"></div>
</div>
อ่านข้อมูลเมตาของวิดีโอ
ก่อนอื่น ให้รอโหลดข้อมูลเมตาของวิดีโอเพื่อตั้งค่าความยาววิดีโอ เวลาปัจจุบัน และเริ่มต้นแถบความคืบหน้า โปรดทราบว่าฟังก์ชัน secondsToTimeCode() เป็นฟังก์ชันยูทิลิตีที่กำหนดเองซึ่งฉันเขียนขึ้นเพื่อแปลงจำนวนวินาทีเป็นสตริงในรูปแบบ "hh:mm:ss" ซึ่งเหมาะกับกรณีของเรามากกว่า
<div id="videoContainer">
<video id="video" src="file.mp4"></video>
<div id="videoControls">
<strong>
<div id="videoCurrentTime"></div>
<div id="videoDuration"></div>
<div id="videoProgressBar"></div>
</strong>
</div>
</div>
video.addEventListener('loadedmetadata', function () {
videoDuration.textContent = secondsToTimeCode(video.duration);
videoCurrentTime.textContent = secondsToTimeCode(video.currentTime);
videoProgressBar.style.transform = `scaleX(${
video.currentTime / video.duration
})`;
});
เล่น/หยุดวิดีโอชั่วคราว
ตอนนี้ข้อมูลเมตาของวิดีโอโหลดแล้ว มาเพิ่มปุ่มแรกที่ให้ผู้ใช้เล่นและหยุดวิดีโอชั่วคราวด้วย video.play() และ video.pause() โดยขึ้นอยู่กับสถานะการเล่น
<div id="videoContainer">
<video id="video" src="file.mp4"></video>
<div id="videoControls">
<strong><button id="playPauseButton"></button></strong>
<div id="videoCurrentTime"></div>
<div id="videoDuration"></div>
<div id="videoProgressBar"></div>
</div>
</div>
playPauseButton.addEventListener('click', function (event) {
event.stopPropagation();
if (video.paused) {
video.play();
} else {
video.pause();
}
});
เราใช้เหตุการณ์วิดีโอ play และ pause แทนการปรับการควบคุมวิดีโอใน Listener เหตุการณ์ click การทำให้ตัวควบคุมเป็นแบบอิงตามเหตุการณ์จะช่วยเพิ่มความยืดหยุ่น (ดังที่เราจะเห็นในภายหลังด้วย Media Session API) และช่วยให้เราซิงค์ตัวควบคุมได้หากเบราว์เซอร์แทรกแซงการเล่น
เมื่อวิดีโอเริ่มเล่น เราจะเปลี่ยนสถานะปุ่มเป็น "หยุดชั่วคราว" และซ่อนตัวควบคุมวิดีโอ เมื่อวิดีโอหยุดชั่วคราว เราเพียงเปลี่ยนสถานะปุ่มเป็น "เล่น" และแสดงตัวควบคุมวิดีโอ
video.addEventListener('play', function () {
playPauseButton.classList.add('playing');
});
video.addEventListener('pause', function () {
playPauseButton.classList.remove('playing');
});
เมื่อเวลาที่ระบุโดยแอตทริบิวต์ currentTime ของวิดีโอมีการเปลี่ยนแปลงผ่านเหตุการณ์วิดีโอ timeupdate เราจะอัปเดตการควบคุมที่กำหนดเองด้วยหากมองเห็นได้
video.addEventListener('timeupdate', function () {
if (videoControls.classList.contains('visible')) {
videoCurrentTime.textContent = secondsToTimeCode(video.currentTime);
videoProgressBar.style.transform = `scaleX(${
video.currentTime / video.duration
})`;
}
});
เมื่อวิดีโอจบลง เราจะเปลี่ยนสถานะปุ่มเป็น "เล่น" ตั้งค่าวิดีโอ
currentTime กลับเป็น 0 และแสดงตัวควบคุมวิดีโอในตอนนี้ โปรดทราบว่าเรายังเลือกโหลดวิดีโออื่นโดยอัตโนมัติได้ด้วยหากผู้ใช้เปิดใช้ฟีเจอร์ "เล่นอัตโนมัติ" บางประเภท
video.addEventListener('ended', function () {
playPauseButton.classList.remove('playing');
video.currentTime = 0;
});
กรอย้อนกลับและกรอไปข้างหน้า
มาต่อกันที่การเพิ่มปุ่ม "กรอกลับ" และ "กรอไปข้างหน้า" เพื่อให้ผู้ใช้ข้ามเนื้อหาบางส่วนได้ง่ายๆ
<div id="videoContainer">
<video id="video" src="file.mp4"></video>
<div id="videoControls">
<button id="playPauseButton"></button>
<strong
><button id="seekForwardButton"></button>
<button id="seekBackwardButton"></button
></strong>
<div id="videoCurrentTime"></div>
<div id="videoDuration"></div>
<div id="videoProgressBar"></div>
</div>
</div>
var skipTime = 10; // Time to skip in seconds
seekForwardButton.addEventListener('click', function (event) {
event.stopPropagation();
video.currentTime = Math.min(video.currentTime + skipTime, video.duration);
});
seekBackwardButton.addEventListener('click', function (event) {
event.stopPropagation();
video.currentTime = Math.max(video.currentTime - skipTime, 0);
});
เช่นเดียวกับก่อนหน้านี้ แทนที่จะปรับการจัดรูปแบบวิดีโอใน Listener เหตุการณ์ click ของปุ่มเหล่านี้ เราจะใช้เหตุการณ์วิดีโอ seeking และ seeked ที่เริ่มทำงานเพื่อปรับความสว่างของวิดีโอ คลาส CSS seeking ที่กำหนดเองของฉันนั้นเรียบง่ายเหมือน filter: brightness(0);
video.addEventListener('seeking', function () {
video.classList.add('seeking');
});
video.addEventListener('seeked', function () {
video.classList.remove('seeking');
});
ด้านล่างนี้คือสิ่งที่เราสร้างขึ้นจนถึงตอนนี้ ในส่วนถัดไป เราจะใช้ปุ่มเต็มหน้าจอ
เต็มหน้าจอ
ในที่นี้เราจะใช้ประโยชน์จาก Web API หลายรายการเพื่อสร้างประสบการณ์การใช้งานแบบเต็มหน้าจอที่สมบูรณ์แบบและราบรื่น หากต้องการดูการทำงานจริง โปรดดูตัวอย่าง
แน่นอนว่าคุณไม่จำเป็นต้องใช้ทุกอย่าง เพียงเลือกขั้นตอนที่เหมาะสมกับคุณและนำมารวมกันเพื่อสร้างขั้นตอนที่กำหนดเอง
ป้องกันการแสดงผลแบบเต็มหน้าจอโดยอัตโนมัติ
ใน iOS องค์ประกอบ video จะเข้าสู่โหมดเต็มหน้าจอโดยอัตโนมัติเมื่อเริ่มเล่นสื่อ เนื่องจากเราพยายามปรับแต่งและควบคุมประสบการณ์การใช้งานสื่อในเบราว์เซอร์บนมือถือให้ได้มากที่สุด เราขอแนะนำให้คุณตั้งค่าแอตทริบิวต์ playsinline ขององค์ประกอบ video เพื่อบังคับให้เล่นแบบแทรกในบรรทัดบน iPhone และไม่เข้าสู่โหมดเต็มหน้าจอเมื่อเริ่มเล่น โปรดทราบว่าการดำเนินการนี้ไม่มีผลข้างเคียงต่อเบราว์เซอร์อื่นๆ
<div id="videoContainer"></div>
<video id="video" src="file.mp4"></video><strong>playsinline</strong></video>
<div id="videoControls">...</div>
</div>
สลับเป็นเต็มหน้าจอเมื่อคลิกปุ่ม
ตอนนี้เราป้องกันไม่ให้วิดีโอแสดงแบบเต็มหน้าจอโดยอัตโนมัติแล้ว เราจึงต้องจัดการโหมดเต็มหน้าจอสำหรับวิดีโอด้วย Fullscreen API ด้วยตนเอง เมื่อผู้ใช้คลิก "ปุ่มเต็มหน้าจอ" ให้ออกจากโหมดเต็มหน้าจอด้วย document.exitFullscreen() หากเอกสารกำลังใช้โหมดเต็มหน้าจออยู่ หรือขอให้แสดงแบบเต็มหน้าจอในคอนเทนเนอร์วิดีโอด้วยเมธอด requestFullscreen() หากมี หรือใช้ webkitEnterFullscreen() ในองค์ประกอบวิดีโอเฉพาะใน iOS
<div id="videoContainer">
<video id="video" src="file.mp4"></video>
<div id="videoControls">
<button id="playPauseButton"></button>
<button id="seekForwardButton"></button>
<button id="seekBackwardButton"></button>
<strong><button id="fullscreenButton"></button></strong>
<div id="videoCurrentTime"></div>
<div id="videoDuration"></div>
<div id="videoProgressBar"></div>
</div>
</div>
fullscreenButton.addEventListener('click', function (event) {
event.stopPropagation();
if (document.fullscreenElement) {
document.exitFullscreen();
} else {
requestFullscreenVideo();
}
});
function requestFullscreenVideo() {
if (videoContainer.requestFullscreen) {
videoContainer.requestFullscreen();
} else {
video.webkitEnterFullscreen();
}
}
document.addEventListener('fullscreenchange', function () {
fullscreenButton.classList.toggle('active', document.fullscreenElement);
});
เปิด/ปิดโหมดเต็มหน้าจอเมื่อการวางแนวหน้าจอเปลี่ยนไป
เมื่อผู้ใช้หมุนอุปกรณ์เป็นโหมดแนวนอน เราจะดำเนินการอย่างชาญฉลาดและขอโหมดเต็มหน้าจอโดยอัตโนมัติเพื่อสร้างประสบการณ์ที่สมจริง สำหรับกรณีนี้ เราจะต้องใช้ Screen Orientation API ซึ่งยังไม่รองรับในทุกที่และยังคงมีคำนำหน้าในบางเบราว์เซอร์ในขณะนั้น ดังนั้น นี่จะเป็นการเพิ่มประสิทธิภาพแบบต่อเนื่องครั้งแรกของเรา
คุณลักษณะนี้ทำงานอย่างไร ทันทีที่ตรวจพบการเปลี่ยนแปลงการวางแนวหน้าจอ ให้ขอโหมดเต็มหน้าจอหากหน้าต่างเบราว์เซอร์อยู่ในโหมดแนวนอน (นั่นคือ ความกว้างมากกว่าความสูง) หากไม่ ให้ออกจากโหมดเต็มหน้าจอ ไม่มีแล้ว
if ('orientation' in screen) {
screen.orientation.addEventListener('change', function () {
// Let's request fullscreen if user switches device in landscape mode.
if (screen.orientation.type.startsWith('landscape')) {
requestFullscreenVideo();
} else if (document.fullscreenElement) {
document.exitFullscreen();
}
});
}
ล็อกหน้าจอเป็นแนวนอนเมื่อคลิกปุ่ม
เนื่องจากวิดีโออาจดูได้ดีกว่าในโหมดแนวนอน เราจึงอาจต้องการล็อกหน้าจอในแนวนอนเมื่อผู้ใช้คลิก "ปุ่มเต็มหน้าจอ" เราจะรวม Screen Orientation API ที่ใช้ก่อนหน้านี้และ Media Query บางส่วนเข้าด้วยกันเพื่อให้แน่ใจว่าประสบการณ์การใช้งานนี้ดีที่สุด
การล็อกหน้าจอในแนวนอนทำได้ง่ายๆ เพียงพูดว่า
screen.orientation.lock('landscape') อย่างไรก็ตาม เราควรทำเช่นนี้เฉพาะเมื่ออุปกรณ์อยู่ในโหมดแนวตั้งที่มี matchMedia('(orientation: portrait)') และถือได้ด้วยมือเดียวที่มี matchMedia('(max-device-width: 768px)') เนื่องจากผู้ใช้แท็บเล็ตอาจได้รับประสบการณ์การใช้งานที่ไม่ดีนัก
fullscreenButton.addEventListener('click', function (event) {
event.stopPropagation();
if (document.fullscreenElement) {
document.exitFullscreen();
} else {
requestFullscreenVideo();
<strong>lockScreenInLandscape();</strong>;
}
});
function lockScreenInLandscape() {
if (!('orientation' in screen)) {
return;
}
// Let's force landscape mode only if device is in portrait mode and can be held in one hand.
if (
matchMedia('(orientation: portrait) and (max-device-width: 768px)').matches
) {
screen.orientation.lock('landscape');
}
}
ปลดล็อกหน้าจอเมื่อเปลี่ยนการวางแนวอุปกรณ์
คุณอาจสังเกตเห็นว่าประสบการณ์การใช้งานหน้าจอล็อกที่เราเพิ่งสร้างขึ้นนั้นไม่สมบูรณ์แบบ เนื่องจากเราไม่ได้รับการเปลี่ยนแปลงการวางแนวหน้าจอเมื่อหน้าจอล็อกอยู่
วิธีแก้ไขปัญหานี้คือให้ใช้ Device Orientation API หากมี API นี้ให้ข้อมูลจากฮาร์ดแวร์ที่วัดตำแหน่งและการเคลื่อนไหวของอุปกรณ์ในพื้นที่ว่าง ได้แก่ เครื่องวัดการหมุนและเข็มทิศดิจิทัลสำหรับการวางแนว และตัวตรวจวัดความเร่งสำหรับความเร็ว เมื่อเราตรวจพบการเปลี่ยนแปลงการวางแนวอุปกรณ์ ให้ปลดล็อกหน้าจอด้วย screen.orientation.unlock() หากผู้ใช้ถืออุปกรณ์ในโหมดแนวตั้งและหน้าจอล็อกอยู่ในโหมดแนวนอน
function lockScreenInLandscape() {
if (!('orientation' in screen)) {
return;
}
// Let's force landscape mode only if device is in portrait mode and can be held in one hand.
if (matchMedia('(orientation: portrait) and (max-device-width: 768px)').matches) {
screen.orientation.lock('landscape')
<strong>.then(function() {
listenToDeviceOrientationChanges();
})</strong>;
}
}
function listenToDeviceOrientationChanges() {
if (!('DeviceOrientationEvent' in window)) {
return;
}
var previousDeviceOrientation, currentDeviceOrientation;
window.addEventListener(
'deviceorientation',
function onDeviceOrientationChange(event) {
// event.beta represents a front to back motion of the device and
// event.gamma a left to right motion.
if (Math.abs(event.gamma) > 10 || Math.abs(event.beta) < 10) {
previousDeviceOrientation = currentDeviceOrientation;
currentDeviceOrientation = 'landscape';
return;
}
if (Math.abs(event.gamma) < 10 || Math.abs(event.beta) > 10) {
previousDeviceOrientation = currentDeviceOrientation;
// When device is rotated back to portrait, let's unlock screen orientation.
if (previousDeviceOrientation == 'landscape') {
screen.orientation.unlock();
window.removeEventListener(
'deviceorientation',
onDeviceOrientationChange,
);
}
}
},
);
}
อย่างที่คุณเห็น นี่คือประสบการณ์การใช้งานแบบเต็มหน้าจอที่ราบรื่นที่เราต้องการ ดูตัวอย่างเพื่อดูการทำงานจริง
การเล่นขณะล็อกหน้าจอหรือขณะใช้แอปอื่น
เมื่อตรวจพบว่าหน้าเว็บหรือวิดีโอในหน้าเว็บไม่แสดงอีกต่อไป คุณอาจต้องอัปเดตข้อมูลวิเคราะห์เพื่อให้สอดคล้องกับกรณีนี้ นอกจากนี้ยังอาจส่งผลต่อการเล่นปัจจุบัน เช่น การเลือกแทร็กอื่น การหยุดชั่วคราว หรือแม้แต่การแสดงปุ่มที่กำหนดเองให้ผู้ใช้เห็น เป็นต้น
หยุดวิดีโอชั่วคราวเมื่อระดับการมองเห็นหน้าเว็บเปลี่ยนไป
Page Visibility API ช่วยให้เรากำหนดระดับการเข้าถึงปัจจุบันของหน้าเว็บและรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงระดับการเข้าถึงได้ โค้ดด้านล่างจะหยุดวิดีโอชั่วคราวเมื่อหน้าเว็บถูกซ่อน กรณีนี้จะเกิดขึ้นเมื่อการล็อกหน้าจอทำงานอยู่หรือเมื่อคุณสลับแท็บ เป็นต้น
เนื่องจากเบราว์เซอร์บนมือถือส่วนใหญ่มีตัวควบคุมนอกเบราว์เซอร์ที่อนุญาตให้เล่นวิดีโอที่หยุดชั่วคราวต่อได้ เราขอแนะนำให้คุณตั้งค่าลักษณะการทำงานนี้เฉพาะในกรณีที่ผู้ใช้ได้รับอนุญาตให้เล่นในเบื้องหลัง
document.addEventListener('visibilitychange', function () {
// Pause video when page is hidden.
if (document.hidden) {
video.pause();
}
});
แสดง/ซ่อนปุ่มปิดเสียงเมื่อระดับการมองเห็นของวิดีโอเปลี่ยนแปลง
หากใช้ Intersection Observer API ใหม่ คุณจะเจาะลึกได้มากขึ้นโดยไม่มีค่าใช้จ่าย API นี้ช่วยให้คุณทราบเมื่อองค์ประกอบที่สังเกตเข้าหรือออกจากวิวพอร์ตของเบราว์เซอร์
มาแสดง/ซ่อนปุ่มปิดเสียงตามระดับการมองเห็นวิดีโอในหน้าเว็บกัน หากวิดีโอกำลังเล่นอยู่แต่ไม่แสดงในขณะนั้น ปุ่มปิดเสียงขนาดเล็กจะแสดงที่มุมขวาล่างของหน้าเพื่อให้ผู้ใช้ควบคุมเสียงของวิดีโอได้ ระบบจะใช้เหตุการณ์วิดีโอ volumechange เพื่ออัปเดตการจัดรูปแบบปุ่มปิดเสียง
<button id="muteButton"></button>
if ('IntersectionObserver' in window) {
// Show/hide mute button based on video visibility in the page.
function onIntersection(entries) {
entries.forEach(function (entry) {
muteButton.hidden = video.paused || entry.isIntersecting;
});
}
var observer = new IntersectionObserver(onIntersection);
observer.observe(video);
}
muteButton.addEventListener('click', function () {
// Mute/unmute video on button click.
video.muted = !video.muted;
});
video.addEventListener('volumechange', function () {
muteButton.classList.toggle('active', video.muted);
});
เล่นวิดีโอได้ครั้งละ 1 รายการเท่านั้น
หากมีวิดีโอมากกว่า 1 รายการในหน้าเว็บ เราขอแนะนำให้คุณเล่นเพียงวิดีโอเดียวและหยุดวิดีโออื่นๆ ชั่วคราวโดยอัตโนมัติ เพื่อให้ผู้ใช้ไม่ต้องฟังแทร็กเสียงหลายแทร็กที่เล่นพร้อมกัน
// This array should be initialized once all videos have been added.
var videos = Array.from(document.querySelectorAll('video'));
videos.forEach(function (video) {
video.addEventListener('play', pauseOtherVideosPlaying);
});
function pauseOtherVideosPlaying(event) {
var videosToPause = videos.filter(function (video) {
return !video.paused && video != event.target;
});
// Pause all other videos currently playing.
videosToPause.forEach(function (video) {
video.pause();
});
}
ปรับแต่งการแจ้งเตือนเกี่ยวกับสื่อ
นอกจากนี้ คุณยังปรับแต่งการแจ้งเตือนสื่อได้ด้วย Media Session API โดยการให้ข้อมูลเมตาสำหรับวิดีโอที่กำลังเล่นอยู่ นอกจากนี้ยังช่วยให้คุณจัดการเหตุการณ์ที่เกี่ยวข้องกับสื่อ เช่น การกรอหรือการเปลี่ยนแทร็ก ซึ่งอาจมาจากการแจ้งเตือนหรือแป้นสื่อ หากต้องการดูตัวอย่างการใช้งานจริง โปรดดูตัวอย่าง
เมื่อเว็บแอปเล่นเสียงหรือวิดีโอ คุณจะเห็นการแจ้งเตือนสื่ออยู่ในถาดการแจ้งเตือนอยู่แล้ว ใน Android นั้น Chrome จะพยายามอย่างเต็มที่เพื่อแสดงข้อมูลที่เหมาะสมโดยใช้ชื่อของเอกสารและรูปภาพไอคอนที่ใหญ่ที่สุดที่พบ
มาดูวิธีปรับแต่งการแจ้งเตือนสื่อนี้โดยการตั้งค่าข้อมูลเมตาของเซสชันสื่อ เช่น ชื่อ ศิลปิน ชื่ออัลบั้ม และอาร์ตเวิร์กด้วย Media Session API
playPauseButton.addEventListener('click', function(event) {
event.stopPropagation();
if (video.paused) {
video.play()
<strong>.then(function() {
setMediaSession();
});</strong>
} else {
video.pause();
}
});
function setMediaSession() {
if (!('mediaSession' in navigator)) {
return;
}
navigator.mediaSession.metadata = new MediaMetadata({
title: 'Never Gonna Give You Up',
artist: 'Rick Astley',
album: 'Whenever You Need Somebody',
artwork: [
{src: 'https://dummyimage.com/96x96', sizes: '96x96', type: 'image/png'},
{
src: 'https://dummyimage.com/128x128',
sizes: '128x128',
type: 'image/png',
},
{
src: 'https://dummyimage.com/192x192',
sizes: '192x192',
type: 'image/png',
},
{
src: 'https://dummyimage.com/256x256',
sizes: '256x256',
type: 'image/png',
},
{
src: 'https://dummyimage.com/384x384',
sizes: '384x384',
type: 'image/png',
},
{
src: 'https://dummyimage.com/512x512',
sizes: '512x512',
type: 'image/png',
},
],
});
}
เมื่อเล่นเสร็จแล้ว คุณไม่จำเป็นต้อง "ปล่อย" เซสชันสื่อ เนื่องจากการแจ้งเตือนจะหายไปโดยอัตโนมัติ โปรดทราบว่าระบบจะใช้ navigator.mediaSession.metadata ปัจจุบันเมื่อเริ่มเล่น คุณจึงต้องอัปเดตข้อมูลเพื่อให้แน่ใจว่าคุณแสดงข้อมูลที่เกี่ยวข้องในการแจ้งเตือนสื่ออยู่เสมอ
หากเว็บแอปของคุณมีเพลย์ลิสต์ คุณอาจต้องการอนุญาตให้ผู้ใช้ไปยังส่วนต่างๆ ของเพลย์ลิสต์ได้โดยตรงจากการแจ้งเตือนสื่อด้วยไอคอน "แทร็กก่อนหน้า" และ "แทร็กถัดไป"
if ('mediaSession' in navigator) {
navigator.mediaSession.setActionHandler('previoustrack', function () {
// User clicked "Previous Track" media notification icon.
playPreviousVideo(); // load and play previous video
});
navigator.mediaSession.setActionHandler('nexttrack', function () {
// User clicked "Next Track" media notification icon.
playNextVideo(); // load and play next video
});
}
โปรดทราบว่าเครื่องจัดการการดำเนินการกับสื่อจะยังคงอยู่ ซึ่งคล้ายกับรูปแบบ Listener เหตุการณ์มาก ยกเว้นว่าการจัดการเหตุการณ์หมายความว่าเบราว์เซอร์จะหยุดลักษณะการทำงานเริ่มต้นทั้งหมดและใช้เหตุการณ์นี้เป็นสัญญาณว่าเว็บแอปของคุณรองรับการดำเนินการกับสื่อ ดังนั้น ระบบจะไม่แสดงตัวควบคุมการดำเนินการกับสื่อ เว้นแต่คุณจะตั้งค่าตัวแฮนเดิลการดำเนินการที่เหมาะสม
อย่างไรก็ตาม การยกเลิกการตั้งค่าเครื่องจัดการการดำเนินการกับสื่อทำได้ง่ายๆ โดยกำหนดค่าเป็น null
Media Session API ช่วยให้คุณแสดงไอคอนการแจ้งเตือนสื่อ "กรอกลับ" และ "กรอไปข้างหน้า" ได้หากต้องการควบคุมระยะเวลาที่ข้าม
if ('mediaSession' in navigator) {
let skipTime = 10; // Time to skip in seconds
navigator.mediaSession.setActionHandler('seekbackward', function () {
// User clicked "Seek Backward" media notification icon.
video.currentTime = Math.max(video.currentTime - skipTime, 0);
});
navigator.mediaSession.setActionHandler('seekforward', function () {
// User clicked "Seek Forward" media notification icon.
video.currentTime = Math.min(video.currentTime + skipTime, video.duration);
});
}
ไอคอน "เล่น/หยุดชั่วคราว" จะแสดงในการแจ้งเตือนสื่อเสมอ และเบราว์เซอร์จะจัดการเหตุการณ์ที่เกี่ยวข้องโดยอัตโนมัติ หากลักษณะการทำงานเริ่มต้นใช้ไม่ได้ด้วยเหตุผลบางประการ คุณยังคงจัดการเหตุการณ์สื่อ "เล่น" และ "หยุดชั่วคราว" ได้
ข้อดีของ Media Session API คือถาดการแจ้งเตือนไม่ใช่ที่เดียวที่แสดงข้อมูลเมตาและตัวควบคุมสื่อ การแจ้งเตือนสื่อจะซิงค์กับอุปกรณ์ที่สวมใส่ได้ที่จับคู่ไว้โดยอัตโนมัติ และยังแสดงบนหน้าจอล็อกด้วย