Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
92.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
100.76 Кб
Скачать

Структура пакета

В одном пакете необходимо передавать его номер, символьное имя файла, и непосредственно данные.

Пакет выглядит следующим образом:

Символьное имя файла

Номер пакета

Аудиоданные

Под имя файла выделяется 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 мс.

Алгоритм работы программы

  • При запуске программы инициализируется работа с сокетами и работа со звуком.

  • При нажатии пользователя кнопки начала отправку открывается звуковой файл для чтения и включается таймер на отправку.

  • При нажатии кнопки остановки передачи останавливается таймер передачи

  • При срабатывании таймера передачи читается семпл из звукового файла, создается сообщение для отправки по сети и происходит отправка.

  • При нажатии кнопки начала прием запускается таймер на прием.

  • При нажатии кнопки остановки приема этот таймер останавливается

  • При срабатывании таймера ан прием принимается сэмпл, из него выделяются аудиоданные и записываются в очередь воспроизведения, после чего проверяется, что таймер на воспроизведение включении, и, если это не так, происходит его включение.

  • При срабатывании таймера на воспроизведения один сэмпл читается из очереди воспроизведения и выводится на устройство вывода.

При возникновении ошибок в любом из пунктов выводится сообщение об ошибке в соответствующее поле

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]