1. Trang chủ
  2. » Luận Văn - Báo Cáo

đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD

90 436 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 90
Dung lượng 1,17 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Vì file FLAC có dung lượng khá lớn nên phải nghiên cứu giải thuật đồng bộgiữa các quá trình đọc file, giải mã, đẩy dữ liệu ra buffer driver và điều khiển driverphát nhạc để đảm bảo chất

Trang 1

ĐẠI HỌC QUỐC GIA TP HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC & KĨ THUẬT MÁY TÍNH

LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC

XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC

FLAC TRÊN T-ENGINE BOARD

HỘI ĐỒNG: KỸ THUẬT MÁY TÍNH GVHD:ThS PHAN ĐÌNH KHÔI GVPB: ThS BÙI VĂN HIẾU

SVTH 1: VÕ NGUYÊN TRUNG (5060 ) SVTH 2: LÊ THỊ THANH HÀ (50600572)

-o0o -TP.HỒ CHÍ MINH, THÁNG 1 NĂM 2011

i

Trang 2

LỜI CAM ĐOAN

o0o Chúng em xin cam đoan rằng, ngoại trừ các kết quả tham khảo từ các công trìnhkhác như đã ghi rõ trong luận văn, nội dung trình bày trong luận văn này là do chínhchúng em thực hiện và chưa có phần nào của luận văn này được nộp để lấy một bằngcấp ở trường Bách Khoa hoặc trường khác

-Tp Hồ Chí Minh, ngày 07 tháng 01 năm 2011

Nhóm sinh viên

Võ Nguyên Trung – Lê Thị Thanh Hà

ii

Trang 3

Ngoài ra, chúng em cũng gửi lời cảm ơn đến các nhóm bạn cũng trao đổi, chia

sẻ kiến thức giúp chúng em hoàn thành luận này một cách tốt đẹp nhất

Cuối cùng, chúng em xin cảm ơn Công ty Renesas đã hỗ trợ cho khoa KhoaHọc và Kỹ Thuật Máy Tính cũng như Câu lạc bộ Phần Cứng board và tài liệu T-Engine tạo điều kiện cho chúng em nghiên cứu và thực hiện đề tài

iii

Trang 4

TÓM TẮT LUẬN VĂN

o0o

-Nội dung của đề tài là tìm hiểu về định dạng file FLAC, thực hiện giải mã filenày và xuất ra cổng audio của T Engine board Sau đó, tìm hiểu và phát triển driver âmthanh trên T Engine board để điều khiển trình chơi nhạc

Vì file FLAC có dung lượng khá lớn nên phải nghiên cứu giải thuật đồng bộgiữa các quá trình đọc file, giải mã, đẩy dữ liệu ra buffer driver và điều khiển driverphát nhạc để đảm bảo chất lượng âm thanh là tốt nhất với những đáp ứng của phầncứng

Trên cơ sở đó, xây dựng giao diện chương trình chơi nhạc định dạng file FLAC

và các file khác như MP3, WAV trên T Engine board Giao diện này sẽ có đầy đủ cáctính năng của một trình nghe nhạc thông dụng

iv

Trang 5

MỤC LỤC

LỜI CAM ĐOAN ii

LỜI CẢM ƠN iii

TÓM TẮT LUẬN VĂN iv

MỤC LỤC v

MỤC LỤC HÌNH viii

MỤC LỤC BẢNG ix

CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1

1.1Giới thiệu 1

1.2Ứng dụng 2

1.3Các vấn đề của đề tài 2

1.4Hướng giải quyết 2

1.4.1Cấu trúc của file FLAC 2

1.4.2Giải mã file FLAC 3

1.4.3Driver âm thanh 3

1.4.4Xây dựng giao diện đồ hoạ 3

1.4.5Bổ sung các loại file khác 3

1.5Nội dung báo cáo 3

CHƯƠNG 2: KIẾN THỨC NỀN TẢNG 5

2.1 Dự đoán tuyến tính LPC(Linear predictive coding) 5

2.2 Mã Huffman 6

2.2.1Biểu diễn mã tiền tố trên cây nhị phân 7

2.2.2Xây dựng bộ mã tiền tố tối ưu 7

2.2.3 Hàng đợi ưu tiên: 8

2.2.4Xây dựng cây Huffman: 8

2.2.5Xây dựng bộ mã 8

2.2.6Nén file bằng mã Huffman 8

2.3Rice Coding 10

2.3.1Mã Golomb 10

2.3.2Mã Rice: 11

2.3.3Ứng dụng: 13

v

Trang 6

2.4Sơ lược về bộ tổng hợp âm thanh của T-Engine 13

2.4.1Sơ đồ khối 13

2.4.2Các chân kết nối (Connector pins) 14

2.4.3 Audio codec UDA1342TS 15

2.5Giao tiếp I2C Hitachi 17

2.5.1Module giao diện âm thanh nối tiếp 18

2.5.2Các chân output/input 19

2.6Driver âm thanh 20

2.6.1Sơ đồ hoạt động 20

2.6.2Cấu trúc dữ liệu 20

CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE LOSSLESS AUDIO CODEC) 27

3.1Một vài chuẩn lossless 27

3.1.1APE (Monkey’s Audio) 27

3.1.2WV(WavPack) : 27

3.1.3FLAC (Free Lossless Audio Codec) 27

3.2Giới thiệu về file FLAC - Free Lossless Audio Codec 28

3.2.1Metadata 28

3.2.2Audio data 29

3.2.3Frame 29

3.3Quá trình mã hóa file FLAC 29

3.3.1Định nghĩa 29

3.3.2Blocking 30

3.3.3INTER CHANNEL DECORRELATION 31

3.3.4 Prediction 32

3.3.5Residual Coding 33

3.4Cấu trúc file FLAC 34

CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH NGHE NHẠC 41

4.1Giải mã file FLAC 41

