Menu

Thẻ audio HTML: chèn âm thanh, controls, autoplay và loop

Phần tử <audio> phát tệp âm thanh bằng trình phát có sẵn của trình duyệt. Tìm hiểu cách viết, các thuộc tính (controls, autoplay, loop, muted, preload), nên dùng định dạng nào, vì sao autoplay có tiếng bị chặn và cách tự làm nút phát bằng JavaScript.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

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ínhTác dụng
controlsHiển thị trình phát của trình duyệt
autoplayThử phát ngay khi tải trang (bị chặn nếu có tiếng, xem bên dưới)
loopPhát lại từ đầu khi tệp kết thúc
mutedBắt đầu với âm lượng tắt
preloadnone (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)
srcTệ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ạngKiểu MIMEGhi chú
MP3audio/mpegPhá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/webmTệ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
WAVaudio/wavKhô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 autoplay hoạt động. Hãy bắt đầu phát từ một cú nhấp và xử lý promise của play().
  • 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 type khớp với định dạng thật (audio/mpeg cho 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.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu