Gateway được sử dụng ở cả hai đầu để chuyển đổi dữ liệu giữa các mạng với nhau.[1] 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
Trang 1LỜ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.
Trang 2Mụ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 Chương V : Thiết kế chương trình truyền tiếng nói qua mạng LAN thông qua sự trợ 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 3CHƯƠNG I TÌM HIỂU MÔ HÌNH ĐIỆN THOẠI QUA MẠNG
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ầnmề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ònthuê bao kia sử dụng điện thoại trong mạng PSTN/ISDN/GSM/TDM Sử dụng mộtgateway để chuyển tiếng nói trên mạng IP thành tiếng nói trên mạng PSTN và trao đổithô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ếtnối với mạng PSTN thông qua Geteway
Trang 4Hì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]
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 thanhtrê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ìnhnghiê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ó đơngiả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ềuquan 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ươngtrì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ếtnố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
PSTN
Trang 5đế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ếngnó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 chophé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ữutuyế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ênmô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ậpliê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ườikhác muốn nói chuyện Tùy theo người đó quyết định có chấp nhận hay không Nếuchấ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 tinvớ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ềnnhận trong chương trình là dữ liệu dạng liên tục của âm thanh cho nên có 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 tinphả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ệcxâ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) hayhai kênh (stereo) Do đó chúng ta phải tổ chức kích thước buffer âm thanh sao chophù 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ềnnhậ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
Trang 6lượ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 chongườ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 servermạ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 trangthiết bị để thử nghiệm Bởi vậy trong đồ án này em chỉ nghiên cứu cách thức truyềntiếng nói trên mạng nội bộ
Trang 7CHƯƠNG II KHẢO SÁT CÁC GIAO THỨC TRUYỀN THÔNG
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 (InternetProtocol) Tên hay địa chỉ IP đều xác định duy nhất một máy trong hệ thống mạngInternet 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êngcho kỹ thuật Multicasting và được sử dụng trong các giao thức đặc biệt để truyềnthô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ụngtrong tương lai.[5]
Hình II.1 Các lớp đại chỉ IP
Trang 8Hình II.2 TCI/IP và mô hình OSI
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ượngmạ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
Trang 9Socket là một đơn vị cấu trúc truyền thông 2 chiều Chúng có thể đọc hay ghilê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ênmạ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ácdị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]
Những socket stream dùng cho TCP (Transmission Control Protocol), nhữngsocket datagram dùng UDP (User Datagram Protocol)
Trang 1042 Host name server
49 Login host protocol
53 Domain name server
80 World wide web HTTP
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 khitruyề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à internetdatagram từ địa chỉ nguồn đến địa chỉ đích Đây là một giao thức theo kiểu không liênkế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ũngkhô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ểnluồ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ệnnhờ 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 chialà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
Trang 11Giao thức TCP là giao thức dùng cho tầng ngay trên tầng IP Đối với mô hìnhOSI, 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ầngphiên
Khác với IP, TCP là giao thức có liên kết (connection oriented), nghĩa là nhấtthiế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ộtcá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 tratí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ặptham 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ếntrì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ộtcổ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úngthiế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ảiphòng
Mỗi ứng dụng TCP gồm hai phần là client và server
Lưu đồ sau minh họa các bước cần thiết để các ứng dụng client và server giao tiếp vớinhau :
Trang 12Hì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ụngchuẩ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ọihàm accept để xác nhận mối nối của client
Trang 13Gọi các hàm gửi hay nhận dữ liệu để trao đổi thông tin với client, ví dụ send,recv.
Sau khi đã hoàn tất quá trình trao đổi dữ liệu, ứng dụng server gọi hàmclosesocket để đóng socket đã tạo
Trang 14
Hình II.5 Sơ đồ giao tiếp giữa server với client
II.2.2 CÁCH THỨC CÀI ĐẶT ỨNG DỤNG CLIENT TCP
Ứ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àmclosesocket để đóng socket đã tạo
Trang 15Hình II.6 Sơ đồ giao tiếp của client với server
Ghi chú:
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ênWindows NT và UNIX Tuy nhiên, với ứng dụng viết trên UNIX thì không cần gọicá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ửithô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ầncá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 ứngdụng chuẩn thì sẽ có một hằng số được định nghĩa sẵn trong winsock choport 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àmclosesocket để đó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
Trang 16- 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àmclosesocket để đó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 SocketDLL và hàm WSACleanup để đóng thư viện này Tuy nhiên, đối với ứng dụng viếttrên UNIX thì bộ phận quản lý socket đã được hệ điều hành nạp sẵn và do đó khôngcần gọi các hàm như WSAStartup, WSACleanup của Windows NT
Trang 17CHƯƠNG III PHƯƠNG PHÁP MÃ HOÁ VÀ NÉN ÂM THANH
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àycho 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ầnnghe được Tuy nhiên trong một ứng dụng đặc biệt như truyền dữ liệu âm thanh trênmạ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ácloại dữ liệu số thường được gọi là codec(Coder-Decoder) Có thể phân loại cácphươ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ủasó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ấtlượ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ấtlượ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ínhiệu âm thanh có chất lượng tốt ở tốc độ dữ liệu trung bình
Trang 18Hình III.1 Biểu đồ so sánh các phương pháp mã hoá
Phương pháp điều biên xung mã vi phân (DPCM) dự đoán giá trị hiện tại dựavà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ệucần mã hoá ADPCM hoạt động tốc độ 32 kbps cho chất lượng tương đối với PCM 64kbps
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ínhiệ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 đitheo 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ácmẫ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ã
Trang 19Như 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ổnghợ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áchtiế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ántuyế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 âmthanh 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 khiVocoder 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ễutrắng để tạo ra âm hữu thanh hay vô thanh, AbS sử dụng một dãy các trạng thái đượclưu trữ trong codebook Khi xem xét một khung âm thanh, AbS kiểm tra khung đó vớirấ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 đó tracodebook 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 theocá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 đềuphả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ệnTiêu Chuẩn Viễn Thông Châu Au ETSI để ra Đầu vào của bộ nén GMS 06.10 baogồ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 giannày cho phép được coi tín hiệu âm thanh ổn định Độ trễ truyền dẫn thông tin đượctí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àomộ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 gianchưa đầy 10 phút.[4]
Trang 20Trung 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ộcrấ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ọcngắ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ầngcuố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ándà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 s ≥2 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ềunà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ềudà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ỗixung biên độ – thời gian được lọc thông thấp với một bộ lọc có dải tần 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àntoà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ệntrong 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 :
Trang 21
= ∆
1)
(E
-22
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)
Trang 22Ví dụ, cho bộ lượng tử có khoảng biên độ từ – 4Xrms đến + 4Xrms( để thuậntiệ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ằnghàm Gaussian trung bình – không, thì các mẫu tín hiệu sẽ rơi bên ngoài khoảng8Xrms 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 /28
=
Từ (3) và (4) ta có :
SNR(dB)=10log10 SNR=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ínhiệ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ệutrong 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íchhợ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ôngtruyề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 * 8bits/ mẫu = 64 Kbits/giây để truyền dữ liệu qua mạng Do đó, tùy theo tốc độ đường
Trang 23truyề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 khitruyề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 đếnmá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 ảnhhưở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 quacá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éntiế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 thanhthường được dùng nhất để giảm băng thông là GSM và ADPCM.[2]
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ữngphươ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ảithuậ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ếntí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 ramộ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ếntính thành các frames GSM, hoặc giải mã các frames GSM thành các frames PCMtuyế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énGSM , 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
Trang 24III.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ướckhi 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 đượcnhậ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 :
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ốngnhau, vì thế thay vì biểu diễn mỗi mẫu độc lập như PCM ADPCM tính toán sự chênhlệ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ânPCM Có nhiều giải thuật ADPCM khác nhau được đề nghị Trong phạm vi luận vănnày em tìm hiểu và ứng dụng giải thuật đưa ra bởi IMA (Interactive MultimediaAssociation)
Giải thuật IMA ADPCM nén những mẫu PCM tuyến tính thành các mức lượnghó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,
Trang 25kê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ậtIMA_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ằngcá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óinê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ủachươ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 :
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ìnhlượ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ệchgiữa X[n] và Xp[n-1] là lớn hơn hay bằng step_size Sau đó step_size được chia 2 và
Trang 26so 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íchthướ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àilê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ộtlầ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ệchmới và thiết lập giá trị cho bit một tương tự như các bước trước.
CHƯƠNG IV
Trang 27TÌM HIỂU HỖ TRỢ CỦA WINDOWS SDK TRONG XỬ LÝ VÀ TRUYỀN NHẬN ÂM THANH
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ướiWindows, 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ộtcách thức đơn giản nhất trong việc xuất dữ liệu waveform ra loa là dùng hàmPlaySound Chúng ta có thể thao tác với dạng dữ liệu waveform bằng các hàm cấpthấ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ậptrình giao tiếp dễ dàng hơn với thiết bị, đó là các hàm MCI.[6]
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àmmultimedia của windows là các file RIFF ( Resource Interchange File Format) Mộtfile 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: Typedef struct {
Trang 28phí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.
IDSIZEFROM TYPE
Typedef struct waveformar_tag{
nChannels : Của đối tượng WAVEFORMAT có 2 giá trị :
Trang 29 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átcù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:
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 1bytes
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 âmthanh file wave, để định nghĩa số bits trong một mẫu ta dùng cấu trúc sau:
Typedef struct pvmwaveformat_tag{
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ị 1byte 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 bytes.[6]
Để làm việc với một file RIFF bao gồm các bước sau :
Mở file
Vào chunk cần thiết
Chuyển con trỏ file vào vị trí bắt đầu dữ liệu của chunk
Trang 30Hoà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àmPlaySound
Hàm PlaySound cho phép chúng ta chỉ định các thông số nguồn âm thanh theocác cách sau:
• Dùng tên alias khai báo trong file WIN.INI
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 Am thanh dạngnày được gọi là sound events
Để xác định sound event, hàm PlaySound sẽ được gọi với thông số pszSoundtrỏ đến bảng đăng ký sự kiện Ví dụ chúng ta sẽ gọi hàm PlaySound ứng với sự kiệnmouse 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áchà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ấutrúc cấp thấp này đều có prefix là wave.[6]
Trang 31Thiế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áctí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ệudạng waveform Hàm sẽ mở thiết bị waveOut và trả handle về cho ứng dụng Hệthống multimedia sẽ hỗ trợ nhiều dạng output dữ liệu khác nhau do đó khi mở thiết 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
waveform audio sẵn có trong hệ thốngWaveOutGetNumDevs 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ìmkhả 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
Trang 32WaveOutGetDevCaps Truy xuất khả năng của thiết bị xuất dạng
waveformCá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ê ở trên:
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
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áchà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/ inputWAVEHDR 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
Trang 33Chỉ đị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àmwaveOutWrite Hàm sẽ gửi khối dữ liệu âm thanh ra thiết bị xuất Chúng ta dùng cấutrúc WAVEHDR để chỉ định header của khối dữ liệu được gửi ra Header này gồmcon 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ấtviệ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ửikhố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ấymẫ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 bitkhô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ấtcũng như giá trị trung bình của dữ liệu PCM:
Data format Maximum value Minimum value Midpoint value
Trang 34PCM waveform Chức năng
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 để đóngthiế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 tamuốn đóng thiết bị giữa chừng thì đầu tiên chúng ta nên gọi hàm waveOutReset trướckhi đó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
hay là nội dung của một file wavePlaySound Giống như hàm trên và thêm cơ chế truy xuất trực tiếp tài
Trang 35Cá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
waveOutCloseMM_WOM_DONE Được gửi đi sau khi driver hoàn tất việc xuất dữ liệu
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ậpcá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ị
Trang 36Giá 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)
Recording Waveform Audio
Chúng ta có thể sử dụng dịch vụ thu âm thanh theo chuẩn MCI Tuy nhiên nếuthấ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 audioinput
HWAVEIN Handle của thiết bị 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 OutputWAVEINCAPS 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àmwaveInGetDevCaps để 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ệuwaveform thu được sẽ được đưa vào buffer, buffer này được trỏ đến trong cấu trúcWAVEHDR Trước khi được sử dụng, chúng ta phải prepare buffer này
Trang 37Windows 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àyWaveInReset Ngừng thu dữ liệu và đánh dấu tất cả các
buffer đã thu xongWaveInStart 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 windowThô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
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 chothiết bị input và khi đóng thiết bị, chúng ta gọi hàm waveInReset để đánh dấu cácbuffer đã đượ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ạngwaveform audio:
MM_WIM_CLOSE Được gửi đi khi thiết bị đóng lại khi gọi hàm
waveInCloseMM_WIM_DATA Được gửi đi khi thiết bị thu đầy một buffer khi gọi
hàm waveInAddBufferMM_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úcWAVEHDR để 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
Trang 38Audio 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ảicấ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 preparechúng Sau khi thiết bị sử dụng xong, các khối dữ liệu phải được unprepare trước khigiả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
Ứng dụng phải xác định và quản lý thời điểm mà thiết bị hoàn tất việc thự thitrên các khối dữ liệu để đưa ra các tác động thích hợp Các cách sau đây được đưa ra:
Chi định hàm callback nhận Thông báo mà thiết bị gửi khi nó hoàn tất một khối
dữ liệu
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ớimỗ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 bufferkép có thể được đưa ra để tăng tốc độ thực thi
Trang 39Chú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ộtkhố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ếndwCallback 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ộtthô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 chodevice 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 handlecủ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 chothiết bị, chúng ta tạo ra một nonsignal event bằng cách gọi hàm ResetEvent, chỉ địnhevent handle được lấy từ hàm CreateEvent Trong vòng loop để kiểm tra khi bitWHDR_DONE được set trong cấu trúc WAVEHDR, chúng ta gọi hàmWaitForSingleObject, 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 hayopen Ứ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
Để 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ố
Trang 40dwCallback khi gọi hàm open thiết bị Driver message sẽ được gửi tới windowprocedure
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ố dwFlagstrong WAVEHDR để xác định xem thiết bị có hoàn tất việc xử lý khối dữ liệu haychư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ấpcho 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àocá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 đượcdù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 deviceWaveOutGetErrorText 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ậpliê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 đượcthự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 khihai socket connect được với nhau thì việc tiến hành trao đổi dữ liệu sẽ bắt đầu Chúng