4.1.1 Đọc thông tin của file 41

4.1.2Đọc frame, giải mã file FLAC 41

4.1.3Residual coding 47

4.1.4Mã Rice 48

4.2Thiết kế chương trình nghe nhạc 50

vi

Trang 7

4.2.1Phân tích vấn đề 50

4.2.2Hoạt động của chương trình 51

4.2.3Hiện thực chương trình 54

CHƯƠNG 5:TỔNG KẾT 69

5.1Kết quả thực hiện 69

5.2Thuận lợi và khó khăn 69

5.2.1Thuận lợi: 69

5.2.2Khó khăn: 70

5.3Hướng phát triển 70

TÀI LIỆU THAM KHẢO 71

vii

Trang 8

MỤC LỤC HÌNH

LỜI CAM ĐOAN ii

LỜI CẢM ƠN iii

TÓM TẮT LUẬN VĂN iv

MỤC LỤC v

MỤC LỤC HÌNH viii

MỤC LỤC BẢNG ix

CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1

1.1Giới thiệu 1

1.2Ứng dụng 2

1.3Các vấn đề của đề tài 2

1.4Hướng giải quyết 2

1.4.1Cấu trúc của file FLAC 2

1.4.2Giải mã file FLAC 3

1.4.3Driver âm thanh 3

1.4.4Xây dựng giao diện đồ hoạ 3

1.4.5Bổ sung các loại file khác 3

1.5Nội dung báo cáo 3

CHƯƠNG 2: KIẾN THỨC NỀN TẢNG 5

2.1 Dự đoán tuyến tính LPC(Linear predictive coding) 5

2.2 Mã Huffman 6

2.2.1Biểu diễn mã tiền tố trên cây nhị phân 7

2.2.2Xây dựng bộ mã tiền tố tối ưu 7

2.2.3 Hàng đợi ưu tiên: 8

2.2.4Xây dựng cây Huffman: 8

2.2.5Xây dựng bộ mã 8

2.2.6Nén file bằng mã Huffman 8

Hình 2.1: sơ đồ mã hóa các kí tự bằng mã Huffman 9

2.3Rice Coding 10

2.3.1Mã Golomb 10

Hình 2.2 Mã Golomb 11

Trang 9

2.3.2Mã Rice: 11

2.3.3Ứng dụng: 13

2.4Sơ lược về bộ tổng hợp âm thanh của T-Engine 13

2.4.1Sơ đồ khối 13

Hình 2.3 Sơ đồ kết nối 13

Hình 2.4 Khối điều khiển tổng hợp âm thanh 14

2.4.2Các chân kết nối (Connector pins) 14

Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh 14

2.4.3 Audio codec UDA1342TS 15

Hình 2.6: Sơ đồ khối UDA1342TS 17

2.5Giao tiếp I2C Hitachi 17

Hình 2.7: Sơ đồ kết nối giao tiếp I2C 18

2.5.1Module giao diện âm thanh nối tiếp 18

Hình 2.8: Sơ đồ khối SSI 19

2.5.2Các chân output/input 19

2.6Driver âm thanh 20

2.6.1Sơ đồ hoạt động 20

Hình 2.9: Hoạt động của driver âm thanh 20

2.6.2Cấu trúc dữ liệu 20

DN_AUDIO_SETTINGFMTS: Thuộc tính này có thể đọc hoặc thiết lập định dạng audio hoạt đông cho driver với 2 hàm tk_rea_dev() và tk_swri_dev() 22

DN_AUDIO_PLAYAUDIO: Thuộc tính cho phép ghi dữ liệu lên vào buffer driver với hàm tk_swri_dev() 23

DN_AUDIO_MIXEROUTPUTVOL: Thuộc tính cho phép điều chỉnh và lấy dữ liệu của loa 23

CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE LOSSLESS AUDIO CODEC) 27

3.1Một vài chuẩn lossless 27

3.1.1APE (Monkey’s Audio) 27

3.1.2WV(WavPack) : 27

3.1.3FLAC (Free Lossless Audio Codec) 27

3.2Giới thiệu về file FLAC - Free Lossless Audio Codec 28

3.2.1Metadata 28

3.2.2Audio data 29

3.2.3Frame 29

Trang 10

3.3Quá trình mã hóa file FLAC 29

3.3.1Định nghĩa 29

3.3.2Blocking 30

3.3.3INTER CHANNEL DECORRELATION 31

3.3.4 Prediction 32

a.Verbatim 32

c.Fixed linear predictor 32

d.FIR linear prediction 33

3.3.5Residual Coding 33

3.4Cấu trúc file FLAC 34

Hình 3.1: Cấu trúc của file FLAC 35

Hình 3.2: Cấu trúc của Streaminfo metadata 36

Hình 3.3: Cấu trúc của Application metadata 36

Hình 3.4: Cấu trúc của Seektable metadata 37

Hình 3.5: Cấu trúc của Vorbis_comment metadata 37

Hình 3.6: Cấu trúc của Picture metadata 38

CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH NGHE NHẠC 41

4.1Giải mã file FLAC 41

4.1.1 Đọc thông tin của file 41

4.1.2Đọc frame, giải mã file FLAC 41

Hình 4.1: Cấu trúc của frame 42

Hình 4.2 : Cấu trúc của Verbatim subframe 44

Hình 4.1 : Cấu trúc của Fixed subframe 44

Hình 4.2: Cấu trúc của LPC subframe 46

4.1.3Residual coding 47

Hinh 4.5: Cấu trúc của Residual (phần dư) 47

4.1.4Mã Rice 48

Hình 4.63 Giải mã residual với tham số Rice là 16 49

Hình 4.4 Giải mã residual với tham số Rice là 4 49

Hình 4.5 Cách lưu dữ liệu với 2 kênh 50

4.2Thiết kế chương trình nghe nhạc 50

4.2.1Phân tích vấn đề 50

