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

Xây dựng ứng dụng truyền thông âm thanh

68 216 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 68
Dung lượng 729,89 KB

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

Nội dung

Hình I.3 : Mô hình Điện thoại – Điện thoại I.2 YÊU CẦU ỨNG DỤNG TRUYỀN ÂM THANH TRÊN MẠNG LAN Trong phần này sẽ phân tích các yêu cầu xây dựng ứng dụng truyền âm thanh trên mạng LAN : Từ

Trang 1

LỜI NÓI ĐẦU

Trong những năm gần đây, mạng máy tính ngày càng trở nên phổ biến Việc

liên kết các máy tính trên môi trường mạng cũng như liên kết các mạng lại với nhau

đem lại cho chúng ta nhiều lợi ích trong công việc cũng như trong việc học tập

nghiên cứu, giải trí Chúng ta có thể sử dụng các tài nguyên sẵn có được chia xẻ

như file server, printer, máy fax, môi trường mạng còn là một môi trường thông

tin nhanh chóng và tiện lợi nhờ vào các cơ chế truyền thông trên mạng như : e-mail,

www

Bên cạnh đó, tốc độ phát triển của máy tính PC cũng rất nhanh chóng Các

kỹ thuật hiện đại đã giúp tạo ra các máy PC với tốc độ tính toán nhanh hơn, bộ nhớ

lớn hơn và khả năng xử lý của nó cũng ngày càng đa dạng hơn trong khi giá thành

ngày càng rẻ hơn Một trong những khả năng ưu việt của máy PC hiện nay là hỗ trợ

multimedia Các máy PC ngày nay giao tiếp với con người không chỉ bằng text mà

còn kết hợp tất cả các phương tiện khác như tiếng nói, hình ảnh

Việc đưa kỹ thuật multimedia vào các ứng dụng truyền thông trên mạng giúp

chúng ta tạo ra nhiều ứng dụng phong phú hơn Chẳng hạn hộp thư điện tử ngày nay

có thể không chỉ là văn bản mà còn bao gồm tiếng nói, hình ảnh Các trang web trở

nên sinh động hơn hẳn khi kèm theo kỹ thuật multimedia Bên cạnh đó, chúng ta có

thể thiết kế các ứng dụng tiện ích như Video conference, voice mail

Thông qua chương trình này, người sử dụng có thể trao đổi thông tin với

nhau bằng tiếng nói Chương trình này đã được hiện thực rất nhiều trong các lĩnh

vực thông tin như điện thoại, viễn thông, máy tính Tuy nhiên nó chưa được áp

dụng và phát triển rọâng rãi như trên các lĩnh vực thông tin khác do sự hạn chế của

thiết bị Ngày nay, khi công nghệ thông tin đã phát triển thì việc hiện thực chương

trình này là hoàn toàn có thể Ứng dụng trong nhiều lĩnh vực khác nhau như :

 •Việc dạy học từ xa

 •Việc chẩn đoán, chữa bệnh từ xa

 •Hội thảo, thảo luận theo nhóm

 •Công cụ trao đổi thông tin bằng hình ảnh và âm thanh

Mục tiêu của đồ án tốt nghiệp là tìm hiểu các mô hình và công nghệ truyền âm

thanh trên mạng máy tính, trên cơ sở đó xây dựng ứng dụng truyền thông âm thanh

thoại trên mạng cục bộ Đồ án sẽ xây dựng thử nghiệm một hệ thống cho phép trao

đổi thông tin bằng tiếng nói thoại, tương tác điểm – điểm trên mạng LAN Đồ án

được trình bày gồm 5 chương với bố cục như sau :

Chương I : Tìm hiểu các mô hình điện thoại qua mạng, Từ đó đưa ra mô hình sẽ

thực thi trong đồ án này

Chương II: Giới thiệu chung về các giao thức truyền thông trên mạng Internet và

vào khảo sát cụ thể các giao thức này

Chương III : Giới thiệu các chuẩn mã hoá và nén âm thanh

Chương IV : Tìm hiều môi trường lập trình SDK Windows và ứng dụng trên mạng

Trang 2

giúp của công cụ SDK Đánh giá và các kết quả thử nghiệm

Phần kết luận : Nêu những kết quả của đề tài và hướng nghiên cứu hướng phát triển

tiếp theo

Việc nghiên cứu lý thuyết một cách hệ thống và xây dựng chương trình phần

mềm đòi hỏi phải đầu tư nhiều thời gian Với thời gian có hạn cho nên bài luận văn

này của em không tránh khỏi những thiếu sót, em rất mong được sự chỉ dẫn thêm

của thầy cô và các bạn

Nhân đây, em xin chân thành cám ơn đến PGS - TS Nguyễn Thị Hoàng Lan,

người trực tiếp hướng dẫn em hoàn thành cuốn luận văn này Em xin chân thành

cám ơn các thầy cô trong khoa Công nghệ thông tin Trường ĐH Bách Khoa HN,

Trường ĐH Thủy Sản và toàn thể các bạn đã giúp đỡ em hoàn thành cuốn luận văn

này

Trang 3

I.1 CÁC MÔ HÌNH ĐIỆN THOẠI

I.1.1 MÁY TÍNH ĐẾN MÁY TÍNH

Trong mô hình này cả hai thuê bao đều sử dụng máy tính được nối vào

mạng IP như một thiết bị đầu cuối Tiếng nói được mã hoá sau đó là nén và quá

trình nhận dữ liệu hoàn toán giống nhưng với quy trình ngược lại là giải nén, giải

mã bằng phần mềm Trong mô hình này đòi hỏi cả hai thuê bao cần phải có

soundcard, microphone, loa và phần mềm giống nhau.[1]

Hình I.1 : Mô hình PC - PC

I.1.2 MÁY TÍNH ĐẾN ĐIỆN THOẠI HOẶC ĐIỆN THOẠI ĐẾN MÁY TÍNH

Trong mô hình này, một thuê bao sử dụng máy tính nối mạng với mạng còn

thuê bao kia sử dụng điện thoại trong mạng PSTN/ISDN/GSM/TDM Sử dụng một

gateway để chuyển tiếng nói trên mạng IP thành tiếng nói trên mạng PSTN và

trao đổi thông tin giữa hai mạng trên Như vậy, ở đây máy tính phải đầy đủ các

thiết bị như Soundcard, loa, microphone và phần mềm thông qua server của mạng

IP để có thể kết nối với mạng PSTN thông qua Geteway

Hình I.2 : Mô hình Máy tính – Điện thoại

I.1.3 ĐIỆN THOẠI ĐẾN ĐIỆN THOẠI

Trong mô hình này, cả hai thuê bao đều sử dụng điện thoại bình thường và

mạng IP được sử dụng trong trường hợp cuộc gọi đường dài Gateway được sử dụng

ở cả hai đầu để chuyển đổi dữ liệu giữa các mạng với nhau.[1]

Trang 4

Hình I.3 : Mô hình Điện thoại – Điện thoại

I.2 YÊU CẦU ỨNG DỤNG TRUYỀN ÂM THANH TRÊN MẠNG LAN

Trong phần này sẽ phân tích các yêu cầu xây dựng ứng dụng truyền âm

thanh trên mạng LAN : Từ ba mô hình trên em nhận thấy mô hình 2 và 3 đòi hỏi

quá trình nghiên cứu và thiết bị phức tạp, đòi hỏi phải đầu tư công nghệ mới có thể

thực hiện được Nên trong đồ án này chỉ có thể thức hiện theo mô hình 1 là PC –

PC, nó đơn giản hơn và không cần đầu tư thiết bị mới, có thể tận dụng các thiết bị

có sẵn và điều quan trọng có thể thử nghiệm hoàn chỉnh trong phạm vi đồ án

Vấn đề đặt ra là với một hệ thống mạng LAN, WAN cùng với tài nguyên

sẵn có của nó xây dựng một chương trình truyền tiếng nói với thời gian thực cho

phép từ máy này sang máy khác (point to point) với một số các yêu cầu thích hợp

giống như việc xử lý và truyền tiếng nói trong thông tin liên lạc (điện thoại hữu

tuyến) Chương trình sử dụng giao thức TCP/IP là một giao thức phổ biến và tin

cậy hiện nay để kết nối và truyền tiếng nói Do sử dụng giao thức TCP là giao thức

có liên kết nên dẫn đến độ trễ rất lớn nhưng với ứng dụng trong mạng LAN thì vẫn

có thể chấp nhận được Ngay khi tiếng nói được thu và có thể qua một số các xử lý

như mã hoá tiếng nói hoặc nén trên một máy, tiếng nói được truyền tới máy cần

kết nối và qua các xử lý ngược so với lúc thu như giải nén và giải mã để được phát

ra loa Chương trình cho phép kết nối hai máy và tạo một mô hình điện thoại trên

máy tính như điện thoại hữu tuyến thông thường Bất kỳ máy nào trong mạng cũng

có thể ở chế độ chờ hay chế độ chạy nền (background) gọi máy là P-SERVER;

máy ở chế độ gọi (active) gọi là P-CLIENT Như vậy một máy trong mạng có thể

là P-SERVER hoặc P-CLIENT Trên môi trường mạng, khi chúng ta muốn nói

chuyện một người trên một máy nào đó, chúng ta sẽ tiến hành việc gọi liên kết

