• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Cấu trúc tập tin WAVE

Các bài viết hướng dẫn và tham khảo chung, không thuộc ngôn ngữ nào

Điều hành viên: vietluyen

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Cấu trúc tập tin WAVE

Gửi bàigửi bởi alexanderdna » T.Bảy 24/10/2009 11:18 am

Tên bài viết: Cấu trúc tập tin WAVE
Tác giả: Đặng Nhật Anh
Cấp độ bài viết: Trung bình
Tóm tắt: Phương pháp mã hóa âm thanh PCM và cấu trúc tập tin WAVE tiêu chuẩn



WAVE là định dạng âm thanh phổ biến trên Windows. Thấy diễn đàn chưa có nên tôi đã thử tìm hiểu và đăng lên đặng anh em nào cần thì đọc cho biết.

WAVE, có phần mở rộng là *.wav, nằm trong họ định dạng RIFF (Resource Interchange File Format) của Microsoft (bao gồm WAV, AVI, ANI và một số định dạng khác).

I. Mã hóa âm thanh
Dữ liệu âm thanh trong tập tin WAVE có thể chưa nén, hoặc đã được nén bằng các bộ mã hóa như MPEG, OGG, WMA, AC-3, v.v.
Dạng dữ liệu chưa nén thường là PCM (Pulse Code Modulation). Vì tập tin WAVE dùng mã PCM rất phổ biến nên trong bài này tôi sẽ chỉ bàn tới PCM mà thôi.

1. Trích mẫu
Ta đã biết, sóng âm là một loạt các dao động của vật chất trong môi trường truyền âm. Vào mỗi một thời điểm nhứt định, vật chất có một biên độ nhứt định. Tưởng tượng như trong dao động của con lắc đồng hồ. Mỗi lúc con lắc có một độ lệch nào đó so với vị trí cân bằng ở chánh giữa.

Khi muốn đưa âm thanh vào mã hóa trên máy tính, thì ta cần phải xác định biên độ dao động của sóng âm vào các thời điểm khác nhau. Việc đó gọi là trích/lấy mẫu. Trong một giây phát ra âm thanh, người ta trích lấy một số mẫu biên độ mà đưa vào dữ liệu. Con số ấy gọi là tần số trích mẫu (Sample rate). Thí dụ, ta mở phần thuộc tính của một tập tin âm thanh và thấy đề Sample rate = 44.1 kHz (44100 Hz) nghĩa là trong một giây trích mẫu 44100 lần. Một điều dễ nhận thấy là tần số trích mẫu càng cao thì âm thanh được mã hóa càng chính xác.

TrichMau.jpg
Trích mẫu

Hình trên đây minh họa việc trích mẫu. Đường màu xanh là đồ thị sóng âm. Mỗi khung (lát cắt) màu xám là một mẫu âm thanh. Các chấm đỏ là các giá trị (biên độ dao động) sẽ được trích lấy.

2. Chiều sâu bit
Một yếu tố khác cũng tác động tới độ chính xác của việc trích mẫu âm thanh. Đó là chiều sâu bit, trên bảng thuộc tính tập tin WAVE ghi là Audio sample size, thường là 8 hoặc 16 bits. Ta biết, 8 bits là 1 byte, lưu được 256 giá trị (từ 0 tới 255). Còn 16 bits là 2 bytes tức 1 word, lưu được 65536 giá trị (từ -32768 tới 32767). Số bit càng lớn thì âm thanh lấy mẫu càng chính xác. Giống như thang điểm 100 sẽ chấm đúng (chi tiết) hơn thang điểm 10 vậy.

3. Kênh âm thanh (Channels)
Âm thanh chia ra 2 kênh trái-phải (ở đây không bàn tới âm thanh 4.1, 5.1 hay 7.1 gì gì đó...) kêu bằng Stereo. Cũng có âm thanh chỉ một kênh (cùng một luồng dữ liệu đi ra hai loa) là Mono.

Đối với âm thanh hai kênh, các mẫu trích (sample) cũng phân ra hai kênh.

4. Kích thước mẫu trích
Công thức kích thước mẫu trích (tính bằng byte) là:
LengthOfSample = Channels * AudioSampleSize / 8

II. Cấu trúc tập tin
Thuộc họ RIFF, một tập tin WAVE được chia ra thành mấy phần gọi là chunk.
Phần dưới đây liệt kê các chunk và nội dung của chúng theo thứ tự: vị trí (từ byte ?? tới byte ??), kích thước (?? bytes) và mô tả.

1. RIFF chunk

Mã: Chọn hết

  1. 00 - 03 | 4 | Chuỗi "RIFF".
  2. 04 - 07 | 4 | Số byte theo sau con số này, tức là kích thước tập tin - 8.
  3. 08 - 11 | 4 | Chuỗi "WAVE".


2. FORMAT chunk

Mã: Chọn hết

  1. 12 - 15 | 4 | Chuỗi "fmt " (ký tự cuối là dấu khoảng trắng, mã ASCII 32).
  2. 16 - 19 | 4 | Kích thước FORMAT chunk, mặc nhiên là 16.
  3. 20 - 21 | 2 | Định dạng mã hóa âm thanh, thường là 1 (PCM).
  4. 22 - 23 | 2 | Số kênh, 1 (Mono) hay 2 (Stereo).
  5. 24 - 27 | 4 | Tần số trích mẫu, tính bằng Hz (mẫu/giây).
  6. 28 - 31 | 4 | Số byte dữ liệu mỗi giây. BytesPerSecond = SampleRate * Channels * AudioSampleSize / 8.
  7. 32 - 33 | 2 | Số byte trong một mẫu trích. BytesPerSample = Channels * AudioSampleSize / 8.
  8. 34 - 35 | 2 | Chiều sâu bit (AudioSampleSize), là 8 hoặc 16.