4.2.2Hoạt động của chương trình 51

Hình 4.6: Đường đi dữ liệu của chương trình 51

4.2.3Hiện thực chương trình 54

Trang 11

Hình 4.70: Hoạt động của main task 55

Hình 4.81: Cấu trúc tổng quát của chương trình 56

a.Usb_task 57

Hình 4.91: Hoạt động của usb_task 57

CHƯƠNG 5:TỔNG KẾT 69

5.1Kết quả thực hiện 69

5.2Thuận lợi và khó khăn 69

5.2.1Thuận lợi: 69

5.2.2Khó khăn: 70

5.3Hướng phát triển 70

TÀI LIỆU THAM KHẢO 71

Trang 12

MỤC LỤC BẢNG

LỜI CAM ĐOAN ii

LỜI CẢM ƠN iii

TÓM TẮT LUẬN VĂN iv

MỤC LỤC v

MỤC LỤC HÌNH viii

MỤC LỤC BẢNG ix

CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1

1.1Giới thiệu 1

1.2Ứng dụng 2

1.3Các vấn đề của đề tài 2

1.4Hướng giải quyết 2

1.4.1Cấu trúc của file FLAC 2

1.4.2Giải mã file FLAC 3

1.4.3Driver âm thanh 3

1.4.4Xây dựng giao diện đồ hoạ 3

1.4.5Bổ sung các loại file khác 3

1.5Nội dung báo cáo 3

CHƯƠNG 2: KIẾN THỨC NỀN TẢNG 5

2.1 Dự đoán tuyến tính LPC(Linear predictive coding) 5

2.2 Mã Huffman 6

2.2.1Biểu diễn mã tiền tố trên cây nhị phân 7

2.2.2Xây dựng bộ mã tiền tố tối ưu 7

2.2.3 Hàng đợi ưu tiên: 8

2.2.4Xây dựng cây Huffman: 8

2.2.5Xây dựng bộ mã 8

2.2.6Nén file bằng mã Huffman 8

Hình 2.1: sơ đồ mã hóa các kí tự bằng mã Huffman 9

Bảng 2.1 Kết quả mã hóa các kí tự bằng mã Huffman 9

2.3Rice Coding 10

Trang 13

2.3.1Mã Golomb 10

Hình 2.2 Mã Golomb 11

2.3.2Mã Rice: 11

Bảng 2.2 Bảng mã hóa của q 12

Bảng 2.3 Bảng mã hóa r 12

2.3.3Ứng dụng: 13

2.4Sơ lược về bộ tổng hợp âm thanh của T-Engine 13

2.4.1Sơ đồ khối 13

Hình 2.3 Sơ đồ kết nối 13

Hình 2.4 Khối điều khiển tổng hợp âm thanh 14

2.4.2Các chân kết nối (Connector pins) 14

Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh 14

Bảng 2.3 Chức năng các chân của jack CN9 15

Bảng 2.1 Chức năng các chân của jack CN10 15

2.4.3 Audio codec UDA1342TS 15

Hình 2.6: Sơ đồ khối UDA1342TS 17

2.5Giao tiếp I2C Hitachi 17

Hình 2.7: Sơ đồ kết nối giao tiếp I2C 18

Bảng 2.2 Mô tả chân I2C bus 18

2.5.1Module giao diện âm thanh nối tiếp 18

Hình 2.8: Sơ đồ khối SSI 19

2.5.2Các chân output/input 19

Bảng 2.3 Mô tả chân SSI bus 19

2.6Driver âm thanh 20

2.6.1Sơ đồ hoạt động 20

Hình 2.9: Hoạt động của driver âm thanh 20

2.6.2Cấu trúc dữ liệu 20

DN_AUDIO_SETTINGFMTS: Thuộc tính này có thể đọc hoặc thiết lập định dạng audio hoạt đông cho driver với 2 hàm tk_rea_dev() và tk_swri_dev() 22

DN_AUDIO_PLAYAUDIO: Thuộc tính cho phép ghi dữ liệu lên vào buffer driver với hàm tk_swri_dev() 23

DN_AUDIO_MIXEROUTPUTVOL: Thuộc tính cho phép điều chỉnh và lấy dữ liệu của loa 23

CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE LOSSLESS AUDIO CODEC) 27

Trang 14

3.1Một vài chuẩn lossless 27

3.1.1APE (Monkey’s Audio) 27

3.1.2WV(WavPack) : 27

3.1.3FLAC (Free Lossless Audio Codec) 27

3.2Giới thiệu về file FLAC - Free Lossless Audio Codec 28

3.2.1Metadata 28

3.2.2Audio data 29

3.2.3Frame 29

3.3Quá trình mã hóa file FLAC 29

3.3.1Định nghĩa 29

3.3.2Blocking 30

3.3.3INTER CHANNEL DECORRELATION 31

3.3.4 Prediction 32

a.Verbatim 32

c.Fixed linear predictor 32

d.FIR linear prediction 33

3.3.5Residual Coding 33

3.4Cấu trúc file FLAC 34

Hình 3.1: Cấu trúc của file FLAC 35

Bảng 3.1: Các loại metadata block 35

Hình 3.2: Cấu trúc của Streaminfo metadata 36

Hình 3.3: Cấu trúc của Application metadata 36

Hình 3.4: Cấu trúc của Seektable metadata 37

Hình 3.5: Cấu trúc của Vorbis_comment metadata 37

Bảng 3.2: Bảng thông tin chứa trong Vorbis_comment metadata 37

Hình 3.6: Cấu trúc của Picture metadata 38

Bảng 3.3: Các loại dữ liệu trong Picture metadata 38

CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH NGHE NHẠC 41

4.1Giải mã file FLAC 41

4.1.1 Đọc thông tin của file 41

4.1.2Đọc frame, giải mã file FLAC 41

Hình 4.1: Cấu trúc của frame 42

Bảng 4.1: Thông tin chi tiết của file từ frame header 42