Việc gọi liên kết được tiến hành bằng việc xác định địa chỉ IP của máy mà chúng

ta cần liên kết Sau đó chúng ta sẽ chờ việc xác lập liên kết Ở máy được gọi sẽ có

thông báo cho người sử dụng biết rằng có một người khác muốn nói chuyện Tùy

theo người đó quyết định có chấp nhận hay không Nếu chấp nhận thì liên kết sẽ

được xác lập và hai bên sẽ có thể tiến hành trao đổi thông tin với nhau

Trong quá trình trao đổi thông tin, các máy sẽ truyền tiếng nói của người sử

dụng đồng thời nhận dữ liệu âm thanh của máy liên kết Khi nói chuyện xong, liên

kết sẽ bị hủy bỏ và chương trình kết thúc Nếu máy được gọi không có người trả

lời thì sau thời gian chờ vượt quá giới hạn thì liên kết cũng sẽ bị huỷ bỏ Vì dữ liệu

truyền nhận trong chương trình là dữ liệu dạng liên tục của âm thanh cho nên có

Trang 5

các yêu cầu đặt ra như sau: Bảo đảm tính mạch lạc của dữ liệu Tiếng nói trong

quá trình thông tin phải rõ ràng, liền lạc, không bị ngắt quãng

Các yêu cầu trên đặt ra các nhiệm vụ mà chúng ta phải giải quyết trong

việc xây dựng chương trình Đối với dữ liệu là âm thanh, chúng ta phải xem xét

các thông số trong quá trình lấy mẫu ở đầu vào Các thông số đặc trưng như : tần

số lấy mẫu, số bit biểu diễn cho một điểm lấy mẫu, kênh lấy mẫu được sử dụng 1

kênh (mono) hay hai kênh (stereo) Do đó chúng ta phải tổ chức kích thước buffer

âm thanh sao cho phù hợp với việc truyền nhận đạt tốc độ cao Một vấn đề khác

được đặt ra với dữ liệu âm thanh là việc nhận và phát ở đầu ra, chúng ta phải quan

tâm đến việc xử lý và loại bỏ các tín hiệu nhiễu giúp cho âm thanh được rõ ràng,

trung thực Do việc truyền nhận dữ liệu là trên môi trường mạng nên chúng ta

phải quan tâm đến tốc độ, lưu lượng trao đổi dữ liệu, thời gian truyền nhận để đưa

ra cách giải quyết cho phù hợp Ngoài các vấn đề chính ở trên, một số yêu cầu

khác đặt ra cho ứng dụng như : cơ chế tạo lập liên kết, việc chọn lựa các dạng

format dữ liệu, định các thông số thời gian Tất cả các nhiệm vụ thực thi đều phải

được thực hiện thông qua giao diện dễ dàng cho người sử dụng.[3]

Trường hợp mở rộng hệ thống cho mạng Internet cần một kết nối giữa

server mạng với tổng đài mạng PABX, yêu cầu này đòi hỏi phức tạp hơn và cần có

các trang thiết bị để thử nghiệm Bởi vậy trong đồ án này em chỉ nghiên cứu cách

thức truyền tiếng nói trên mạng nội bộ

Trang 6

II.1 KHÁI NIỆM CƠ BẢN GIAO THỨC TCP/IP

Trong hệ thống mạng Internet, mỗi máy có một tên và một địa chỉ IP

(Internet Protocol) Tên hay địa chỉ IP đều xác định duy nhất một máy trong hệ

thống mạng Internet Giữa tên máy và địa chỉ IP đều có thể chuyển đổi thông qua

các hàm Địa chỉ IP đều được biểu diễn bằng một số 32 bits Mỗi giao diện mạng

trong một nút nếu có hỗ trợ một ngăn xếp IP đều được gán một địa chỉ IP Địa chỉ

IP gồm 2 phần : chỉ số mạng(netid) và chỉ số của máy chủ (hostid) Những bits

quan trọng nhất được dùng để xác định số lượng bits dùng cho netid và hostid Có 5

lớp địa chỉ được xác định là A,B,C,D và E Trong đó, lớp A,B,C chứa địa chỉ có thể

gián được Lớp D dành riêng cho kỹ thuật Multicasting và được sử dụng trong các

giao thức đặc biệt để truyền thông điệp đến một nhóm nút được chọn lọc Lớp E

dành riêng cho những ứng dụng trong tương lai.[5]

Hình II.1 Các lớp đại chỉ IP

Trang 7

Netid nhận dạng cho từng mạng riêng biệt Các kiểu lớp địa chỉ IP cho thấy

số lượng mạng và số lượng nút của mỗi lớp khác nhau Bảng dưới cho thấy số

lượng mạng và số lượng nút có thể của mỗi lớp địa chỉ :

Lớp địa chỉ Số lượng mạng Số lượng nút

Mạng lớp A dùng cho mạng diện rộng Trường netid có 7 bits nên có thể có

127 mạng Mạng lớp B là mạng có kích thước trung bình và thích hợp cho các tổ

chức có quy mô lớp và vừa Mạng lớp C dùng trong cơ quan nhỏ, trong đó mỗi

mạng chỉ có không hơn 254 nút

Con số 32 bits biểu thị 4 chữ số thập phân tương ứng giá trị 4 byte tạo thành

địa chỉ IP Những số thập phân cách nhau bởi dấu chấm (.) Một ví dụ về tên máy

và địa chỉ IP của máy :

Hostname : viethung

IP Address : 192.168.0.55

II.1.1 KHÁI NIỆM SOCKET

Socket là một đơn vị cấu trúc truyền thông 2 chiều Chúng có thể đọc hay

ghi lên nó Tuy nhiên mỗi socket là một thành phần của một mối nào đó giữa các

máy trên mạng máy tính và các thao tác đọc ghi chính là các thao tác trao đổi dữ

liệu giữa các ứng dụng trên nhiều máy khác nhau Socket là điểm kết nối cuối

cùng cho phép những ứng dụng gắn vào mạng Khái niệm socket được cung cấp

bởi một thư viện chứa tất cả các hàm yêu cầu cho bất kỳ chương trình mạng nào

Khi một ứng dụng yêu cầu các dịch vụ mạng, nó gọi quá trình tự tập hợp các thư

viện để quản lý hoạt động mạng Hai loại socket có sẵn stream và datagram.[5]

Trang 8

Hình II.3 Các socket và port trong mối nối TCP/IP

Số hiệu cổng Mô tả

Trang 9

- Các ứng dụng chuẩn : 0 – 999

- Các ứng dụng không chuẩn : 1000 – 64000

II.1.2 GIAO THỨC IP

Internet protocol (IP) là một dạng giao thức truyền tin được thiết kế cho

mạng chuyển mạng gói Vai trò của IP tương đương với vai trò của tầng mạng

trong mô hình OSI Giao thức IP đảm nhiệm việc chuyển những gói mạch dữ liệu

(datagram) từ địa chỉ nguồn đến địa chỉ đích Địa chỉ IP có địa chỉ cố định (4 byte)

dùng để xác định duy nhất các trạm làm việc đang tham gia vào việc truyền, nhận

dữ liệu Trong trường hợp mạng truyền tin chỉ có thể truyền những gói dữ liệu có

kích thức nhỏ, giao thức IP cũng đảm nhiệm chức năng chia nhỏ các gói dữ liệu có

kích thước lớn trước khi truyền và gộp chúng lại chúng sau khi nhận được.[5]

Giao thức IP được thiết kế với chức năng chuyển 1 gói các bit, gọi là

internet datagram từ địa chỉ nguồn đến địa chỉ đích Đây là một giao thức theo kiểu

không liên kết, nghĩa là không có giai đoạn thiết lập liên kết trước khi truyền dữ

liệu, nó cũng không có các cơ chế bảo đảm thông tin tới đích an toàn, không có cơ

chế điều khiển luồng dữ liệu Trên thực tế việc thông báo về lỗi đường truyền có

thể được thực hiện nhờ một giao thức khác có tên ICMP( Internet Control Message

Protocol)

Địa chỉ IP như đã nói ở trên, là một chuỗi bit có độ dài 4 byte, được phân

chia làm 5 lớp và các bit đầu tiên được dùng làm định danh lớp địa chỉ

II.2 GIAO THỨC TCP

Giao thức TCP là giao thức dùng cho tầng ngay trên tầng IP Đối với mô

hình OSI, ta có thể thấy tầng TCP có vai trò tương ứng với các tầng giao vận và

tầng phiên

Khác với IP, TCP là giao thức có liên kết (connection oriented), nghĩa là

nhất thiết phải có giai đoạn thiết lập liên kết giữ các cặp thực thể TCP trước khi

chúng có trao đổi dữ liệu với nhau Giao thức TCP cung cấp một khả năng truyền

dữ liệu một cách an toàn giữa các thực thể trên mạng Nó cung cấp các chức năng

nhằm kiểm tra tính chính xác của dữ liệu khi gửi đến và gửi lại dữ liệu khi có lỗi

xảy ra.[5]

Đơn vị dữ liệu cơ bản của TCP gọi là segment Trong segment có một cặp

tham số là số hiệu cổng của trạm nguồn và số hiệu cổng của trạm đích Mỗi một

tiến trình ứng dụng tại một trạm sẽ truy cập các dịch vụ TCP thông qua một cổng

