- •Курсовая Работа
- •Разработка прикладного протокола передачи и приём звукового файла
- •Цель курсового проекта.
- •Задание на курсовое проектирование
- •Решение
- •Структура пакета
- •Буфер и таймеры
- •Алгоритм работы программы
- •Описание программы
- •Инициализация
- •Посылка одного блока данных
- •Функция приема блока
- •Функция воспроизведения блока
Структура пакета
В одном пакете необходимо передавать его номер, символьное имя файла, и непосредственно данные.
Пакет выглядит следующим образом:
Символьное имя файла |
Номер пакета |
Аудиоданные |
Под имя файла выделяется 10 байт, еще 4 байта под переменную типа int для номера пакета. Для данных по заданию необходимо было выделить 192 байт.
При кодировании звука 8 кГц по 8 бит на один отсчет для кодирования 1 секунды необходимо 8*8*1000 = 64000 бит = 8000 байт. Если размер одного звукового семпла будет 192 байт, то один семпл будет нести в себе 1/(8000/192) с = 0,024 с = 24 мс. На достаточно мощном ПК обработка и передача семпла каждые 24 мс может быть возможна, но чтение данных из файла с такой скоростью не является возможным, т.к. работа с жестким диском является достаточно длительным процессом. Большое количество времени занимает подготовка к чтению, поэтому если читать из файла большими блоками, но с меньшей частотой, то от данной проблемы можно избавиться. Если оставить размер семпла 192 байт, то большинство семплов не успеет считаться из файла, а вместо них отправится «мусор» и при воспроизведении возникнет трещащие(треск и есть «мусор»). Опытным путем было выяснено, что если увеличить размер семпла в 50-55 раз, то от треска можно избавиться практически на 100%. В данной программе размер аудиоданных был принят равным 192*50 = 9600 байт.
Буфер и таймеры
В предыдущем пункте мы определили, что один семпл из 192 байт несет в себе 24 мс аудиоданных. Мы же используем семплы по 9600 байт, что значит, что каждый сэмпл несет в себе 1200 мс аудиоданных.
Для устранения джиттера на принимающей части должна быть организована очередь из некоторого количества элементов, в которой будут храниться данные между приемом и воспроизведением. По заданию буфер должен хранить 14 семплов. Это означает, что задержка при воспроизведении будет 1200*14=16800 мс = 16,8 с, что для передачи файла вполне приемлемо. Длина буфера получается 9600*14 = 134400 байт.
Для осуществления считывания из файла и посылки семпла в сеть, приема, воспроизведения необходимо организовать 3 таймера. Таймеры должны срабатывать через определенное количество времени, которое определяется длительностью семпла. В нашей задаче период таймер должен быть примерно 1200 мс. Более точно определить период необходимо экспериментально, т.к. существует небольшая погрешность, как в расчетах, так и при работе программы при относительно небольших значениях периода таймеров. Для определения периода в программе была добавлена возможность динамического изменения периода таймеров. Экспериментально получили период, равный 1270 мс.
Алгоритм работы программы
При запуске программы инициализируется работа с сокетами и работа со звуком.
При нажатии пользователя кнопки начала отправку открывается звуковой файл для чтения и включается таймер на отправку.
При нажатии кнопки остановки передачи останавливается таймер передачи
При срабатывании таймера передачи читается семпл из звукового файла, создается сообщение для отправки по сети и происходит отправка.
При нажатии кнопки начала прием запускается таймер на прием.
При нажатии кнопки остановки приема этот таймер останавливается
При срабатывании таймера ан прием принимается сэмпл, из него выделяются аудиоданные и записываются в очередь воспроизведения, после чего проверяется, что таймер на воспроизведение включении, и, если это не так, происходит его включение.
При срабатывании таймера на воспроизведения один сэмпл читается из очереди воспроизведения и выводится на устройство вывода.
При возникновении ошибок в любом из пунктов выводится сообщение об ошибке в соответствующее поле