Bảng 4.2: số bit trên một mẫu tương ứng trong trường “bit persample” 43

Bảng 4.3: Các loại subframe 43

Trang 15

Hình 4.2 : Cấu trúc của Verbatim subframe 44

Hình 4.1 : Cấu trúc của Fixed subframe 44

Bảng 4.4 Công thức tính giá trị mẫu trong Fixed subframe 45

Bảng 4.5 Ví dụ đơn giản về cách tính mẫu 45

Hình 4.2: Cấu trúc của LPC subframe 46

Bảng 4.6 Ví dụ tính giá trị mẫu trong LPC subframe 46

4.1.3Residual coding 47

Hinh 4.5: Cấu trúc của Residual (phần dư) 47

4.1.4Mã Rice 48

Hình 4.63 Giải mã residual với tham số Rice là 16 49

Hình 4.4 Giải mã residual với tham số Rice là 4 49

Hình 4.5 Cách lưu dữ liệu với 2 kênh 50

Bảng 4.7 Tái tạo kênh 50

4.2Thiết kế chương trình nghe nhạc 50

4.2.1Phân tích vấn đề 50

4.2.2Hoạt động của chương trình 51

Hình 4.6: Đường đi dữ liệu của chương trình 51

4.2.3Hiện thực chương trình 54

Hình 4.70: Hoạt động của main task 55

Hình 4.81: Cấu trúc tổng quát của chương trình 56

a.Usb_task 57

Hình 4.91: Hoạt động của usb_task 57

CHƯƠNG 5:TỔNG KẾT 69

5.1Kết quả thực hiện 69

5.2Thuận lợi và khó khăn 69

5.2.1Thuận lợi: 69

5.2.2Khó khăn: 70

5.3Hướng phát triển 70

TÀI LIỆU THAM KHẢO 71

Trang 16

CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI

1.1 Giới thiệu

Hiện nay, sự phát triển của công nghệ và mạng internet, nhu cầu chia sẻ thông tin

và dữ liệu ngày càng cao Âm nhạc và phim ảnh là một trong số những dữ liệu được quantâm chia sẻ nhiều nhất Đường truyền internet hiện nay mặc dù đã được cải thiện và pháttriển rất nhiều so với trước nhưng vẫn không thể đáp ứng được với khối lượng đồ sộ của

dữ liệu gốc Vấn đề đặt ra với các nhà nghiên cứu công nghệ là tạo được những dữ liệutương đương nhưng với một dung lượng vừa đủ để có thể chia sẻ qua mạng Nén dữ liệu

là giải pháp được sử dụng phổ biến Với nhiều thuật toán nén khác nhau, ta có thể tạo rađược nhiều loại nhạc nén với chất lượng và dung lượng đa dạng, tùy vào mục đích sửdụng

Trong một số trường hợp, với một số dạng âm thanh, sẽ rất khó để có thể phân biệtđược chất lượng giữa âm thanh gốc và các định dạng nén mất dữ liệu như MP3 Mặc dùthuật toán nén của MP3 đang dần được cải thiện, nhưng những gì mất đi khó mà lấy lạiđược, âm thanh lại càng khó Với một số loại nhạc sử dụng nhiều loại nhạc cụ hay nhạc

cổ điển thì tần số âm thanh có thể rất cao hoặc rất trầm, cắt xén quá nhiều dẫn đến suygiảm nghiêm trọng chất lượng của nó

Theo sự phát triển của công nghệ, nhu cầu con người cũng dần được nâng cao.Ngày xưa người ta dễ dàng chấp nhận một file nén định dạng mp3 có dung lượng gầnbằng 1/11 file âm thanh gốc, với một lượng lớn mẫu bị cắt xén Nhưng ngày nay với mộtdàn loa được đầu tư tốt, thì yêu cầu về chất lượng âm nhạc cũng được nâng lên Bài toánđặt ra là làm sao để có thể giữ được chất lượng của âm thanh gốc mà dung lượng của dữliệu vẫn có thể được giảm xuống Thế hệ của nhạc nén không mất dữ liệu ra đời nhằmthỏa mãn yêu cầu trên

Theo xu hướng trên, tương lai không xa, những yêu cầu về chất lượng âm thanhgốc trên các thiết bị di động, cầm tay sẽ là một trong những nhu cầu bức thiết, khi màphần cứng của chúng được cải thiện để đáp ứng yêu cầu của những người yêu nhạc khótính

Trang 17

Do đó, nhóm em quyết định chọn đề tài xây dựng chương trình nghe nhạc địnhdạng file FLAC (Free Lossless Audio Codec) là một định dạng file nén không mất dữ liệu(lossless) trên T Engine board, nhằm giải quyết một phần nhỏ của vấn đề trên.

1.2 Ứng dụng

Chương trình sẽ đóng góp một phần vào các ứng dụng nghe nhạc hiện nay trên cácthiết bị di động như mp3, điện thoại di động, mp4 hay các thiết bị gia dụng nhằm làmphong phú thêm các loại định dạng có thể chơi được trên các thiết bị ấy, giải quyết đượcphần nào các yêu cầu nghe nhạc chất lượng cao của những người yêu nhạc khó tính

1.3 Các vấn đề của đề tài

Yêu cầu của đề tài là xây dựng được chương trình chơi file FLAC trên board Engine Vì thế vấn đề đầu tiên cần giải quyết chính là phải tìm hiểu về định dạng fileFLAC, sau đó tìm hiểu các giải thuật dùng để mã hóa file FLAC và hiện thực giải mãfile FLAC trên nền linux

T-Vấn đề tiếp theo là tìm hiểu driver âm thanh của board T Engine, xuất được fileFLAC ra cổng audio sao cho chất lượng âm thanh được đảm bảo là tốt nhất với những gìphần cứng hỗ trợ