3. DATA chunk

Mã: Chọn hết

  1. 36 - 39 | 4 | Chuỗi "data".
  2. 40 - 43 | 4 | Kích thước dữ liệu âm thanh. DataSize = Samples * Channels * AudioSampleSize / 8.
  3.               Samples là tổng số mẫu trích (ThờiLượng_Giây * TầnSốTríchMẫu).
  4. 44 - cho tới hết || Dữ liệu âm thanh.


Nếu âm thanh là 2 kênh và 16 bits thì mỗi mẫu trích có kích thước 4 bytes: 2 bytes đầu cho kênh trái, 2 bytes sau cho kênh phải. Nếu 2 kênh và 8 bits thì mỗi kênh 1 byte, mẫu trích 2 bytes. Nếu 1 kênh và 16 bits thì mẫu trích cũng 2 bytes.

Nếu chiều sâu bit là 8 thì kiểu dữ liệu là BYTE không dấu (0 tới 255). Nếu là 16 thì kiểu dữ liệu là WORD (2bytes) có dấu (-32768 tới 32767).

4. Thứ tự byte
Dữ liệu trên tập tin WAVE tuân theo quy tắc Little-endian.

Thí dụ, ta có tần số trích mẫu bằng 44100 Hz. Giá trị 4 bytes, hệ thập lục phân của nó là 0x0000AC44 (mỗi cặp số là một byte). Trên tập tin, con số này sẽ được lưu theo thứ tự: 44 AC 00 00. Như vậy gọi là Little-endian.

(Kiểu sắp xếp bình thường gọi là Big-endian.)

III. Kết luận
Trên đây tôi đã trình bày sơ lược về cấu trúc tập tin WAVE, cũng như bàn một chút về phương pháp mã hóa PCM. Mong rằng bài viết này sẽ giúp ích cho mọi người.

THAM KHẢO
http://en.wikipedia.org/wiki/WAV
http://en.wikipedia.org/wiki/Resource_Interchange_File_Format
http://en.wikipedia.org/wiki/PCM

Tập tin mẫu
Tập tin sau đây là sóng âm hình sine tần số 1000 Hz phát trong 0.5 giây. Thông số mã hóa: 44.1 kHz, 16 bits, Stereo.
Bạn có thể mở nó bằng Visual Studio ở dạng Binary để xem nội dung bên trong.
sine.zip
(74.1 KiB) Đã tải 1432 lần
Sửa lần cuối bởi alexanderdna vào ngày T.Ba 27/10/2009 11:13 am với 1 lần sửa.



Hình đại diện của người dùng
andylam1992
Thành viên danh dự
Thành viên danh dự
Bài viết: 380
Ngày tham gia: T.Hai 06/04/2009 12:57 pm
Đến từ: TP.HCM Q5
Has thanked: 2 time
Been thanked: 4 time
Liên hệ:

Re: Cấu trúc tập tin WAVE

Gửi bàigửi bởi andylam1992 » T.Bảy 24/10/2009 3:21 pm

Lúc trước mình có viết 1 bài về nối file wav nhưng mà forum bị lỗi hay sao mà mất tiêu cái bài đó. Lên google search thì có!
Mình cũng đã phản ánh về vụ mất bài này nhưn g tới giờ vẫn chưa giải quyết được!

Nhưng bài viết của bạn cũng khá hay. Thanks

不相信未作牺牲竟先可拥有
只相信是靠双手找到我欲求
Cần - Kiệm- Liêm(liêm kiết) - Nghĩa - Chí - Tín

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Cấu trúc tập tin WAVE

Gửi bàigửi bởi vo_minhdat2007 » T.Bảy 24/10/2009 3:36 pm

Cái này cho xin qua box Tut nha bạn, box này là để thảo luận cái chưa thực hiện được về thuật toán thôi!

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: Cấu trúc tập tin WAVE

Gửi bàigửi bởi tungcan5diop » T.Bảy 24/10/2009 3:58 pm

andylam1992 đã viết:Lúc trước mình có viết 1 bài về nối file wav nhưng mà forum bị lỗi hay sao mà mất tiêu cái bài đó. Lên google search thì có!
Mình cũng đã phản ánh về vụ mất bài này nhưn g tới giờ vẫn chưa giải quyết được!

Nhưng bài viết của bạn cũng khá hay. Thanks

cái này anh Nobi đã có nói rồi mà bạn. Do database của Forum chúng ta hiện đã gần hết. Hiện tại vẫn chưa Download bài từ Forum về được. các bạn ráng chờ nhé
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: Cấu trúc tập tin WAVE

Gửi bàigửi bởi alexanderdna » CN 25/10/2009 7:43 pm

vo_minhdat2007 đã viết:Cái này cho xin qua box Tut nha bạn, box này là để thảo luận cái chưa thực hiện được về thuật toán thôi!

Ừ, chuyển đi Đạt. Tôi cũng có ý đó.


Quay về “Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách