Имеется вокодер(Speex), выдаёт он по 20байт на каждый фрейм. Необходимо обеспечить передачу по низкоскоростному каналу и защититься от выпадения байтов. Достаточно просто определения самого факта выпадения и отбрасывания всего 20ти байтового пакета(скормив декодеру вместо него предыдущий правильный). Проблема у меня с созданием метки, по которой определялись бы границы пакетов - ведь данные идут в RAW и там могут встречаться(теоретически) любые последовательности! Избыточность должна быть минимально возможной(канал не резиновый).
Что делать? Допустим, прикрутить CRC16 не проблема, но меня смущает возможность такого сценария: Передатчик передаёт, а приёмник принимает данные в буфер(20байт) до его заполнения. По заполнению буфера, приёмник считает, что фрейм вокодера принят и отправляет его на декодинг НО ведь на самом деле к этому моменту передатчик мог передать уже 21байт и к премеру где-то посередине байт выпал и последний байт буфера приёмника уже будет содержать первый байт следующего фрейма. Точно такая-же проблема может возникнуть при использовании CRC.
Нужны какие-то признаки начала фрейма. Чтобы приёмник мог отреагировать, если наткнётся на признак начала пакета ДО заполнения буфера. Как быть??
Может быть есть какие-то особенности Speex, о которых я не знаю(может быть какие-то коды он не использует). Была мысль для уменьшения вероятности собрать статистику по кодам(двух байтовым комбинациям) и использовать самую редко попадающуюся, но решение, мягко говоря тупое. Также думал о замене некой последовательности на другую(заранее определённую) для того, чтобы "освободить" эту последовательность под код начала фрейма(но вот та заранее определённая,опять таки встретится в потоке и всё).Но тоже всё это как-то не очень красиво...
Нет идей больше, а это самое плохое, что может быть:-)
--------------------
The truth is out there...
|