Vấn đề cuối cùng là xây dựng giao diện đồ họa cho chương trình, giao diện đồ họaphải gồm các chức năng cơ bản của một trình nghe nhạc thông thường Ngoài file FLAC,chương trình còn hỗ trợ chơi một số file khác như MP3, WAV Chương trình có thể tìm

và chơi tất cả các file nhạc nằm trong PC card hay USB

1.4 Hướng giải quyết

1.4.1 Cấu trúc của file FLAC

Trước khi nghiên cứu về giải thuật giải mã file FLAC, cần phải nắm rõ cấu trúccủa file, để có thể dễ dàng định hướng được các bước giãi mã sau này Cấu trúc fileFLAC đã được giới thiệu khá chi tiết trong một số tài liệu trên mạng

Trang 18

1.4.2 Giải mã file FLAC

Tìm hiểu về một số giải thuật nén không mất dữ liệu như dự đoán tuyến tính

Huffman trước khi tìm hiểu và giải mã file FLAC

1.4.3 Driver âm thanh

Driver âm thanh trên T Engine đã được các nhóm trước đây nghiên cứu và xâydựng Vấn đề của nhóm chỉ là tìm hiểu quá trình hoạt động của driver, cách truyền dữ liệu

và cách sử dụng Tuy nhiên vì dung lượng của file FLAC là khá lớn nên vấn đề đặt ra làphải cải thiện driver để nâng cao tốc độ đọc và đồng bộ giữa quá trình đọc dữ liệu, quátrình giải mã và quá trình ghi vào driver sao cho hợp lí để chất lượng âm thanh đầu ra làtốt nhất

1.4.4 Xây dựng giao diện đồ hoạ

Phần giao diện của chương trình nghe nhạc sẽ gồm 2 phần chính là playlist để hiểnthị các file nhạc được tìm thấy trong USB hay trong PC Card và giao diện chương trìnhchơi gồm các nút điều khiển để điều khiển các trạng thái

Vì màn hình của T Engine board không lớn nên giao diện sẽ được cắt ra thành 2hình tương ứng với 2 phần trên

1.4.5 Bổ sung các loại file khác

Tìm hiểu thêm về thư viện của file MP3, tìm hiểu về đề tài chơi nhạc MP3 trên TEngine của các nhóm trước để bổ sung vào, làm cho chương trình phong phú hơn

Tìm hiểu về file WAV là một file âm thanh gốc, không nén và chơi file này bằngchương trình trên

1.5 Nội dung báo cáo

Báo cáo gồm 5 phần:

FLAC và driver âm thanh trên T Engine board

Trang 19

 Chương 4: xây dựng chương trình chơi nhạc file FLAC trên T Engine board.

Trang 20

CHƯƠNG 2: KIẾN THỨC NỀN TẢNG

2.1 Dự đoán tuyến tính LPC(Linear predictive coding)

Dự đoán tuyến tính là một bước không thể thiếu của hầu hết các giải thuật mã hóa

âm thanh không mất dữ liệu hiện đại ngày nay

Đây là phép toán xác định giá trị tương lai của một tín hiệu rời rạc theo thời gianbằng hàm tuyến tính của các tín hiệu trước đó

Trong xử lí tín hiệu số, dự đoán tuyến tính thường được gọi là mã hóa dự đoántuyến tính (LPC) và có thể xem là một phần của lí thuyết lọc

Trong phân tích hệ thống, dự đoán tuyến tính có thể được xem là một phần của môhình toán học hay tối ưu hóa

i=1 ai*x(n-1)

là hệ số dự đoán N là chỉ số về thời gian của tín hiệu, p là bậc của dự đoán tuyến tính hay

là bậc của LPC

Các lỗi hay còn gọi là sự sai biệt (residual) tạo ra bởi phương pháp này là

e(n)=x(n)-x'(n)

Với x(n) là tín hiệu gốc, x'(n) là tín hiệu dự đoán

Theo nguyên tắc, khi đã có thông tin về quá khứ thì việc dự đoán cho tương lai là

có cơ sở và dễ dàng hơn rất nhiều, do đó độ chính xác của dự đoán cũng cao Vì vậy, sựsai biệt hay còn gọi là lỗi (residual) e(n) được tạo ra bởi phương pháp này là khá nhỏ Sốbit cần dùng để lưu trữ residual vì vậy cũng nhỏ

Lúc đó, việc truyền dữ liệu cũng như lưu trữ dữ liệu gốc có thể là không cần thiếtnếu như có thể dự đoán được dữ liệu ấy Khi ấy, chỉ cần truyền hay lưu trữ sự sai biệt(residual), sau đó kết hợp giữa sự sai biệt (residual) với tín hiệu dự đoán để khôi phục lại

Trang 21

tín hiệu gốc ban đầu Như vậy, sẽ giảm được một lượng lớn số bit cần dùng để lưu tínhiệu gốc mà vẫn đảm bảo được độ chính xác của tín hiệu gốc.

Phương trình trên có giá trị đối với tất cả các dự đoán tuyến tính Sự khác biệt

thống kê trung bình trên một tập các giọng nói được lựa chọn ngẫu nhiên

tuyến tính, hệ số này được ước lượng càng tốt thì độ chính xác trong dự đoán tuyến tính

Trong đó, bình phương trung bình lỗi dự đoán được tính bằng công thức:

Mã nhị phân tiền tố (prefix-free binary code) là bộ các từ mã của một tập hợp các

kí hiệu sao cho từ mã của mỗi ký hiệu không là tiền tố (phần đầu) của từ mã một ký hiệukhác trong bộ mã ấy

Ví dụ: Giả sử mã hóa từ "ARRAY", tập các ký hiệu cần mã hóa gồm 3 chữ cái

"A","R","Y"

một chữ cái chẳng hạn "A"=00, "R"=01, "Y"=10 Khi đó mã hóa của cả từ là

0001010010 Để giải mã ta đọc hai bit một và đối chiếu với bảng mã

