Кратко

  • RFC 3558 позволяет разнести соседние кадры EVRC или SMV по нескольким RTP-пакетам. Потеря одного пакета тогда создаёт несколько несмежных стираний вместо одного непрерывного провала.
  • Нулевой по длине erasure frame сохраняет временной шаг декодера, но не доказывает восстановление фонемы, числа или команды. Карта стираний должна оставаться рядом с любым выводом о качестве или действии приложения.

У непрерывности есть опасная репутация: если система не остановилась, кажется, будто она справилась. Для речевого декодера это неверный вывод. Состояние может продвигаться точно по времени, даже когда часть источника безвозвратно отсутствует.

RFC 3558 опубликован в июле 2003 года как Proposed Standard и описывает RTP payload для EVRC и SMV. Оба вокодера работают кадрами по 20 миллисекунд. Формат Interleaved/Bundled умеет распределять соседние кадры по последовательным пакетам. Потеря пакета перестаёт совпадать с одним сплошным отрезком речи.

Стандарт меняет форму ущерба. Он не создаёт резервную копию речи.

Три разных вида отсутствия

Для точного отчёта нужно разделить как минимум три состояния. Пакет может не прийти вообще. Принятый payload может оказаться повреждённым или недопустимым. Наконец, кодек может не выдать кадр — это представляется null frame, который обычно не передаётся.

Erasure frame относится к первым двум случаям на стороне приёмника: он заменяет потерянный или повреждённый кадр. Его длина равна нулю. Декодер получает указание продвинуть внутреннее состояние на один интервал, а не набор битов исходной речи.

Поэтому слова «кадр обработан» двусмысленны. Обработано могло быть именно стирание. Следует хранить тип позиции, причину замены, исходный пакет, дедлайн и поведение декодера. Null и erasure нельзя сводить к общей категории тишины: у них разные причины и разные владельцы.

Interleaving оставляет контекст между пропусками

Первый октет формата содержит трёхбитные LLL и NNN: длину interleaving и индекс пакета в группе. Во втором находятся Mode Request и пятибитный Frame Count. Счётчик хранит число кадров минус один, поэтому диапазон составляет от одного до 32.

При LLL=0 кадры только объединяются. При положительном LLL значение NNN не должно его превышать. Если пакет несёт B кадров, а длина равна L, группа охватывает B×(L+1) временных позиций в L+1 RTP-пакетах. Пакет N содержит позиции N, N+(L+1) и следующие с тем же шагом.

Если такой пакет исчезает, стирания разделяются принятыми кадрами из других пакетов. Для многих речевых декодеров это лучше длинной непрерывной серии пропусков. Но результат зависит от рисунка потерь, алгоритма concealment и содержания речи. Стандарт не обещает измеримого качества конкретному разговору.

Любая оценка разборчивости должна включать карту временных позиций. Одинаковая доля потерь может повредить паузу или ключевую цифру — для приложения это разные исходы.

Порядок отправки не завершает временной ряд

Пакеты идут по возрастающему NNN, чтобы уменьшить задержку приёмника. Но кадры внутри них относятся к разнесённым моментам. Сетевой порядок и порядок подачи в декодер различны.

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

За политику отвечает локальная система: jitter buffer, планировщик, интерфейс декодера и цель сервиса. Полезная запись выглядит так: пакет P принят во время T; F1 уже заменён стиранием; F2 и F3 ещё приняты; действовала политика V.

Метка «пакет доставлен» не доказывает, что все его кадры использованы. Метка «пакет потерян» тоже неверна, если часть удалось спасти.

maxinterleave ограничивает отправителя, а не физику приёмника

Приёмник сообщает максимальный допустимый L через maxinterleave; при отсутствии параметра действует значение пять. В сеансе один к одному отправитель не должен превышать потолок. Приёмник может уменьшить его во время сеанса.

Потолок позволяет вычислить наибольший ожидаемый объём состояния. Он не подтверждает реальное выделение памяти, её доступность под нагрузкой, синхронное применение нового значения или завершение групп до playout.

maxptime отдельно ограничивает длительность медиа в пакете; стандартное значение здесь 200 миллисекунд. Первый параметр ограничивает расстояние распределения, второй — объём объединения. Итоговую задержку определяют B, L, jitter, reorder depth, занятость буфера и расписание декодера.

В журнале должны вместе жить offer, answer, время вступления, первая соответствующая группа, версия packetizer, выделенные байты, максимум занятости и ранние закрытия. Запись в SDP — заявление о способности, не телеметрия ресурса.

Header-Free отказывается от группы

Формат Header-Free переносит один кодековый кадр без ToC и interleave header. Ему не нужна групповая реконструкция, поэтому ожидание packetization и путь к декодеру короче. Цена — больше RTP-, UDP- и IP-заголовков на секунду речи.

RFC 3558 рекомендует LLL=0 или Header-Free для интерактивных применений, а четыре или пять — когда устойчивость к потерям важнее задержки. Это не шкала совершенства. Выбор называет дефицитный ресурс: полосу, память, время диалога или переносимость burst loss.

RFC 2508 и RFC 3095 показывают, что header compression может изменить цену маленьких пакетов. Наличие функции не доказывает, что её контекст оставался синхронным на наблюдаемом пути.

Mode Request не является подтверждением

Mode Request просит кодировщик обратного направления применить режим. В сеансе один к одному запрос рекомендуется учитывать; в многостороннем — игнорировать. Повторение защищает запрос от единичной потери.

Повтор не подтверждает исполнение. Следует отдельно хранить запрос, попытки, приём, решение кодировщика и первый кадр, который показывает новый режим. Иначе отправленное намерение превращается в вымышленный результат.

Та же граница действует для interleaving: объявленная способность, выбранная настройка и наблюдаемый поток — разные факты.

Недопустимый payload создаёт другой инцидент

ToC задаёт типы и размеры кадров. Несогласованные LLL, NNN, счётчик или фактические байты могут привести к отбрасыванию пакета и стираниям. Для декодера результат похож на сетевую потерю, однако устранять его должен другой владелец.

Никогда не пришёл, пришёл поздно, пришёл недопустимым, содержит неподдерживаемый тип и вытеснен локально — отдельные причины. Общая метрика packet loss скрывает поверхность управления и награждает не ту команду.

RFC 4788 позднее обновил семейство: EVRC-B, Compact Bundled, DTX, регистрации и offer/answer. Это последующий нормативный контекст, а не доказательство свойств конкретной реализации RFC 3558.

Граница доказательств

Статья не называет оператора, устройство, вызов, пользователя, инцидент, измеренную долю потерь, выделенную память или результат прослушивания. Примеры объясняют механизм стандарта и не сообщают о production-событии.

RFC 3550 и RFC 3551 задают рамку RTP. RFC 3264 относится к offer/answer; RFC 2327 был контекстом SDP при публикации, RFC 8866 — более поздний статус. RFC 2508 и RFC 3095 описывают compression, RFC 8174 уточняет нормативный язык. RFC 4788 — явно отделённое обновление.

Эссе Heng Lu Running-Code Primacy и Minimum Initial Specification раскрыты как редакционные линзы. Они мотивируют отделять записанную возможность от исполняемого доказательства и сохранять общий минимум меньше локальных будущих решений. Они не доказывают намерение авторов RFC или сетевое событие.

Ограниченный вывод точен: interleaving RFC 3558 может разнести по времени ущерб от одного потерянного пакета. Erasure frame помогает декодеру продолжить временной ход, но только карта источника и результата показывает, что именно осталось неизвестным.

Sources