Проект флуктуационного буфера и повторная буферизация
Реализация флуктуационного буфера также усложняет программное обеспечение передачи данных в реальном времени. Какие структуры данных должны для этого использоваться? В случае применения кодировок выборок, по-видимому, наиболее подходящей для этого структурой данных является циклический буфер, поскольку поступающие данные можно вставлять в его конце одновременно с тем, как приложение извлекает данные с начала буфера. Кроме того, между адресом позиции в буфере и отметкой времени при использовании кодировок выборок можно легко установить соответствие, поскольку позиция в буфере может быть связана со значением отметки времени с помощью линейной функции. Поэтому циклический буфер хорошо приспособлен для неявного управления временем. Безусловно, для обеспечения компенсации флуктуации, воспроизведение не должно начинаться до тех пор, пока буфер не заполнится свыше минимального порогового уровня.
Но циклические буферы имеют и свои недостатки. Данные должны копироваться в буфер при поступлении каждого пакета, а затем они должны копироваться вновь для доставки в приложение. Кроме того, циклический буфер не очень подходит для многих кодировок кадров. Такие кодировки часто предусматривают добавление заголовков к данным. Если заголовки хранятся отдельно от данных, то многие преимущества циклического буфера теряются. А если заголовки хранятся в том же циклическом буфере, то поиск данных, соответствующих определенному времени, становится затруднительным. В связи с этим во многих приложениях предусматривается ведение списка пакетов вместо сопровождения циклического буфера. Как выбрать пластиковые окна - рехау окна. Особенности установки окон.
Сложность управления буфером во многом также связана с тем, что протокол RTP позволяет отправителю изменять кодировку или размер пакетов динамически. Например, если передаваемый звуковой сигнал становится неразборчивым, то отправитель может переключиться на кодировку, предусматривающую применение большего числа битов в расчете на каждую выборку. Однако при возникновении такого изменения получатель также должен изменить размер своего буфера. Кроме того, отправитель должен изменить применяемый способ буферизации, если часы на компьютерах отправителя и получателя не идут с абсолютно одинаковой скоростью (т.е. разница между их показаниями постепенно растет). Если часы компьютера получателя идут немного быстрее по сравнению с часами отправителя, такое расхождение в конечном итоге приведет к тому, что поступающие пакеты со временем станут казаться устаревшими. Таким образом будет создаваться впечатление, что время, в течение которого должно начаться воспроизведение одного из пакетов, уже прошло.
Хотя такие ситуации, как смена кодировки или постепенное расхождение показаний часов, встречаются редко, их все же надо учитывать, и поэтому код библиотеки общего назначения усложняется. Чтобы иметь возможность справиться с этими проблемами, получатель должен быть готов выполнить повторную буферизацию данных. Для этого он должен переопределить соответствие между показаниями часов локального компьютера и значениями поля для отметок времени, а затем откорректировать положение указателя в буфере воспроизведения в соответствии с новыми данными о соотношении времени. Повторная буферизация может предусматривать уничтожение данных, находящихся в буфере, блокировку приложения-получателя до момента поступления данных или внесение небольшой поправки в значение адреса точки воспроизведения без изменения данных в буфере.