vì từ mã của "A" là tiền tố của từ mã của "R" Để mã hóa cả từ ARRAY phải đặt

Trang 22

dấu ngăn cách vào giữa các từ mã 0,01,01,0,11 Nếu mã hóa "A"=0, "R"=10,

"Y"=11 thì bộ mã này là mã tiền tố Với bộ mã tiền tố này khi mã hóa chuỗi

"ARRAY" ta có 01010011

2.2.1 Biểu diễn mã tiền tố trên cây nhị phân

Nếu có một cây nhị phân n lá ta có thể tạo một bộ mã tiền tố cho n ký hiệu bằng

cách đặt mỗi ký hiệu vào một lá Từ mã của mỗi kí hiệu được tạo ra khi đi từ gốc tới láchứa ký hiệu đó, nếu đi qua cạnh trái thì ta thêm số 0, đi qua cạnh phải thì thêm số 1 Câynhị phân mà bỏ qua các kí hiệu không sử dụng thì tạo thành cây có kích thước mã hóa lànhỏ nhất, gọi là cây Huffman

2.2.2 Xây dựng bộ mã tiền tố tối ưu

Cho tập A các ký hiệu và trọng số (tần suất) của chúng, Tìm một bộ mã tiền tố vớitổng độ dài mã hóa là nhỏ nhất

thấp nhất sẽ có độ ưu tiên cao nhất

đợi

Trang 23

 Tạo một node mới từ 2 node trên với trọng số bằng tổng trọng số của 2node đó.

2.2.3 Hàng đợi ưu tiên:

Trong mỗi bước của thuật toán xây dựng cây Huffman, ta luôn phải chọn ra haigốc có trọng số nhỏ nhất Để làm việc này ta sắp xếp các gốc vào một hàng đợi ưu tiêntheo tiêu chuẩn trọng số nhỏ nhất Một trong các cấu trúc dữ liệu thuận lợi cho tiêu chuẩnnày là cấu trúc Heap (với phần tử có trọng số nhỏ nhất nằm trên đỉnh của Heap)

2.2.4 Xây dựng cây Huffman:

Ta sẽ lưu trữ cấu trúc của cây mã Huffman vào một mảng Cây Huffman gồm n lá

mỗi lá chứa chỉ số của kí hiệu tương ứng Mỗi lần ghép 2 cây thành một ta phải thêm một

đỉnh, như vậy cây biểu diễn mã Huffman gồm 2.n-1 đỉnh Ta kí hiệu cây này là

Huff[1 2n-1] Vì mỗi gốc mới bổ sung đều có trọng số nên ta mở rộng mảng W[1 n] các

trọng số thành mảng W' [1 2n+1] Gọi m là số đỉnh của cây sẽ xây dựng, lúc đầu ta có n

lá, đỉnh bổ sung lần đầu sẽ là n+1, lần thứ 2 là n+2, Khi lấy ra hai kí hiệu có tần số nhỏnhất chẳng hạn kí hiệu thứ i làm con trái và kí hiệu thứ j làm con phải của đỉnh mới bổ

sung có chỉ số m ta đặt Huff[i]=-m, Huff[j]=m.

2.2.5 Xây dựng bộ mã

Sau khi cấu trúc của cây Huffman được lưu vào mảng Huff ta dễ dàng xây dựngmảng Code[1 n] cho bộ mã nhị phân tiền tố tối ưu của các kí tự A[1 n]

2.2.6 Nén file bằng mã Huffman

Trang 24

5. Nếu đã hết file cần nén thì dừng

Ví dụ xây dựng bộ mã hóa cho các kí tự sau:

Hình 2.1: sơ đồ mã hóa các kí tự bằng mã Huffman

Kết quả:

Bảng 2.1 Kết quả mã hóa các kí tự bằng mã Huffman

Trang 25

số cao hơn các giá trị lớn.

Là một mã có độ dài không cố định, gần giống mã Huffman nhưng nó không dựatrên dữ liệu mà dựa trên mô hình đơn giản của tần suất xuất hiện của các giá trị

Mối quan hệ giữa kích thước và tần suất xuất hiện nằm trong một tham số gọi là sốchia M

Mã Golomb sử dụng tham số M để chia input N làm 2 phần : q là kết quả của phépchia (thương) và r là số dư của phép chia

q = N/M

r = N-q*M

Thương được ghi trong kí hiệu đơn nguyên (unary notation) và số dư ghi trong kíhiệu nhị phân (binary notation) Khi M=1, mã Golomb được xem là tương đương với mãunary (mã đơn nguyên)

Mã Golomb được xem như một mã xác định một số N bằng cách chỉ ra vị trí(position) q và offset r sử dụng tham số M làm số chia

Trang 26

Hình 2.2 Mã Golomb

2.3.2 Mã Rice:

Là một trường hợp đặc biệt của mã Golomb, để tạo ra một mã tiền tố đơn giản (cóthể không phải là mã tiền tố tối ưu) Trong khi mã Golomb có tham số M là một số dươngbất kì thì mã Rice lại đòi hỏi tham số M phải là một lũy thừa của 2 Vì vậy, Mã Ricethuận lợi khi sử dụng trên máy tính vì nhân và chia 2 được hiện thực dễ dàng trong số họcnhị phân

Rice coding được sử dụng như là một giai đoạn trong quá trình nén không mất dữliệu trong nén hình ảnh và âm thanh

Giải thuật :

1. Khai báo M là một giá trị kiểu int và cố định.

2. Với N là số cần mã hóa, tìm thương và số dư.

i Viết một chuỗi gồm q bit 1

ii Viết 1 bit 0 sau chuỗi trên

c Tìm mã của r

i Nếu M là lũy thừa của 2, mã của r chính là số nhị phân của chính nó, số bit cần để lưu mã r là log2(M) (Đây là mã Rice).