Một cổng như vậy kết hợp với một địa chỉ IP sẽ tạo thành một socket duy nhất

trong mạng Dịch vụ TCP được cung cấp nhờ liên kết logic giữa một cặp socket,

mỗi socket có thể tham gia liên kết với nhiều socket ở xa khác nhau Trước khi

truyền dữ liệu chúng thiết lập liên kết và khi không có nhu cầu truyền dữ liệu nữa

thì liên kết sẽ được giải phòng

Mỗi ứng dụng TCP gồm hai phần là client và server

Trang 10

Hình II.4 Tạo kết nối giữa client và server theo giao thức TCP

II.2.1 CÁCH THỨC CÀI ĐẶT ỨNG DỤNG TCP SERVER

Ứng dụng TCP server làm việc theo qui trình sau:

Gọi hàm socket để tạo một socket

Gọi hàm bind để kết buộc socket với một port, đối với mỗi giao thức ứng

dụng chuẩn thì sẽ có một hằng số được định nghĩa sẵn trong winsock cho port của

giao thức đó

Gọi hàm listen để chờ đến khi có một client nối vào port

Khi có một client nối vào thì hàm listen trả điều khiển về, ứng dụng server

gọi hàm accept để xác nhận mối nối của client

Trang 11

Sau khi đã hoàn tất quá trình trao đổi dữ liệu, ứng dụng server gọi hàm

closesocket để đóng socket đã tạo

Hình II.5 Sơ đồ giao tiếp giữa server với client

Trang 12

Ứng dụng client TCP làm việc theo qui trình sau :

- Gọi hàm socket để tạo một socket

- Gọi hàm connect để nối vào server

- Gọi hàm gửi hay nhận dữ liệu để trao đổi thông tin với server, ví dụ như

hàm send, recv

- Sau khi đã hoàn tất quá trình trao đổi dữ liệu, ứng dụng client gọi hàm

closesocket để đóng socket đã tạo

Hình II.6 Sơ đồ giao tiếp của client với server

Ghi chúù:

Trang 13

Các bước trên cơ bản là giống nhau cho các ứng dụng client và server viết

trên Windows NT và UNIX Tuy nhiên, với ứng dụng viết trên UNIX thì không

cần gọi các hàm WSAStartup, WSACleanup để khởi tạo thư viện quản lý socket

và đóng bộ phận này Lý do, với UNIX thì bộ phận quản lý socket đã được hệ điều

hành nạp sẵn

II.3 GIAO THỨC UDP

Giao thức UDP cung cấp khả năng broadcast trên hệ thống mạng TCP/IP

Chúng ta cũng cần cài đặt ứng dụng client và server Ứng dụng client có nhiệm vụ

gửi thông báo đến tất cả các instance của ứng dụng server đang chạy trên hệ thống

mạng.[5]

II.3.1 CÁCH CÀI ĐẶT ỨNG DỤNG SERVER UDP

Ứng dụng server UDP được cài đặt đơn giản hơn ứng dụng TCP Chúng ta

cần các bước chính sau đây :

- Gọi hàm socket để tạo một socket

- Gọi hàm bind để kết buộc socket với một port, đối với mỗi giao thức ứng

dụng chuẩn thì sẽ có một hằng số được định nghĩa sẵn trong winsock cho

port của giao thức đó

- Gọi các hàm gửi hay nhận dữ liệu để trao đổi thông tin với client, ví như

hàm sendto, recvfrom

- Sau khi đã hoàn tất quá trình trao đổi dữ liệu, ứng dụng server gọi hàm

closesocket để đóng socket đã tạo

II.3.2 CÁCH CÀI ĐẶT ỨNG DỤNG CLIENT UDP

Ứng dụng client UDP thực hiện các bước sau :

- Gọi hàm socket để tạo một socket

- Gọi hàm setsockopt để làm cho socket có khả năng broadcoast

- Gọi các hàm gửi hay nhận dữ liệu để trao đổi thông tin với server, ví dụ

hàm sendto, recvfrom

- Sau khi đã hoàn tất quá trình trao đổi dữ liệu, ứng dụng client gọi hàm

closesocket để đóng socket đã tạo

Ghi chú:

Ngoài các bước trên, các ứng dụng viết trên Windows NT (kể cả client và

server) phải gọi hàm WSAStartup để khởi tạo thư viện liên kết động Windows

Socket DLL và hàm WSACleanup để đóng thư viện này Tuy nhiên, đối với ứng

dụng viết trên UNIX thì bộ phận quản lý socket đã được hệ điều hành nạp sẵn và

do đó không cần gọi các hàm như WSAStartup, WSACleanup của Windows NT

Trang 14

III.1 CÁC PHƯƠNG PHÁP MÃ HOÁ

III.1.1 GIỚI THIỆU CHUNG

Trong hệ thống xử lý âm thanh, âm thanh được mã hoá PCM Các mã hoá

này cho phép khôi phục một cách tương đối trung thực tín hiệu âm thanh trong dải

tần nghe được Tuy nhiên trong một ứng dụng đặc biệt như truyền dữ liệu âm

thanh trên mạng, âm thanh được truyền với tốc độ thấp hơn nhiều Từ đó xuất hiện

một số kỹ thuật mã hoá và nén tín hiệu âm thanh như ADPCM, LPC, GSM…

Các loại phần mềm và phần cứng thực hiện mã hoá và nén âm thanh sang

các loại dữ liệu số thường được gọi là codec(Coder-Decoder) Có thể phân loại các

phương pháp mã hoá âm thanh thành 3 loại :

Mã hoá dạng sóng(waveform codec) : Giữ nguyên hình dạng nguyên thuỷ

của sóng âm Phương pháp mã hoá này đòi hỏi tốc độ dữ liệu rất cao nhưng lại cho

chất lượng âm thanh rất tốt Ưu điểm của bộ mã hoá này là độ phức tạp, giá thành

thiết kế, độ trễ và công suất tiêu thụ thấp Bộ mã hoá sóng đơn giản nhất là điều

biên xung mã (PCM)…Tuy nhiên nhược điểm của bộ mã hoá là không tạo được âm

thanh chất lượng cao tại tốc độ dưới 16 kbps, bộ mã nguồn khắc phục được nhược

điểm này.[4]

Mã hoá nguồn (Source codec) : Cho phép đạt được tốc độ truyền dữ liệu

thấp, có thể thực hiện tại tốc độ bit > 2kbps, nhưng chất lượng âm thanh không cao

Mã hoá hỗn hợp (hybrid codec) : Sử dụng cả hai phương pháp trên để tạo ra

tín hiệu âm thanh có chất lượng tốt ở tốc độ dữ liệu trung bình

Rất tốt

Tốt

Trung

Chất lượng tiếng nói Mã hoá hỗn hợp Mã hoá dạng sóng

Mã hoá dự đoán tuyến tính LPC

Trang 15

Hình III.1 Biểu đồ so sánh các phương pháp mã hoá

Mã hoá dạng sóng

Đòi hỏi tốc độ bit rất cao nhưng tạo ra chất lượng âm thanh hoàn hảo và thời

gian xử lý rất ít, bởi vì phương pháp này chỉ đơn giản lấy mẫu tín hiệu ở tốc độ nào

đó và lượng tử hoá từng mẫu dùng lượng tử hoá tuyến tính Cách tiếp cận này gọi

là điều biến xung mã(PCM) Aâm thanh mã hoá theo phương pháp PCM, lấy mẫu

tốc độ 8KHz, lượng tử 8bit/mẫu, cho tốc độ bit ra là 64 kbps

Phương pháp điều biên xung mã vi phân (DPCM) dự đoán giá trị hiện tại

dựa vào các giá trị trước của các mẫu quá khứ, chỉ lưu trữ giá trị sai số lượng tử

Giá trị sai số này sẽ nhỏ hơn giá trị thực của mẫu, do đó cho phép lưu trữ giảm đi

một phần

Một cải tiến của DPCM là điều biến xung mã vi phân thích nghi(ADPCM)

Bộ tiến đoán và lượng tử hoá trong phương pháp này có khả năng thích nghi với tín

hiệu cần mã hoá ADPCM hoạt động tốc độ 32 kbps cho chất lượng tương đối với

PCM 64 kbps

Mã hoá dự đoán tuyến tính LPC

Một vấn đề đáng quan tâm là phương pháp mã hoá dạng sóng là khi lấy

mẫu tín hiệu tương đương sẽ cho ra dòng dữ liệu khá lớn Các phương pháp mã hoá

nguồn đi theo một cách tiếp cận khác, người ta phải qua tâm đến việc âm thanh

được tạo ra như thế nào, nếu có thể mô hình hoá cách tạo ra âm thanh thì không

phải truyền đi các mẫu của tín hiệu âm thanh mà chỉ cần gửi đi cách thức tạo ra

âm đó trên đến bộ mã Như vậy theo phương pháp này thay vì mã hoá và truyền

trực tiếp âm thanh thì người ta chỉ mã hoá các tham số tạo ra âm thanh tại nơi

nhận, từ các tham số này bộ tổng hợp tiếng nói sẽ tổng hợp nên tiếng nói nhân tạo

Những phương pháp đi theo cách tiếp cận này gọi là Vocoder Mô tả đơn giản nhất

của mô hình này là mã hoá dự đoán tuyến tính (LPC) Phương pháp mã hoá

