Cách chèn âm thanh
Trỏ phần tử <audio> tới một tệp âm thanh và thêm controls:
<audio src="song.mp3" controls></audio>
controls hiển thị trình phát của trình duyệt: phát và tạm dừng, thanh thời gian, thời lượng và nút chỉnh âm lượng. Không có controls, phần tử không chiếm chỗ nào cả. Khung xem trước không tải được tệp từ máy tính của bạn, nên ví dụ này dùng một script tạo một tệp WAV ngắn ngay trong trình duyệt và dùng nó làm src. Nhấn phát thử:
Trình phát trông khác nhau trên Chrome, Firefox và Safari, vì mỗi trình duyệt tự vẽ trình phát của mình. Xóa controls thì trình phát biến mất, nhưng âm thanh vẫn còn đó để JavaScript phát.
Thuộc tính của audio
| Thuộc tính | Tác dụng |
|---|---|
controls | Hiển thị trình phát của trình duyệt |
autoplay | Thử phát ngay khi tải trang (bị chặn nếu có tiếng, xem bên dưới) |
loop | Phát lại từ đầu khi tệp kết thúc |
muted | Bắt đầu với âm lượng tắt |
preload | none (không tải gì cho tới khi phát), metadata (chỉ tải độ dài) hoặc auto (trình duyệt tự quyết) |
src | Tệp cần phát; hoặc dùng các phần tử con <source> cho nhiều định dạng |
Dùng preload="none" hoặc "metadata" cho trang có nhiều trình phát, như danh sách tập podcast, để trang không tải trước mọi tệp.
Định dạng và phương án dự phòng
Liệt kê nhiều tệp bằng <source> và trình duyệt sẽ phát tệp đầu tiên mà nó hỗ trợ. Chữ bên trong phần tử chỉ hiện trên trình duyệt không hỗ trợ <audio>:
<audio controls preload="metadata">
<source src="episode.opus" type="audio/ogg; codecs=opus">
<source src="episode.mp3" type="audio/mpeg">
<p>Your browser cannot play audio. <a href="episode.mp3">Download the episode</a>.</p>
</audio>
| Định dạng | Kiểu MIME | Ghi chú |
|---|---|---|
| MP3 | audio/mpeg | Phát được trên mọi trình duyệt hiện nay; lựa chọn an toàn khi chỉ có một tệp |
AAC (.m4a) | audio/mp4 | Được hỗ trợ rộng rãi, chất lượng tốt với dung lượng nhỏ |
Opus hoặc Vorbis (.ogg, .webm) | audio/ogg, audio/webm | Tệp nhỏ; hãy thêm MP3 làm dự phòng, vì mức hỗ trợ trên Safari khác nhau tùy phiên bản |
| WAV | audio/wav | Không nén và nặng; ổn cho hiệu ứng âm thanh ngắn |
Vì sao autoplay không chạy
Trình duyệt không cho trang tự phát ra tiếng. autoplay, hoặc gọi play() trước khi người dùng nhấp hay chạm, đều bị từ chối. Ví dụ này thử phát ngay khi tải trang và in ra kết quả, rồi đưa ra một nút bấm:
Thường bạn sẽ thấy NotAllowedError, lỗi mà trình duyệt trả về khi chặn việc phát. Nút bấm thì chạy được vì một cú nhấp được tính là sự cho phép. Mỗi trình duyệt còn có quy tắc riêng (ví dụ Chrome ghi nhớ những trang bạn hay phát media), nên đừng bao giờ dựa vào autoplay: hãy phát âm thanh từ một thao tác của người dùng, và luôn xử lý promise mà play() trả về.
new Audio(url) tạo một phần tử audio trong JavaScript mà không thêm nó vào trang, rất tiện cho hiệu ứng âm thanh.
Tự làm nút điều khiển
Ẩn trình phát có sẵn bằng cách bỏ controls, rồi điều khiển phần tử qua API JavaScript của nó: play(), pause(), currentTime, duration, volume, và các sự kiện như timeupdate và ended:
Nút này là một <button> thật, nên dùng được bằng bàn phím, và nhãn của nó đổi qua lại giữa Play và Pause. Khi tệp phát hết, trình duyệt tạm dừng phần tử và phát sự kiện ended, nên nút tự trở về Play. Nếu tự làm nút điều khiển, bạn cũng phải tự lo những gì nút có sẵn cho không: hỗ trợ bàn phím, nhãn và nút chỉnh âm lượng.
Khả năng tiếp cận
- Đừng bao giờ tự phát âm thanh. Nó cắt ngang trình đọc màn hình và làm người dùng giật mình. Hãy phát âm thanh từ một cú nhấp.
- Cung cấp bản ghi lời cho podcast và âm thanh có lời nói. Một link tới bản văn bản dưới trình phát là đủ, và công cụ tìm kiếm cũng đọc được nó.
- Giữ
controls, hoặc làm nút điều khiển bằng nút thật, để có thể tạm dừng âm thanh bằng bàn phím.
Với video có tiếng, phụ đề và ảnh bìa, xem trang thẻ video; <audio> dùng chung hầu hết thuộc tính và toàn bộ API JavaScript với nó.
Lỗi thường gặp
- Quên
controls. Không có nó phần tử sẽ vô hình, trông như chẳng có gì xảy ra. - Mong
autoplayhoạt động. Hãy bắt đầu phát từ một cú nhấp và xử lý promise củaplay(). - Sai đường dẫn hoặc kiểu tệp. Mở trực tiếp URL của tệp để kiểm tra, và đặt
typekhớp với định dạng thật (audio/mpegcho MP3). - Tải mọi tệp trong một danh sách dài. Dùng
preload="none"hoặc"metadata". - Nhạc nền không tắt được. Luôn cho người dùng một cách nhìn thấy được để tạm dừng.
Câu hỏi thường gặp
Làm sao chèn âm thanh vào trang HTML?
Dùng <audio src="song.mp3" controls></audio>. Thuộc tính controls hiển thị trình phát của trình duyệt với nút phát, thanh thời gian và âm lượng. Không có nó, phần tử sẽ vô hình.
Tại sao âm thanh của tôi không tự phát?
Trình duyệt chặn âm thanh có tiếng tự phát khi người dùng chưa tương tác với trang. Hãy bắt đầu phát từ một cú nhấp bằng audio.play(). Phần tử bị tắt tiếng có thể tự phát, nhưng với âm thanh thì điều đó hiếm khi có ích.
Nên dùng định dạng âm thanh nào trong HTML?
MP3 phát được trên mọi trình duyệt hiện nay, nên là lựa chọn an toàn khi chỉ có một tệp. AAC trong tệp .m4a cũng được hỗ trợ rộng rãi. Dùng các phần tử <source> để cung cấp nhiều định dạng.
Làm sao phát lặp lại âm thanh trong HTML?
Thêm thuộc tính loop: <audio src="rain.mp3" controls loop>. Khi tệp phát hết, nó sẽ bắt đầu lại từ đầu.
Làm sao phát âm thanh bằng JavaScript?
Tạo hoặc chọn một phần tử audio rồi gọi play(), ví dụ new Audio('click.mp3').play() bên trong trình xử lý sự kiện click. play() trả về một promise, promise này bị reject nếu trình duyệt chặn việc phát.
Có định dạng được trình phát audio của HTML không?
Chỉ một chút: bạn có thể đặt chiều rộng, margin và display, nhưng các nút bên trong do trình duyệt vẽ và mỗi trình duyệt trông một kiểu. Muốn giao diện riêng, hãy ẩn controls và tự làm bằng các nút cùng API JavaScript của audio.