ii Ngược lại, nếu M không phải lũy thừa của 2 ,b= [log2(M)]

1 Nếu r < 2b − M , mã r cần b-1 bit để lưu

2 Nếu r > 2b − M, mã r cần b bit để lưu

Trang 28

có xu hướng xuất hiện nhiều hơn so với các lỗi lớn, thích hợp cho việc mã hóa Rice.

Trong các codec âm thanh nén không mất dữ liệu như FLAC, shorten, apple, Ricecoding được sử dụng như một bước của quá trình dự đoán tuyến tính

Rice coding cũng được sử dụng trong nén hình ảnh không mất dữ liệu

2.4 Sơ lược về bộ tổng hợp âm thanh của T-Engine

2.4.1 Sơ đồ khối

Hình 2.3 Sơ đồ kết nối

Bộ tổng hợp âm thanh của T-Engine bao gồm một giao diện âm thanh nối tiếp(SSI) của SH7760 và một bộ codec âm thanh (UDA1342TS của Philips) để âm thanh có

Trang 29

thề được xuất ra headphone kết nối với một output mini-jack (CN9) hoặc đưa vàoearnphone được kết nối với mini-jack (CN10).

Hình 2.4 Khối điều khiển tổng hợp âm thanh

2.4.2 Các chân kết nối (Connector pins)

Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh

Trang 30

Bảng 2.3 Chức năng các chân của jack CN9

Mô tả tổng quát

UDA1342TS là 1 single-chip, có ADC (Analog-to-Digital Converter) 4 kênh vàDAC (Digital-to-Analog Converter) 2 kênh với đặc trưng là sử dụng kĩ thuật đảo chuỗi bit

Trang 31

(bitstream conversion technique) Tiêu thụ điện ít và mức điện áp yêu cầu thấp nên rất Engine/SH7760 phù hợp với những thiết bị âm thanh số, khả chuyển, ít dùng điện, điện

T-áp thấp, có hỗ trợ chức năng thu và phát lại

UDA1342TS hỗ trợ các định dạng dữ liệu: I2C-bus, MSB-justified với độ dài từtới 24 bits và dạng dữ liệu tuần tự LSB-justified với độ dài từ 16, 20 và 24 bits

Nó cũng hỗ trợ phối hợp định dạng MSB-justified ở đầu ra và định dạng LSB-justified ởđầu vào

UDA1342TS cũng có thể xử lý âm thanh trong chế độ phát lại (đã được điềukhiển bởi microcontroller) như de-emphasis, volume, mute, tăng bass và treble bằng giaodiện L3-bus hoặc I2C -bus

Sơ đồ khối

Trang 32

Hình 2.6: Sơ đồ khối UDA1342TS

2.5 Giao tiếp I2C Hitachi

Các đặc điểm:

 Hổ trợ giao tiếp với bus I2C của Philips

 7 bit địa chỉ slave

 Chế độ nhanh tương thích

 Có thể tương thích với nhiều loại tần số clock hệ thống

 Hổ trợ chế độ buffer FIFO 16 phần

Trang 33

Sơ đồ khối:

Hình 2.7: Sơ đồ kết nối giao tiếp I2C

Các chân output/input:

Bảng 2.2 Mô tả chân I2C bus

0 I2C0_SCL Input/Output Chân xuất/nhập clock

I2C0_SDA Input/Output Chân xuất/nhận dữ liệu

2.5.1 Module giao diện âm thanh nối tiếp

Module giao diện âm thanh nối tiếp là một module được thiết kế để nhận hoặc đểgửi dữ liệu âm thanh, tương tác với các thiết bị khác nhau mà hổ trợ định dạng thích hợptheo Philips Nó cũng hổ trợ thêm các chế độ cho những định dạng phổ biến như là burst

và chế độ đa kênh (mutil – channel)

Các đặc tính:

SSI có các đặc tính sau:

 Số lượng kênh: hai kênh (số lượng tối đa)

Trang 34

 Các chế độ hoạt động: chế độ nén (compressed mode) và chế độ không nén (non –compressed mode) Chế độ nén được sử dụng cho cho việc truyền các chuổi bitliên tục Chế độ không nén hổ trợ cho tất cả các chuổi âm thanh nối tiếp được phânchia cho các kênh.

 Module SSI được cấu hình như bất kỳ một bộ truyền hay bộ nhận nào Định dạngbus nối tiếp có thể được sử dụng trong chế độ nén và chế độ không nén

 Truyền bất đồng bộ giữa buffer và các thanh ghi dịch (shift register)

 Sự phân chia tỷ lệ của bus nối tiếp kết nối với đồng hồ (clock) có thể lựa chọnđược

 Dữ liệu truyền/nhận có thể được điều khiển bởi DMAC hoặc các ngắt (interrupt)

Sơ đồ khối :

Hình 2.8: Sơ đồ khối SSI

2.5.2 Các chân output/input

Bảng 2.3 Mô tả chân SSI bus

Trang 35

1

2.6 Driver âm thanh

2.6.1 Sơ đồ hoạt động

Hình 2.9: Hoạt động của driver âm thanh

2.6.2 Cấu trúc dữ liệu

Dữ liệu thuộc tính:

Trang 36

DN_AUDIO_PLAYSTATE= -102,DN_AUDIO_GETPLAYINGPOS= -103,DN_AUDIO_PLYBUFSZ= -104,

DN_AUDIO_PLAYAUDIO = -105,DN_AUDIO_MIXEROUTPUTVOL= -106,DN_AUDIO_REC_BUFSZ = -107,

DN_AUDIO_REC_CTRL = -108,DN_AUDIO_REC_AMPL = -109, DN_AUDIO_REC_GET_BUF= -110,DN_AUDIO_DRV_MBF= -111,} AudioDataNo;

Ta xem xét các thuộc tính sau:

Trang 37

