Я использую OPUS с avcodec для кодирования звуков и потоковой передачи по собственному протоколу.
Пока он работает с кодеком MP2, но когда я переключаюсь на OPUS, у меня возникает эта проблема:
[opus @ 1b06d040] Error parsing the packet header.
Я полагаю, что в отличие от MP2, мне нужно сгенерировать заголовок для моего потока данных в кодировке OPUS, но я не знаю как.
Может кто-нибудь объяснить мне, как это сделать? Благодарю.
Эта ошибка происходит из-за сбоя ff_opus_parse_packet (), который обрабатывает необработанный заголовок пакета opus, который спецификация называет байтом ‘TOC’ (для оглавления) и необязательной длиной субкадра. Это означает, что libavcodec не смог найти длительность пакета там, где он ожидал.
Так что, вероятно, ваш пользовательский протокол повреждает данные, возвращает неправильную длину данных, или вы неправильно делите пакет опуса с вашего слоя кадрирования.
Вам не нужно придумывать свой собственный протокол, если вы этого не хотите. Существует два установленных дизайна: Opus over RTP для интерактивного использования (например, живого чата, где задержка имеет значение) задокументирована в RFC 7587. Для потоковой передачи HTTP, файлового хранилища для записи, воспроизведения и других приложений, подобных этому, используется контейнер Ogg, документированный Вот. Есть реализации обоих из них в libavformat. Смотрите rtpenc.c, oggenc.c и oggparseopus.c, если вам интересно узнать подробности.