Bảng 2 .1 Kết quả mã hóa các kí tự bằng mã Huffman
Bảng 3.3 Các loại dữ liệu trong Picture metadata
Picture Types Valu e Type Valu e Type
2 Icon tập tin 3 Bìa trước
4 bài sau 5 Giấy in rời
6 Nhản của CD 7 Diễn viên chính 8 Nghệ sĩ/ca sĩ 9 Nhạc trưởng
10 Nhóm 11 Nhà soạn nhạc
12 Lời nhạc 13 Nơi sản xuất 14 Sản xuất 15 Trình diễn
16 Điện ảnh 17
18 Minh họa 19
20 Nhà phát hành
Các audio data gồm có một hoặc nhiều frame. Mỗi frame gồm một frame header, chứa sync code, thông tin về frame như block size, tần số lấy mẫu, số kênh … và 8 bit CRC. Các frame header cũng chứa các tham số khác như số mẫu của mẫu đầu tiên trong frame (với block size thay đổi), và số frame (với block size cố định). Điều này giúp việc tìm kiếm một mẫu nhanh và chính xác hơn. Theo sau frame header là các subframe được mã hóa cho mỗi kênh và cuối frame là các số 0 được thêm vào cho đủ byte. Mỗi subframe có một header riêng của nó để xác định loại subframe.
Khi một bộ giải mã bắt đầu giải mã tới giữa stream, phải có một phương pháp để phát hiện bắt đầu một frame. Có 14 bit sync code bắt đầu mỗi frame. Sync code sẽ không xuất hiện bất kì chỗ nào khác ngoài frame header. Tuy nhiên vì nó có thể xuất hiện trong subframe, bộ giải mã có hai bước để xác định. Đầu tiên nó kiểm tra phần còn lại của frame header có chứa dữ liệu dư thừa không. Cuối cùng nó kiểm tra xem 8 bit CRC có giống với CRC được lưu ở cuối frame header không.
Khi một bộ giải mã bắt đầu giải mã một frame bất kì trong stream, mỗi frame phải có những thông tin cơ bản về frame vì bộ giải mã không thể truy xuất trực tiếp vào block STREAMINFO. Thông tin này bao gồm tần số lấy mẫu, số bit trên một mẫu, số kênh .. Vì frame header là overhead, nên nó ảnh hướng trực tiếp đến tỷ lệ nén. Để giữ frame header nhỏ, FLAC sử dụng một bảng tìm kiếm cho hầu hết các giá trị thường sử dụng cho các tham số frame.
Subframe riêng cho mỗi kênh được mã hóa riêng biệt trong một frame và xuất hiện tuần tự trong stream. Nói cách khác, dữ liệu âm thanh được mã hóa là không xen kẽ. Điều này làm giảm độ phức tạp khi giải mã khi yêu cầu buffer giải mã lớn hơn. Mỗi subframe có một header của chính nó để xác định loại subframe, phương pháp dự đoán, order – bậc dự đoán, các tham số residual … Theo sau header là các dữ liệu âm thanh đã được mã hóa cho mỗi kênh.
FLAC xác định một số giới hạn cho chính nó cũng như cho định dạng của nó. Mục đích của việc này để chắc rằng bất kì một stream nào được mã hóa phải theo các giới hạn đó. Để khi mà bộ giãi mã không thể tìm kiếm trong stream vẫn có thể lấy ở giữa stream và bắt đầu giải mã. Sau đây là một vài giới hạn được sử dụng trong stream:
Bit block size trong frame header phải từ 0001 đến 1110. Block size phải nhỏ hơn
hoặc bằng 16384. Nếu sample rate nhỏ hơn hoặc bằng 48Khz, block size phải nhỏ hơn hoặc bằng 4608.
Bit sample rate trong frame header phải từ 0001 đến 1110.
Bit số bit trên mẫu trong frame header phải từ 001 đến 111.
Nếu sample rate nhỏ hơn 48khz, order trong LPC subframe phải nhỏ hơn 12.
CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH NGHE NHẠC
4.1 Giải mã file FLAC
4.1.1 Đọc thông tin của file
Đầu tiên, chương trình sẽ đọc các thông tin cơ bản của file để phục vụ cho mục đích giải mã file FLAC. Thông tin cơ bản của file nằm trong metadata block STREAMINFO, block này nằm ngay sau 4 byte “FLAC”.
Các metadata block bao gồm header 32 bit (4 byte) và phần data.
Header của block gồm 1 bit là flag, để xác định block cuối cùng trong stream (flag =1), ngay sau block này sẽ là các frame audio. 7 bit tiếp theo là để xác định loại metadata. STREAMINFO thì 7 bit này sẽ là 000.0000. 24 bit còn lại để xác định độ dài của phần data đứng sau nó.
STREAMINFO có phần data là 272 bit (34 byte).
Chương trình sẽ đọc phần header để xác định loại metadata. Sau đó đọc phần data để lấy các thông tin gồm block size min/max(tính theo mẫu), frame size min/max (tính theo byte), tần số lấy mẫu, số kênh, số bit trên một mẫu, tổng số mẫu, MD5.
4.1.2 Đọc frame, giải mã file FLAC
Frame FLAC bao gồm header, subframe và footer.
Hình 4.1: Cấu trúc của frame
Trong đó:
Header gồm 14 bit sync code 11.1111.1111.1110 , các bit chứa các thông tin về file, và cuối cùng là 8 bit CRC.
Footer gồm 16 bit CRC.