Vocoder cho tốc độ bit rất thấp (>2 kbps) nhưng độ phức tạp cao hơn với phương

pháp mã hoá dạng sóng và chất lượng âm thanh không trung thực

Mã hoá hỗn hợp

Để giải quyết vấn đề của phương pháp mã hoá dạng sóng và của phương

pháp mã hoá dự đoán, một nhóm các phương pháp mã hoá sử dụng phương pháp

AbS (Analysis by Synthesis) để tạo ra mô hình máy phát âm phức tạp hơn Trong

khi Vocoder sử dụng bộ lọc tuyến tính kích thích bởi chuỗi xung tuần hào hay

chuồi nhiễu trắng để tạo ra âm hữu thanh hay vô thanh, AbS sử dụng một dãy các

Trang 16

kiểm tra khung đó với rất nhiều tín hiệu kích thước rồi sẽ chọn tín hiệu nào đưa ra

kết quả gần đúng nhất với âm thanh ban đầu Bộ giải mã chỉ cần biết chỉ số của

xung kích thước đó, sau đó tra codebook rồi tái tạo lại âm thanh Một số các tham

số khác nhau như năng lượng của sự kích thích và giá trị chu kỳ cũng cần đến khi

giải mã Các phương pháp mã đi theo cách này đòi hỏi quá trình tính toán phức

tạp, có thể tất cả các mục trong từ điển đều phải thử để đưa ra giá trị tốt nhất

Hệ thống thông tin toàn cầu GMS : GSM là mộ chuẩn điện thoại được Viện

Tiêu Chuẩn Viễn Thông Châu Aâu ETSI để ra Đầu vào của bộ nén GMS 06.10 bao

gồm các khung 160 mẫu các tín giệu PCM tuyến tính lấy mẫu tại tần số 8 kHz

Chu kỳ mỗi khung là 20 ms, đây là khoảng thời gian rất ngắn và trong khoảng thời

gian này cho phép được coi tín hiệu âm thanh ổn định Độ trễ truyền dẫn thông tin

được tính bằng tổng thời gian xử lý và kích thước khung của thuật toán

Bộ mã hoá thực hiện việc nén một khung tín hiệu đầu vào 160 mẫu (20 ms)

vào một khung 260 bit Như vậy một giây nó sẽ thực hiện nén được 13.133 bit (

tương đương với 1625 byte) Do vậy để nén một megabyte tín hiệu chỉ cần một thời

gian chưa đầy 10 phút.[4]

Trung tâm của quá trình xử lý tín hiệu là bộ lọc Đầu ra của bộ lọc phụ

thuộc rất nhiều vào giá trị đầu vào đơn của nó Khi có một dãy các giá trị đưa qua

bộ lọc thì dãy tín hiệu này sẽ được dùng để kích thích bộ lọc Dạng của bộ nén

GMS 06.10 dùng để nén tín hiệu âm thanh bao gồm 2 bộ lọc và một giá trị kích

thước ban đầu Bộ lọc ngắn hạn dự đoán tuyến tính được đặt tại tầng đầu tiên của

quá trình nén và tại tầng cuối cùng trong suốt quá trình dãn Nó được kích thích bởi

đầu ra của bộ lọc dự đoán dài hạn (LTP)

III.1.2 PHƯƠNG PHÁP ĐIỀU BIẾN XUNG MÃ PCM

Mã hoá tín hiệu âm thanh liên qua tới các bước sau đây :

a Tín hiệu âm thanh được lấy mẫu với tần số tối thiểu là :

f s2 fmax

fs : tần số lấy mẫu

fmax : tần số lớn nhất trong tín hiệu được lấy mẫu

Việc lấy mẫu như vậy là đảm bảo hoàn toàn khôi phục lại được tín hiệu tương

đương ban đầu bởi thiết bị khôi phục thiết bị Tần số lấy mẫu nhỏ nhất cũng có thể

nhỏ hơn 2fmax nếu tần số thấp nhất của tín hiệu khác không

b Biên độ của từng mẫu tín hiệu được lượng tử hoá thành một trong số 2B mức

Điều này có nghĩa dùng B bit trên một mẫu và thông lượng là 2fsB bit/giây với

tín hiệu được lọc thông thấp

c Các mức biên độ riêng biệt được thể hiện bằng các từ nhị phân riêng biệt có

chiều dài B ví dụ : với B =2 thì một từ có thể thể hiện cho 4 mức riêng biệt

bằng cách sử dụng các từ mã 00, 01, 10 và 11

d Đối với việc giải mã, các từu nhị phân được ứng thành các mức biên độ và

chuỗi xung biên độ – thời gian được lọc thông thấp với một bộ lọc có dải tần

Trang 17

giới hạn là fs Bây giờ chúng ta giả sử là các bước a, c và d có thể thực hiện

một cách hoàn toàn chính xác, chúng ta tập trung vào việc xác định các lỗi

lượng tử xuất hiện trong bước b

Cho bước lượng tử (kí hiêu : ∆) Nếu số lượng các mức lượng tử rất lớn, người ta

giả sử rằng sai số lượng tử có phân bố đồng nhất như sau :

= 1 )

(E

p ,

-2 2

Điều này sẽ không đúng nếu tín hiệu là bão hoà bộ lượng tư Ví du như biểu

diễn hình 1, đầu ra của bộ lượng tử có thể bão hoà tại 5 với tần số đầu và vượt qua

số lượng và mỗi lượng tử trong trường hợp này sẽ là một hàm tăng tuyến tính.[4]

Hình III.2 a.Đặc tuyến lượng tử hoá;b.Đặc tuyết sai số lượng tử; c.VD lượng tử đều

Nếu như ta cho rằng bộ lượng tử không bị bão hoà Theo công thức (1) thì

giá trị bình phương trung bình của sai số lượng tử là :

12 )