DN_AUDIO_SETTINGFMTS: Thuộc tính này có thể đọc hoặc thiết lập định dạng audio hoạt đông cho driver với 2 hàm tk_rea_dev() và

tk_swri_dev().

Kiểu struct : AudioFMTS

Cấu trúc AudioFMTS được định nghĩa như sau:

Định nghĩa tín hiệu truyền cho driver

#define AUDIO_STOP 0 /* stop */

#define AUDIO_PAUSE 1 /* pause */

#define AUDIO_RUN 2 /* run */

 DN_AUDIO_PLYBUFSZ: Thuộc tính cho phép đọc và thiết lập kíchthước của buffer driver với 2 hàm tk_rea_dev() và tk_swri_dev()

Trang 38

 DN_AUDIO_PLAYAUDIO: Thuộc tính cho phép ghi dữ liệu lên vào buffer driver

với hàm tk_swri_dev().

 DN_AUDIO_MIXEROUTPUTVOL: Thuộc tính cho phép điều chỉnh và lấy dữ

liệu của loa.

Struct: MixerLineVolume

Cấu trúc AudioFMTS được định nghĩa như sau:

typedef struct {

UB lineId;// line ID

UB time; // thời gian thai đổi giá trị volume [ms]

} MixerLineVolume;

lineId:

 DN_AUDIO_DRV_MBF: Thuộc tính cho phép tạo, xóa message buffercủa driver với hàm tk_rea_dev() và tk_swri_dev() Message buffer này có nhiệm vụ thôngbáo trạng thái của buffer driver tới các task nhận

Dữ liệu:

#define MSG_DRV_ENABLE_HALF -1

// Cho phép chép vào 1 nữa buffer driver

#define MSG_DRV_END_BUFFER -2

Trang 39

// Thông báo rằng driver đã chơi hết dữ liệu trong buffer

#define MSG_DRV_STOP_BUFFER -3

// Thống báo người dùng đã stop

Trang 40

CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE

LOSSLESS AUDIO CODEC)

Gần đây, với sự phát triển mạnh mẽ của nhạc số, bên cạnh các chuẩn nén mất dữliệu (lossly) phổ biến như MP3, WMA, … thì các chuẩn nén không mất dữ liệu (lossless)như FLAC, APE , WV… ngày càng được ưa chuộng hơn vì chất lượng âm thanh đượcđảm bảo so với âm thanh gốc mà dung lượng lại được giảm đáng kể, chỉ khoảng 30%đền 40% dung lượng của âm thanh gốc

Một vài chuẩn lossless thường gặp.

3.1.1 APE (Monkey’s Audio)

Đuôi mở rộng là ape

Là một trong những chuẩn nén không mất dữ liệu, có kích thước dung lượngkhoảng 3-5 lần so với một file MP3 bitrate 192kbps, vì là lossless nên chất lượng tươngđương với âm thanh gốc

Mặc dù được phân phối như một phần mềm miễn phí nhưng APE lại không được

sử dụng rộng rãi do trong source code của nó có thêm các license để ngăn chặn hầu hếtcác phiên bản của LINUX và các phần mềm miễn phí khác

3.1.2 WV(WavPack) :

Đuôi mở rộng là wv

Là một chuẩn nén lai, kết hợp giữa lossy và lossless Chuẩn này tạo ra 2 file, mộtfile tương đối nhỏ, chất lượng cao và mất dữ liệu File còn lại là file hiệu chỉnh, được sửdụng kết hợp với file kia, nhằm cung cấp đầy đủ thông tin để khôi phục dữ liệu ban đầu

Tuỳ thuộc vào file âm thanh gốc mà tỉ lệ nén có thể dao động từ 30% - 70%

3.1.3 FLAC (Free Lossless Audio Codec)

Đuôi mở rộng là flac

Ngày đăng: 30/04/2015, 09:52

HÌNH ẢNH LIÊN QUAN

Hình 2.1: sơ đồ mã hóa các kí tự bằng mã Huffman - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 2.1 sơ đồ mã hóa các kí tự bằng mã Huffman (Trang 24)
Hình 2.4 Khối điều khiển tổng hợp âm thanh - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 2.4 Khối điều khiển tổng hợp âm thanh (Trang 29)
Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh (Trang 29)
Bảng 2.3 Chức năng các chân của jack CN9 - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Bảng 2.3 Chức năng các chân của jack CN9 (Trang 30)
Hình 2.6: Sơ đồ khối UDA1342TS - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 2.6 Sơ đồ khối UDA1342TS (Trang 32)
Sơ đồ khối: - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Sơ đồ kh ối: (Trang 33)
Hình 2.8: Sơ đồ khối SSI - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 2.8 Sơ đồ khối SSI (Trang 34)
Hình 2.9: Hoạt động của driver âm thanh - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 2.9 Hoạt động của driver âm thanh (Trang 35)
Bảng 3.1: Các loại metadata block - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Bảng 3.1 Các loại metadata block (Trang 48)
Hình 3.1: Cấu trúc của file FLAC - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 3.1 Cấu trúc của file FLAC (Trang 48)
Hình 3.3: Cấu trúc của Application metadata - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 3.3 Cấu trúc của Application metadata (Trang 49)
Hình 3.4: Cấu trúc của Seektable metadata - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 3.4 Cấu trúc của Seektable metadata (Trang 50)
Bảng 3.2: Bảng thông tin chứa trong Vorbis_comment metadata - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Bảng 3.2 Bảng thông tin chứa trong Vorbis_comment metadata (Trang 50)
Bảng 3.3: Các loại dữ liệu trong Picture metadata Picture Types - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Bảng 3.3 Các loại dữ liệu trong Picture metadata Picture Types (Trang 51)
Hình 3.6: Cấu trúc của Picture metadata - đồ án công nghệ thông tin XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC FLAC TRÊN T-ENGINE BOARD
Hình 3.6 Cấu trúc của Picture metadata (Trang 51)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w