Lớp AudioInputStream
(Class AudioInputStream)
Lớp AudioInputStream kế thừa từ InputStream và cung cấp một luồng đầu vào có định dạng âm thanh cụ thể và độ dài được xác định. Độ dài của luồng này được biểu diễn bằng các khung mẫu (sample frames), chứ không phải bằng byte. Lớp này cung cấp nhiều phương thức để đọc một số lượng byte nhất định từ luồng hoặc đọc một số lượng byte không xác định. AudioInputStream sẽ theo dõi byte cuối cùng đã được đọc, và bạn có thể bỏ qua một số lượng byte tùy ý để đến một vị trí đọc sau đó. Ngoài ra, AudioInputStream có thể hỗ trợ các điểm đánh dấu (marks). Khi bạn thiết lập một điểm đánh dấu, vị trí hiện tại sẽ được nhớ lại để bạn có thể quay lại vị trí đó sau này.
AudioSystem chỉ hỗ trợ một số định dạng tệp âm thanh cụ thể như WAV, AIFF, AU, và hơn nữa. Nếu tệp âm thanh của bạn có định dạng không được hỗ trợ (như MP3, AAC, FLAC), bạn sẽ gặp lỗi.
Lớp AudioSystem bao gồm nhiều phương thức để thao tác với các đối tượng AudioInputStream. Ví dụ, các phương thức này cho phép bạn:
↳ Nhận một luồng đầu vào âm thanh từ một tệp âm thanh bên ngoài, luồng hoặc URL.
↳ Ghi một tệp bên ngoài từ một luồng đầu vào âm thanh.
↳ Chuyển đổi một luồng đầu vào âm thanh sang một định dạng âm thanh khác.
Khai báo lớp AudioInputStream trong Java
Để sử dụng lớp AudioInputStream, bạn cần import gói javax.sound.sampled bạn cần thêm câu lệnh import vào đầu file Java của mình.
Cú pháp câu lệnh import:
Cú pháp
import javax.sound.sampled.AudioInputStream;
Cú pháp khai báo Lớp AudioInputStream:
Cú pháp
public class AudioInputStream
extends InputStream
Dưới đây là giải thích chi tiết về cú pháp khai báo này:
↳ public class AudioInputStream: Đây là khai báo một lớp công khai (public) tên là AudioInputStream. Lớp này có thể được truy cập từ bất kỳ đâu trong dự án Java, miễn là nó được import hoặc ở cùng gói.
↳ Kế thừa InputStream: AudioInputStream kế thừa từ lớp InputStream, điều này có nghĩa là nó kế thừa các phương thức đọc byte từ InputStream. Tuy nhiên, AudioInputStream cung cấp các phương thức chuyên biệt để xử lý dữ liệu âm thanh.
↳ Xử lý Dữ liệu Âm Thanh: AudioInputStream được thiết kế để làm việc với dữ liệu âm thanh, cho phép bạn đọc dữ liệu âm thanh từ các nguồn như file âm thanh, dòng âm thanh, hoặc bất kỳ nguồn nào hỗ trợ giao diện âm thanh.
Các trường (fields) của lớp AudioInputStream
Lớp AudioInputStream có các trường sau:
↳ protected format (AudioFormat): Là một trường được bảo vệ (protected) nên chỉ có thể truy cập từ bên trong lớp và các lớp con. Đại diện cho định dạng dữ liệu âm thanh trong luồng. Chứa thông tin về mã hóa, tần số lấy mẫu, số kênh, kích thước mẫu, v.v.
↳ protected frameLength (long): Là một trường được bảo vệ (protected). Đại diện cho độ dài của luồng âm thanh, được tính bằng số frame mẫu. Cho biết tổng số frame mẫu trong toàn bộ luồng.
↳ protected framePos (long): Là một trường được bảo vệ (protected). Đại diện cho vị trí hiện tại trong luồng âm thanh, được tính bằng số frame mẫu. Giá trị bắt đầu từ 0 và tăng dần khi đọc dữ liệu.
↳ protected frameSize (int): Là một trường được bảo vệ (protected). Đại diện cho kích thước của mỗi frame âm thanh, tính bằng byte.Cho biết số byte của một frame mẫu.
Các constructor của lớp AudioInputStream
Lớp AudioInputStream có hai constructor chính:
↳ AudioInputStream(InputStream stream, AudioFormat format, long length): Tạo một đối tượng AudioInputStream từ một luồng đầu vào InputStream. Định dạng âm thanh của luồng được xác định bởi tham số format. Độ dài của luồng được xác định bởi tham số length (tính bằng số frame mẫu).
↳ AudioInputStream(TargetDataLine line): Tạo một đối tượng AudioInputStream từ một đối tượng TargetDataLine. Đọc dữ liệu âm thanh trực tiếp từ thiết bị đầu vào.
Lưu ý: Cả hai constructor đều yêu cầu thông tin về định dạng âm thanh và độ dài của luồng. Constructor thứ hai thường được sử dụng để thu âm trực tiếp từ thiết bị đầu vào.
Các phương thức của lớp AudioInputStream
Lớp AudioInputStream cung cấp các phương thức để tương tác với dữ liệu âm thanh. Dưới đây là danh sách tất cả các phương thức của lớp AudioInputStream trong Java:
↳ int read(byte[] b): Đọc một số byte từ luồng âm thanh và lưu vào mảng byte b.
↳ int read(byte[] b, int off, int len): Đọc tối đa len byte từ luồng âm thanh vào mảng byte b bắt đầu từ vị trí off.
↳ int read(): Đọc một byte từ luồng âm thanh.
↳ void close(): Đóng luồng âm thanh và giải phóng tài nguyên.
↳ void mark(int readlimit): Đánh dấu vị trí hiện tại trong luồng âm thanh.
↳ boolean markSupported(): Kiểm tra xem luồng hỗ trợ đánh dấu và quay lại vị trí trước đó hay không.
↳ void reset(): Quay lại vị trí đã được đánh dấu trước đó.
↳ long skip(long n): Bỏ qua n byte trong luồng âm thanh.
↳ int available(): Trả về số byte tối đa có thể đọc được mà không bị chặn.
↳ AudioFormat getFormat(): Trả về định dạng âm thanh của luồng.
↳ long getFrameLength(): Trả về độ dài của luồng tính bằng số frame mẫu.
Ví dụ
Dưới đây là một ví dụ đơn giản về cách sử dụng AudioInputStream để đọc dữ liệu âm thanh từ một file âm thanh:
Ví dụ: Example.java
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.UnsupportedAudioFileException;
public class Example {
public static void main(String[] args) {
// Đường dẫn đến tệp âm thanh WAV
File audioFile = new File("D:\\baitapjava\\sample-file-2.wav");
try {
// Tạo một AudioInputStream từ tệp âm thanh
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audioFile);
// Lấy thông tin về format của âm thanh từ AudioInputStream
var format = audioInputStream.getFormat();
System.out.println("Audio Format: " + format);
// Tạo một đối tượng Clip để phát âm thanh
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
// Phát âm thanh
clip.start();
// Đợi cho đến khi âm thanh phát xong
System.out.println("Đang phát âm thanh...");
Thread.sleep(clip.getMicrosecondLength() / 1000); // Đợi theo thời gian âm thanh
// Đóng các tài nguyên
clip.close();
audioInputStream.close();
} catch (UnsupportedAudioFileException e) {
System.err.println("Định dạng tệp âm thanh không được hỗ trợ: " + e.getMessage());
} catch (IOException e) {
System.err.println("I/O lỗi đã xảy ra: " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Kết quả của chương trình là:
Audio Format: PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
Đang phát âm thanh...
Bấm tổ hợp Ctrl+Z để dừng phát âm thanh
Lưu ý:
↳ Định dạng tệp: Ví dụ này giả định rằng bạn đang làm việc với tệp âm thanh WAV. Nếu bạn làm việc với các định dạng khác, bạn có thể cần sử dụng thư viện hoặc công cụ bổ sung.
↳ Kiểm tra định dạng: Kiểm tra định dạng tệp âm thanh và đảm bảo rằng AudioSystem hỗ trợ định dạng đó.
↳ Nếu bạn có tệp âm thanh và muốn thử nghiệm, hãy đảm bảo tệp âm thanh của bạn là WAV và có mặt tại đường dẫn được chỉ định.