(E dE p

Nếu giá trị độ rộng của đầu vào X là Xrms, thì tỷ số tín hiệu/nhiễu được tính bởi :

SNR= X rms2 /[∆2/ 12] (3)

Trang 18

Ví dụ, cho bộ lượng tử có khoảng biên độ từ – 4Xrms đến + 4Xrms( để

thuận tiện về mặt lý thuyết, thì độ rộng 8Xrms của bộ lượng tử không có ràng buộc

riêng, ngoại trừ các trường hợp đặc biệt Ví dụ, nếu tín hiệu PDF p(x) được biến

đổi bằng hàm Gaussian trung bình – không, thì các mẫu tín hiệu sẽ rơi bên ngoài

khoảng 8Xrms của bộ lượng tử với xác xuất nhỏ hơn 1/10.000) bước lượng tử đều

có thể được thực hiện tỷ số của khoảng biên độ trên số lượng các bước lượng tử (số

các mức đầu ra)

B

rms

X / 2 8

=

Từ (3) và (4) ta có :

SNR(dB) = 10 log10SNR= 6B− 7 , 2 (5)

Công thức trên miêu tả rất tốt về PCM với các điều kiện sau :

1.Hệ thống hoạt động với kênh sạch(không nhiễu), chỉ giới hạn về sai số lượng tử(

và không gây ra lỗi các từ mã khi kênh có nhiễu)

2.Tín hiệu đầu vào đủ phức tạp để loại trừ cấu trúc thời gian hiển nhiên trong dạng

tín hiệu lỗi, như vậy biểu diễn tĩnh của lỗi trong 1 được thể hiện đầy đủ

3.lượng tử hoá đủ mịn(B>6) để ngăn chặn những thành phẩm liên quan đến tín

hiệu trong dạng tín hiệu lỗi, sai số có thể được đo trong biểu thức công suất nhiễu

hay là biến sai số 2

4.Bộ lượng tử được sắp với thanh biên độ từ (-4Xrms;+4Xrms)

như vậy trong lượng tử đều, cứ thêm 1 bit thì được lợi 6 dB và để có chất lượng

thích hợp thì B >11 do đó thông lượng tương đối lớn

III.2 CÁC PHƯƠNG PHÁP NÉN TIẾNG NÓI

III.2.1 GIỚI THIỆU CHUNG

Y Ùtưởng nén tiếng nói là để giảm kích thước nhằm giúp ít tốn băng thông

truyền qua mạng Dòng dữ liệu tiếng nói được giải nén ở tốc độ lấy mẫu mặc định

( 8bits/mẫu, 8 khz, kênh mono) sẽ yêu cầu đường truyền có tốc độ 8000 mẫu/giây

* 8 bits/ mẫu = 64 Kbits/giây để truyền dữ liệu qua mạng Do đó, tùy theo tốc độ

đường truyền thực tế trên mỗi mạng mà chọn giải pháp nén hay không nén dữ liệu

trước khi truyền dữ liệu âm thanh qua mạng, cũng như chọn tỉ lệ nén là bao nhiêu

cho phù hợp (chọn giải thuật nén) Vì nếu dữ liệu được nén thì phải giải nén khi

được truyền đến máy nhận, do đó cũng tốn thời gian để nén và giải nén dữ liệu,

điều này dẫn đến ảnh hưởng thời gian thực của hệ thống

Đối với các mạng cục bộ, thường có tốc độ truyền của mạng cao nên có thể

không cần phải nén tiếng nói trước khi truyền

Ngược lại, đối với mạng Internet, hệ thống được kết nối với Internet thông

qua các modem chuẩn có tốc độ thấp 14,4 Kbits/s hoặc 28,8Kbits/s thì nhất thiết

phải nén tiếng nói trước khi truyền và giải nén trước khi phát Hai phương pháp

nén âm thanh thường được dùng nhất để giảm băng thông là GSM và ADPCM.[2]

Trang 19

III.2.2 CÁC PHƯƠNG PHÁP NÉN CỤ THỂ

III.2.2.1 Phương pháp nén tiếng nói theo chuẩn GSM

Phát triển tại Đại học Kỹ thuật Berlin vào năm 1992, GSM là một trong

những phương pháp nén âm thanh phức tạp nhất đang được sử dụng, cho tỉ lệ nén

1:10 Giải thuật GSM dựa trên giao thức truyền thông Mobile Phone, hiện tại là

giao thức phổ biến nhất tại Châu Âu đối với điện thoại di động

Đầu vào của GSM bao gồm các frames 160 tín hiệu, những tín hiệu PCM

tuyến tính 13 bits lấy mẫu ở 8 Khz GSM có sẵn trong thư viện C có thể được dùng

để tạo ra một đối tượng gsm giữ trạng thái cần thiết hoặc để mã hóa những mẫu

PCM tuyến tính thành các frames GSM, hoặc giải mã các frames GSM thành các

frames PCM tuyến tính Bộ mã hóa nén 160 frames PCM 16 bits thành các frames

GSM 260 bits Tương ứng một giây tiếng nói thành 1625 bytes Bởi vì mẫu 260 bits

không chẵn để gắn vào các bytes 8 bits, nên bộ mã hóa sẽ mã hóa frame 160 bytes

thành frame GSM 264 bits Một buffer GSM nén 1 Mb có thể lưu tiếng nói gần 10

phút.[2]

Một dòng dữ liệu tiếng nói giải nén 16 bits/mẫu ở 8Khz yêu cầu băng thông

tốc độ 128 Kbits/s, trong khi đó băng thông để truyền qua mạng nếu dùng giải

thuật nén GSM , tiếng nói 16 bits/mẫu chỉ cần:

( 264 bits * 8.000 mẫu/giây)/160 mẫu = 13,2 Kbits/giây

Cho tỉ lệ nén 128/13,2 = 9,7 tương đương 10 :1

III.2.2.2 Phương pháp nén ADPCM

Nguyên tắc :

Là một phương pháp có thể được dùng để nén các khối dữ liệu tiếng nói

trước khi chúng được truyền đến các máy nhận và giải nén chúng để phát lại sau

khi được nhận từ đường truyền

Hình sau là một giản đồ khối đơn giản của bộ mã hóa và giải mã ADPCM :

Trang 20

Hình III.3 Sơ đồ khối bộ mã hoá và giải mã ADPCM

Bộ mã hóa ADPCM giả sử rằng những mẫu âm thanh kế cận nhau sẽ giống

nhau, vì thế thay vì biểu diễn mỗi mẫu độc lập như PCM ADPCM tính toán sự

chênh lệch giữa các mẫu âm thanh và giá trị tiên đoán của nó và tạo ra những giá

trị vi phân PCM Có nhiều giải thuật ADPCM khác nhau được đề nghị Trong

phạm vi luận văn này em tìm hiểu và ứng dụng giải thuật đưa ra bởi IMA

(Interactive Multimedia Association)

Giải thuật IMA ADPCM nén những mẫu PCM tuyến tính thành các mức

lượng hóa 4 bits, trong đó mỗi mẫu DPCM được biểu diễn bằng các giá trị âm

thanh 16 bits, do đó giải thuật này cung cấp một tỉ lệ nén là 4:1 Ví dụ tiếng nói 16

bits/mẫu, 8 Khz, kênh mono yêu cầu tốc độ truyền dữ liệu là 128 Kbits/s , khi nén

với giải thuật IMA_ADPCM chỉ cần tốc độ truyền dữ liệu 32 Kbits/s là đủ

Quá trình thực hiện của giải thuật IMA_ADPCM là đọc từ những bộ đệm có

giá trị kiểu nguyên và nén chúng thành một mẫu âm thanh 16 bits được biểu diễn

bằng các mức lượng hóa 4 bit Bởi vì không có giới hạn trong kích thước buffers

tiếng nói nên những mã ADPCM được kết hợp một cách dễ dàng với các phần còn

lại của chương trình để nén tiếng nói khi thu và giải nén trở lại khi phát

Giải thuật nén IMA ADPCM :

Trang 21

Theo sơ đồ mã hóa trên chúng ta thấy giải thuật IMA ADPCM tính toán sự

chênh lệch giữa mẫu âm thanh hiện tại X[n] và mẫu đã tiên đoán trước Xp[n-1] và

sử dụng sự chênh lệch đó để tính toán mức lượng hóa D[n] cho mỗi mẫu Giá trị

Xp[n-1] chỉ là giá trị trễ thời gian của giá trị X[n] Hình sau chỉ ra sơ đồ khối của

quá trình lượng hóa dùng giải thuật IMA Mỗi mức đầu ra của bộ lượng hóa được

biểu diễn bằng bốn bits Bit thứ tư là bit dấu của mức độ lượng hóa.[2]

Hình III.4 Sơ đồ giải thuật mã hoá nén IMA ADPCM

Từ sơ đồ giải thuật ta thấy rằng bit thứ ba được cài đặt lên 1 nếu độ chênh

lệch giữa X[n] và Xp[n-1] là lớn hơn hay bằng step_size Sau đó step_size được

chia 2 và so sánh trở lại với độ chênh lệch (độ chênh lệch sẽ được tính lại Mẫu =

mẫu-kích thước mẫu tại bước giải thuật nếu bit thứ ba được cài lên1) Bit thứ hai

cũng được cài lên 1 khi độ chênh lệch mới ≥ kích thước mẫu tại bước giải thuật/2

Bộ mã hóa một lần nữa laị chia kích thước mẫu tại bước giải thuật cho 2 và so sánh

với độ chênh lệch mới và thiết lập giá trị cho bit một tương tự như các bước trước

Trang 22

IV.1 MÔI TRƯỜNG LẬP TRÌNH SDK ĐỐI VỚI TRUYỀN ÂM THANH

Môi trường Windows SDK là môi trường lập trình đa phương tiện dưới

Windows, cung cấp các hàm cấp thấp rất thích hợp cho các ứng dụng trên mạng

Một cách thức đơn giản nhất trong việc xuất dữ liệu waveform ra loa là dùng hàm

PlaySound Chúng ta có thể thao tác với dạng dữ liệu waveform bằng các hàm cấp

thấp do hệ thống cung cấp Ngoài ra hệ thống còn cung cấp một cơ chế giúp người

lập trình giao tiếp dễ dàng hơn với thiết bị, đó là các hàm MCI.[6]

Trang 23

IV.1.1 CẤU TRÚC FILE WAVE VÀ HÀM PLAYSOUND

IV.1.1.1 Cấu trúc file âm thanh wave

Một file wave thật sự là một phần của một lớp file lớn hơn dùng bởi các

hàm multimedia của windows là các file RIFF ( Resource Interchange File

Format) Một file Riff bao gồm một hoặc nhiều chunk Trong mỗi chunk có con trỏ

chỉ đến chunk kế tiếp Mỗi chunk có một mô tả kiểu theo sau bởi một số dữ liệu

Một ứng dụng để đọc các file RIFF có thể bước qua một số chunk, đọc các chunk

cần quan tâm và bỏ qua các chunk không liên quan Chunk file RIFF luôn luôn bắt

đầu bằng header sau:

FOURCC là một vùng 4 bytes định nghĩa loại chunk Vùng này sẽ chứa từ

WAVE đối với file wave

ckSize đặc tả kích thước dữ liệu trong chunk, sau header này chúng ta sẽ tìm

thấy cSize bytes dữ liệu

Các chunk có thể chứa các subchunks Cấu trúc thật sự một file wave cơ bản

bao gồm một chunk fmt theo sau là một chunk dữ liệu Có thể có những chunk

khác phía sau chunk WAVE nhưng thiết bị sử dụng file WAVE sẽ bỏ qua các

chunk này Hình sau mô tả cấu trúc file RIFF chứa dữ liệu WAVE

ID SIZE FROM TYPE

"fmt"

SIZE

"data"

SIZE

Hai subchunk trong chunk wave đặc tả thông tin về một âm thanh file wave

và sau đó là chính dữ liệu âm thanh Chunk fmt chứa chủ yếu đối tượng

WAVEFORMAT và một số dữ liệu thêm vào gắn ở cuối chunk Một đối tượng

WAVEFORMAT được định nghĩa như sau :

Typedef struct waveformar_tag{

DWORD nSamplesPerSec;

Trang 24

Giá trị WAVE_FORMAT_PCM báo cho phần mềm đọc file wave biết cách âm

thanh trong nó được mã hoá

nChannels : Của đối tượng WAVEFORMAT có 2 giá trị :

• 1 đối với âm thanh mono

• 2 đối với âm thanh stereo

nSamplePerSec : Cho biết tần số lấy mẫu của âm thanh để có thể thu và

phát cùng một tốc độ, giá trị thông thường của field này nhận một những giá trị

sau:

11025 - 11,025Khz

22055 - 22,050Khz

44100 - 44,1 Khz

nAvgBytesPerSec : Cho biết số bytes trung bình trong mỗi giây để thu và

phát dữ liệu wave

nBlockAlign : Xác định số bytes yêu cầu chứa trong một mẫu

• Những mẫu có độ phân giải nhỏ hơn hoặc bằng 8 bits có thể lưu vào

1 bytes

• Những mẫu có độ phân giải từ 9 đến 16 bits yêu cầu 2 bytes

Những mẫu stereo yêu cầu số bytes gấp đôi những mono

Trong cấu trúc trên không định nghĩa số bits thật sự trong một mẫu dữ liệu

âm thanh file wave, để định nghĩa số bits trong một mẫu ta dùng cấu trúc sau:

Typedef struct pvmwaveformat_tag{

WAVEFORMAT wf;

} PCMWAVEFORMAT;

Trong đó:

wf: Đối với dữ liệu subchunk fmt của một chunk WAVE chúng ta thật sự

làm việc với đối tượng PCMWAVEFORMAT

nBitsPerSample: Xác định số bits thật sự trong một mẫu

Trong một mẫu mono 8 bits dữ liệu của chunk dữ liệu gồm một chuỗi dài có giá trị

1 byte Những mẫu stereo được chia ra với byte đầu dùng cho kênh bên trái và

byte thứ hai dùng cho kênh bên phải, như vậy mỗi mẫu stereo 8 bits sẽ cần 2

Trang 25

Chuyển con trỏ file vào vị trí bắt đầu dữ liệu của chunk

Hoàn tất, ra khỏi chunk

Vào chunk kế tiếp

IV.1.1.2 Hàm Playsound

Chúng ta dùng hàm PlaySound để play dữ liệu dạng waveform hoặc chúng

ta có thể dùng hàm sndPlaySound Tuy nhiên trong môi trường Win32 thì nên dùng

hàm PlaySound

Hàm PlaySound cho phép chúng ta chỉ định các thông số nguồn âm thanh

theo các cách sau:

• Dùng tên alias khai báo trong file WIN.INI

• Dùng tên file

• Dùng chỉ số nhận dạng tài nguyên

Waveform-Audio Files

Trong môi trường Windows, phần lớn các file âm thanh dạng waveform đều có

phần mở rông là WAV

Ví dụ dưới đây minh họa cho việc phát file âm thanh “AmThanh.WAV”

PlaySound("C:\\SOUNDS\\AmThanh.WAV", NULL, SND_SYNC);

Play sound theo các hiện tượng

Hàm PlaySound còn cho phép chúng ta xuất âm thanh tùy theo một sự kiện

nào đó xảy ra trong hệ thống như click mouse hay nhấn một phím nào đó Hệ

thống sẽ phát âm thanh tùy theo hiệc tượng xảy ra để cảnh báo người sử dụng Aâm

thanh dạng này được gọi là sound events

Để xác định sound event, hàm PlaySound sẽ được gọi với thông số

pszSound trỏ đến bảng đăng ký sự kiện Ví dụ chúng ta sẽ gọi hàm PlaySound ứng

với sự kiện mouse click như sau:

PlaySound("MouseClick", NULL, SND_SYNC);

IV.1.2 GIAO TIẾP AUDIO VỚI BẰNG CÁC DỊCH VỤ CẤP THẤP

Trong phần này chúng ta sẽ khảo sát việc giao tiếp với thiết bị audio bằng

các hàm cấp thấp, các hàm này phù hợp với các ứng dụng cần giao tiếp Các hàm

và cấu trúc cấp thấp này đều có prefix là wave.[6]

Thiết bị và dữ liệu

Khi muốn giao tiếp với thiết bị, chúng ta phải mở thiết bị để sử dụng và sau

khi sử dụng xong thì phải đóng thiết bị lại Trong khi sử dụng chúng ta sẽ truy xuất

các tính năng của thiết bị và theo dõi thiết bị thực thi bằng các handles và

Identifiers

IV.1.3 SỬ DỤNG CÁC THIẾT BỊ XUẤT NHẬP, HỖ TRỢ WAVEFORM AUDIO

Chúng ta dùng hàm waveOutOpen để mở thiết bị đầu ra nhằm xuất dữ liệu

dạng waveform Hàm sẽ mở thiết bị waveOut và trả handle về cho ứng dụng Hệ

Trang 26

bị nếu cần chúng ta phải chỉ định rõ thông số dữ liệu Ví dụ chúng ta dùng cờ

WAVE_MAPPER để xác định thiết bị output sẽ xuất âm thanh dạng waveform

Dò tìm thiết bị

Windows cung cấp các hàm sau giúp chúng ta xác định các thiết bị trong hệ

thống phù hợp cho yêu cầu của mình

AuxGetNumDevs Truy xuất số lượng các thiết bị sẵn có trong

hệ thống WaveInGetNumDevs Truy xuất số lượng các thiết bị nhập hỗ trợ

waveform audio sẵn có trong hệ thống WaveOutGetNumDevs Truy xuất số lượng các thiết bị xuất hỗ trợ

waveform audio sẵn có trong hệ thống

Các thiết bị khai báo trong hệ thống được đánh các chỉ số nhận dạng bắt đầu

từ 0 Sau khi xác định số lượng các thiết bị sẵn có trong hệ thống, chúng ta có thể

dò tìm khả năng của từng thiết bị bằng các hàm sau:

AuxGetDevCaps Truy xuất khả năng của thiết bị xuất

WaveInGetDevCaps Truy xuất khả năng của thiết bị nhập dạng

waveform WaveOutGetDevCaps Truy xuất khả năng của thiết bị xuất dạng

waveform Các hàm truy xuất này sẽ truy xuất này sẽ lấy các cấu trúc liên quan đến

khả năng của thiết bị Các cấu trúc dưới đây sẽ tương ứng với các hàm liệt kê ở

Thiết bị waveform có khả năng hỗ trợ các dạng format không chuẩn Dạng

format không chuẩn này được dùng trong cấu trúc WAVEFORMATEX

Handle và Identifier của thiết bị

Khi mở thiết bị, chúng ta sẽ nhận được handle hay thông số Identify của

thiết bị Chúng ta sẽ điều khiển thiết bị qua các thông số này

Trang 27

Sự khác biệt giữa handle và identify là khó thấy nhưng rất quan trọng

Identitier của thiết bị được chỉ định ngầm định từ số lượng các thiết bị sẵn

có trong hệ thống Identifier sẽ được trả về khi chúng ta dùng các hàm

auxGetNumDevs, waveInGetNumDevs, or waveOutGetNumDevs Hàm

Handle của thiết bị là thông số trả về của device driver khi chúng ta dùng

các hàm waveInOpen hay waveOutOpen

Waveform-Audio Output Data Types

Các thông số dưới đây được dùng cho thiết bị waveform output

HWAVEOUT Handle của thiết bị waveform output

WAVEFORMATEX Cấu trúc dùng chỉ định dạng format thiết bị

output/ input WAVEHDR Cấu trúc dùng làm header cho khối dữ liệu

waveform Cấu trúc được dùng cho cả thiết bị output và input

WAVEOUTCAPS Cấu trúc dò hỏi khả năng của thiết bị output

Chỉ định dạng format của dữ liệu waveform audio

Khi chúng ta mở thiết bị output bằng hàm waveOutOpen, thông số pwfx sẽ

chỉ định cấu trúc WAVEFORMATEX xác định dạng format của dữ liệu waveform

Đây là cấu trúc mở rông của cấu trúc WAVEFORMAT

Ghi dữ liệu waveform

Sau khi mở thiết bị xuất, chúng ta có thể xuất dữ liệu bằng cách gọi hàm

waveOutWrite Hàm sẽ gửi khối dữ liệu âm thanh ra thiết bị xuất Chúng ta dùng

cấu trúc WAVEHDR để chỉ định header của khối dữ liệu được gửi ra Header này

gồm con trỏ tới khối dữ liệu đã lock, chiều dài khối dữ liệu và một số thông số cờ

Khối dữ liệu phải được prepare trước khi đem ra sử dụng

Sau khi gửi khối dữ liệu đến thiết bị output, chúng ta phải chờ driver hoàn

tất việc xử lý khối dữ liệu trước khi giải phóng nó Khi chúng ta cần gửi nhiều khối

dữ liệu liên tục, chúng ta sẽ phải theo dõi việc xử lý hoàn tất khối dữ liệu để có

thể gửi khối tiếp theo

PCM Waveform-Audio Data Format

Thông số lpData trong cấu trúc WAVEHDR sẽ trỏ đến dữ liệu đã được lấy

mẫu Đối với dữ liệu PCM 8-bit, mỗi giá trị lấy mẫu được biểu diễn bằng một số 8

bit không dấu Đối với dữ liệu PCM 16-bit, mỗi giá trị lấy mẫu được biểu diễn

bằng một số 16 bit không dấu Bảng dưới đây cho chúng ta thấy các giá trị cao

nhất, thấp nhất cũng như giá trị trung bình của dữ liệu PCM:

Trang 28

Các gói dữ liệu PCM

Thứ tự của dữ liệu thay đổi tùy theo dạng format 8-bit hay 16-bit, stereo hay

mono Bảng dưới đây trình bày các gói dữ liệu của các dạng PCM khác nhau:

8-bit mono Mỗi giá trị lấy mẫu là 1 byte tương ứng một kênh

Các giá trị mẫu xếp theo thứ tự 1, 2, 3, 4 8-bit stereo Mỗi giá trị lấy mẫu là 2 byte Các giá trị mẫu xếp

theo thứ tự 1, 2, 3, 4 Với mỗi giá trị mẫu byte đầu là kênh 0 (trái) còn byte sau là kênh 1 (phải)

16-bit mono Mỗi giá trị lấy mẫu là 2 byte Các giá trị mẫu xếp

theo thứ tự 1, 2, 3, 4 Với mỗi giá trị mẫu byte đầu là byte thấp của kênh 0 còn byte sau là byte cao của kênh 0

16-bit stereo Mỗi giá trị lấy mẫu là 4 byte Các giá trị mẫu xếp

theo thứ tự 1, 2, 3, 4 Với mỗi giá trị mẫu byte đầu là byte thấp của kênh 0 (trái), byte thứ 2 là byte cao của kênh 0, byte thứ 3 là byte thấp của kênh 1 (phải) còn byte thứ 4 là byte cao của kênh 1

Đóng thiết bị waveform-Audio Output

Sau khi thực thi công việc xong, chúng ta sẽ gọi hàm waveOutClose để

đóng thiết bị Khi thiết bị đang thực thi mà gọi hàm này thì lỗi sẽ xảy ra Nếu

chúng ta muốn đóng thiết bị giữa chừng thì đầu tiên chúng ta nên gọi hàm

waveOutReset trước khi đóng thiết bị Nhưng trước đó cũng cần gọi hàm

waveOutUnprepareHeader để unprepare tất cả các khối dữ liệu

Playing Waveform-Audio Files

Chúng ta có thể dùng các hàm sau đây để xuất dữ liệu dạng âm thanh ra

loa:

MessageBeep Xuất âm thanh dưới dạng thông báo của hệ thống

SndPlaySound Xuất âm thanh dưới dạng đăng ký trước trong hệ thống

Trang 29

Các hàm PlaySound và sndPlaySound sẽ nạp hoàn toàn nội dung file wave vào bộ

nhớ và xuất ra ngõ output Khả năng bộ nhớ của chúng có giới hạn nên chúng chỉ

quản lý được các nội dung dưới 100KB Khi làm việc với các file có nội dung lớn

hơn thì chúng ta có thể sử dụng các dịch vụ do MCI cung cấp

Sử dụng Windows message trong việc quản lý khi playback

Các Thông báo dưới đây có thể được sử dụng trong quá trình xuất dữ liệu:

MM_WOM_CLOSE Được gửi đi khi đóng thiết bị bằng hàm

waveOutClose MM_WOM_DONE Được gửi đi sau khi driver hoàn tất việc xuất dữ

liệu bằng hàm wafveOutWrite

MM_WOM_OPEN Được gửi đi khi thiết bị được mở bằng hàm

waveOutOpen

Các thông số wParam và lParam cũng rất cần thiết Thông số wParam luôn

luôn xác định handle của thiết bị waveform-audio Đối với thông số lParam, Thông

báo MM_WOM_DONE dùng thông số này trỏ tới cấu trúc WAVEHDR chỉ định sụ

hoàn tất của dữ liệu trong khi thông số này không được hai Thông báo còn lại

dùng Việc dùng này rất hữu hiệu, Thông báo MM_WOM_DONE sẽ là tín hiệu

được báo về sau khi việc playback khối dữ liệu hoàn tất Ta sẽ tiếp nhận Thông

báo này và giải phóng các biến có liên quan

Thay đổi volume của quá trình playback dữ liệu waveform audio

Chúng ta sẽ dùngcác hàm sau đây để lấy thông số volume cũng như thiết

lập các thông số này theo yêu cầu

WaveOutGetVolume Truy xuất mức volume của thiết bị xuất

WaveOutSetVolume Thiết lập mức volume cho thiết bị

Giá trị volume là một số doubleword Khi audio format là stereo, 16 bit cao

chỉ giá trị volume của channel phải và 16 bits thấp chỉ giá trị volume của channel

trái Còn nếu ở các thiết bị không hỗ trợ 2 kênh thì 16 bit thấp sẽ được sử dụng chỉ

giá trị volume còn 16 bit cao sẽ không dùng đến

Giá trị volume thay đổi từ giá trị 0x0 (silence) cho đến mức 0xFFFF

(maximum)

Trang 30

Chúng ta có thể sử dụng dịch vụ thu âm thanh theo chuẩn MCI Tuy nhiên

nếu thấy cần thiết, chúng ta có thể sử dụng các hàm thu âm thanh cấp thấp

Các thông số dữ liệu dưới đây sẽ đặc trưng cho dạng dữ liệu waveform

audio input

WAVEFORMATEX Cấu trúc của dạng dữ liệu được thiết bị input hỗ

trợ WAVEHDR Cấu trúc dùng làm header của khối dữ liệu input

Nó cũng được dùng khi xuất dữ liệu ra Output WAVEINCAPS Cấu trúc dùng dò hỏi các khả năng của thiết bị

input

Trước khi bắt đầu công việc thu dữ liệu, chúng ta phải dùng hàm

waveInGetDevCaps để dò hỏi khả năng cũng như xác định các thuôïc tính của thiết

bị Hàm sẽ trả về cấu trúc WAVEINCAPS xác định các thông số mong muốn

Opening Waveform-Audio Input Devices

Để thu dữ liệu, trước hết chúng ta dùng hàm waveInOpen để mở thiết bị

waveform input Nếu thực thi thành công, hàm sẽ trả về cho chúng ta handle của

thiết bị

Managing Waveform-Audio Recording

Sau khi mở thiết bị, chúng ta có thể tiến hành việc thu dữ liệu Dạng dữ liệu

waveform thu được sẽ được đưa vào buffer, buffer này được trỏ đến trong cấu trúc

WAVEHDR Trước khi được sử dụng, chúng ta phải prepare buffer này

Windows cung cấp cho chúng ta các hàm sau đây dùng thu dữ liệu waveform:

WaveInAddBuffer Gửi một buffer cho device driver, thiết bị sẽ

thu dữ liệu vào khối này WaveInReset Ngừng thu dữ liệu và đánh dấu tất cả các

buffer đã thu xong WaveInStart Bắt đầu thu dữ liệu

WaveInStop Kết thúc việc thu dữ liệu

Chúng ta dùng hàm waveInAddBuffer để gửi các khối buffer tới device

driver Khi dữ liệu được điền đầy vào buffer, ứng dụng sẽ được thông báo bằng

window Thông báo, callback Thông báo, thread Thông báo, hay event, tùy theo cờ

thông báo được chỉ định trong hàm open device

Trang 31

Trước khi bắt đầu thu dữ liệu, chúng ta phải gửi ít nhất một buffer dữ liệu

cho thiết bị input và khi đóng thiết bị, chúng ta gọi hàm waveInReset để đánh dấu

các buffer đã được thu xong

Using Window Messages to Manage Waveform-Audio Recording

Các Thông báo sau đây sẽ được dùng để quản lý việc thu dữ liệu dạng

waveform audio:

MM_WIM_CLOSE Được gửi đi khi thiết bị đóng lại khi gọi hàm

waveInClose MM_WIM_DATA Được gửi đi khi thiết bị thu đầy một buffer khi

gọi hàm waveInAddBuffer MM_WIM_OPEN Được gửi đi khi thiết bị được open khi gọi hàm

waveInOpen

Thông số lParam của MM_WIM_DATA là pointer trỏ đến cấu trúc

WAVEHDR để nhận dạng buffer dữ liệu Buffer có thể không chứa đầy dữ liệu vì

việc thu dữ liệu có thể kết thúc trước khi buffer được thu đầy Chúng ta có thể biết

được kích thước thật sự của dữ liệu bằng thông số dwBytesRecorded

Audio data block

Hàm waveInAddBuffer và waveOutWrite có thông số yêu cầu ứng dụng chỉ

định khối dữ liệu cần cho thiết bị sử dụng cho việc thu hay playback Các hàm trên

sử dụng cấu trúc WAVEHDR để miêu tả khối dữ liệu trên

Trước khi sử dụng các hàm trên để gửi khối dữ liệu cho thiết bị Chúng ta

phải cấp phát vùng nhớ cho khối dự liệu và khối header Khối header phải được

prepare và unprepare bằng các hàm sau:

WaveInPrepareHeader Prepare khối dữ liệu input

WaveInUnprepareHeader Unprepare khối dữ liệu input

WaveOutPrepareHeader Prepare khối dữ liệu output

WaveOutUnprepareHeader Unprepare khối dữ liệu output

Trước khi gửi khối dữ liệu cho driver input hay output, chúng ta phải prepare

chúng Sau khi thiết bị sử dụng xong, các khối dữ liệu phải được unprepare trước

khi giải phóng các vùng nhớ đã cung cấp

Khi kích thước dữ liệu lớn, chúng ta phải cung cấp các buffer liên tục cho

thiết bị, quá trình này phải diễn ra liên tục cho đến khi hoàn tất công việc và thiết

bị được đóng lại

Trang 32

Sử dụng các event callback

Chỉ định window hay thread nhận Thông báo gửi từ thiết bị

Xác định bit WHDR_DONE trong cờ dwFlags của cấu trúc WAVEHDR đi kèm với

mỗi khối dữ liệu

Khi ứng dụng không đáp ứng được tốc độ xử lý các buffer thì chiến lược

buffer kép có thể được đưa ra để tăng tốc độ thực thi

Chúng ta sẽ khảo sát một số phương thức xử lý sau khi thiết bị hoàn tất một

khối dữ liệu

Dùng hàm callback để xử lý các driver messages

Để chỉ định hàm callback xử lý ứng vớicác driver message, chúng tachỉ định

cờ CALLBACK_FUNCTION trong biến fdwOpen và địa chỉ hàm xử lý trong biến

dwCallback khi gọi hàm waveInOpen hay waveOutOpen

Messages gửi cho hàm callback tương tự như Thông báo gửi cho window,

ngoại trừ việc nó có hai thông số DWORD thay vì một thông số DWORD và một

thông số UINT

Để gửi dữ liệu cho hàm callback chúng ta có thể dùng một trong hai cách

sau:

Dùng thông số dwInstance trong hàm open device

Dùng field dwUser trong cấu trúc WAVEHDR để chỉ định khối dữ liệu gửi cho

device driver

Dùng event callback xử lý các driver message

Để dung event callback, chúng ta dùng hàm CreateEventđể truy xuất handle

của event Trong hàm open thiết bị, chỉ định cờ CALLBACK_EVENT cho thông

số fdwOpen Sau khi gọi hàm waveOutPrepareHeader nhưng trước khi gửi dữ liệu

cho thiết bị, chúng ta tạo ra một nonsignal event bằng cách gọi hàm ResetEvent,

chỉ định event handle được lấy từ hàm CreateEvent Trong vòng loop để kiểm tra

khi bit WHDR_DONE được set trong cấu trúc WAVEHDR, chúng ta gọi hàm

WaitForSingleObject, chỉ định thông số event handle và giá trị time-out là

INFINITE Giá trị event callback là giá trị dùng gọi hàm callback

Bởi vì event callback không xác định được thông báo xác định close, done

hay open Ứng dụng phải kiểm tra tình trạng của hệ thống đang chờ sự kiện gì xảy

ra để đưa ra các đáp ứng chính xác

Dùng window hay thread để xử lý các message driver

Trang 33

Để dùng hàm window callback, chúng ta chỉ định thông số CALLBACK_

WINDOW trong biến fdwOpen và chỉ định handle của window trong thông số

dwCallback khi gọi hàm open thiết bị Driver message sẽ được gửi tới window

procedure

Tương tự như vậy, chúngta sẽchỉ định thông số CALLBACK_THREAD và

thread handle trong hàm open khi chúng ta muốn thread xử lý các driver message

Ngoài cách thức dùng hàm callback, chúng ta có thể dựa vào thông số

dwFlags trong WAVEHDR để xác định xem thiết bị có hoàn tất việc xử lý khối dữ

liệu hay chưa

Các hàm kiểm tra lỗi

Các hàm waveform audio sẽ trả về giá trị khác 0 khi có lỗi xảy ra Windows cung

cấp cho chúng ta các hàm xác định lỗi dựa trên các thông số này Ứng dụng sẽ dựa

vào các thông số xác định lỗi để quyết định công việc thực thi tiếp tục Các hàm

sau được dùng để xác định các lỗi xảy ra:

WaveInGetErrorText Trả về chuỗi text xác định lỗi xảy ra của

input device WaveOutGetErrorText Trả về chuỗi text xác định lỗi xảy ra của

output device

IV.2 KỸ THUẬT TRUYỀN NHẬN ÂM THANH TRÊN MẠNG IP

IV.2.1 MÔ HÌNH LIÊN KẾT VÀ TRAO ĐỔI DỮ LIỆU

Chương trình dùng giao thức TCP/IP làm giao thức giao tiếp Việc thiết lập

liên kết cũng như trao đổi dữ liệu đều tuân theo các cấp của giao thức này Việc

gọi và thiết lập liên kết được thực hiện theo mô hình client/server, việc trao đổi dữ

liệu được thực hiện thông qua socket theo giao thức TCP

Có hai ý tưởng được đưa ra trong việc dùng socket để trao đổi dữ liệu

Dùng 1 socket :

Mỗi máy dùng một socket để truyền nhận dữ liệu Theo giao thức TCP sau

khi hai socket connect được với nhau thì việc tiến hành trao đổi dữ liệu sẽ bắt đầu

Chúng ta sẽ dùng cặp socket này Như vậy, một socket trên một máy đồng thời

đảm nhận việc truyền dữ liệu đi cũng như nhận dữ liệu về.[3]

Trang 34

Hình IV.1 Mô hình dùng 1 socket

Cách dùng này có đặc điểm là việc tạo liên kết đơn giản, quá trình tạo liên

kết hoàn toàn giống như các bước trong việc tạo liên kết giữa các socket dùng giao

thức TCP Chương trình chạy và lắng nghe ở một port xác định Khi có một yêu

cầu gọi liên kết đến, chương trình sẽ tạo ra một socket để nối kết với socket gọi

Sau khi thiết lập liên kết thì các socket bắt đầu gửi nhận dữ liệu Socket sẽ gửi dữ

liệu âm thanh đi đồng thời nhận dữ liệu truyền tới và chuyển cho hệ thống xử lý

Socket làm việc theo cách này sẽ nhận hai thông báo cùng một lúc Khi có

dữ liệu từ mạng truyền tới, hệ thống sẽ thông báo cho socket để tiến hành việc

nhận dữ liệu Cũng tương tự như vậy, khi có dữ liệu âm thanh sẵn sàng, hệ thống

cũng sẽ gọi socket để truyền đi

Như vậy, khi thực thi socket sẽ nhận được hai thông báo của hệ thống Vì

việc truyền nhận dữ liệu âm thanh là dạng dữ liệu liên tục cho nên tần suất mà hệ

thống thông báo cho socket là rất thường xuyên Vì vậy, socket trong cùng một lúc

có thể nhận được cả hai yêu cầu truyền dữ liệu đi và nhận dữ liệu về Thêm vào

đó các hoạt động truyền nhận dữ liệu là các hoạt động bị tắc nghẽn Do đó chúng

ta phải lưu ý đến hiện tượng này, socket có thể đáp ứng không kịp nhu cầu của hệ

thống

Chúng ta lấy một trường hợp ví dụ Khi socket nhận được yêu cầu truyền dữ

liệu đi, nó sẽ lấy dữ liệu từ các buffer và truyền đi Do quá trình truyền dữ liệu có

thể bị tắc nghẽn, socket sẽ phải chờ Đồng thời trong lúc này, nó lại nhận được tín

hiệu thông báo có buffer kế tiếp cần truyền đi và tín hiệu thông báo có dữ liệu

trên mạng truyền về Với các yêu cầu dồn dập như vậy, hệ thống có thể sẽ đáp

ứng không kịp và chương trình có thể bị treo

Vì vậy, khi dùng một socket để truyền nhận dữ liệu, chúng ta phải tính toán

cân đối thời gian giữa việc truyền dữ liệu đi và việc nhận dữ liệu về sao cho hợp lý

để hệ thống có thể làm việc liên tục được Chúng ta có thể qui định thời gian cho

việc truyền nhận Trong một thời điểm socket có thể chỉ làm việc truyền dữ liệu

đi, các yêu cầu nhận dữ liệu sẽ bị ngưng lại Sau đó socket sẽ chỉ xử lý các yêu

cầu nhận dữ liệu Chiến lược này giúp giảm nhẹ hoạt động của socket Tuy nhiên,

chúng ta cần áp dụng cho cả hai socket liên kết Trong một thời điểm, một socket

sẽ truyền còn socket còn lại sẽ nhận dữ liệu, và thời điểm sau thì quá trình sẽ diễn

ra theo chiều ngược lại

Dùng 2 socket :

Xuất phát từ ý tưởng trên, chúng ta có thể dùng hai socket trong việc trao

đổi dữ liệu Một liên kết hình thành giữa hai máy sẽ gồm hai cặp socket liên kết

với nhau Một socket chỉ đảm nhận việc truyền dữ liệu trong khi socket còn lại

đảm nhận việc nhận dữ liệu.[3]

Ngày đăng: 02/12/2015, 12:27

HÌNH ẢNH LIÊN QUAN

Hình I.3 : Mô hình Điện thoại – Điện thoại - Xây dựng ứng dụng truyền thông âm thanh
nh I.3 : Mô hình Điện thoại – Điện thoại (Trang 4)
Hình II.6  Sơ đồ giao tiếp của client với server - Xây dựng ứng dụng truyền thông âm thanh
nh II.6 Sơ đồ giao tiếp của client với server (Trang 12)
Hình III.2 a.Đặc tuyến lượng tử hoá;b.Đặc tuyết sai số lượng tử; c.VD lượng tử đều - Xây dựng ứng dụng truyền thông âm thanh
nh III.2 a.Đặc tuyến lượng tử hoá;b.Đặc tuyết sai số lượng tử; c.VD lượng tử đều (Trang 17)
Hình treân. - Xây dựng ứng dụng truyền thông âm thanh
Hình tre ân (Trang 35)

TỪ KHÓA LIÊN QUAN

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