我正在使用带有 avcodec 的 OPUS 对声音进行编码并使用我自己的协议对其进行流式传输。
到目前为止,它适用于 MP2 编解码器,但是当我切换到 OPUS 时,我遇到了这个问题:
[opus @ 1b06d040] Error parsing the packet header.
我想与 MP2 不同,我需要为我的 OPUS 编码数据流生成一个标头,但我不知道如何。
有人可以解释我该怎么做吗?谢谢。
我正在使用带有 avcodec 的 OPUS 对声音进行编码并使用我自己的协议对其进行流式传输。
到目前为止,它适用于 MP2 编解码器,但是当我切换到 OPUS 时,我遇到了这个问题:
[opus @ 1b06d040] Error parsing the packet header.
我想与 MP2 不同,我需要为我的 OPUS 编码数据流生成一个标头,但我不知道如何。
有人可以解释我该怎么做吗?谢谢。
此错误来自 ff_opus_parse_packet() 失败,它处理原始 opus 数据包标头,规范称为“TOC”(用于目录)字节和可选子帧长度。这意味着 libavcodec 无法在预期的位置找到数据包持续时间。
因此,您的自定义协议可能正在破坏数据,返回错误的数据长度,或者您没有正确地将 opus 数据包从框架层中拆分出来。
如果你不想,你不需要发明自己的协议。有两种既定设计:RFC 7587中记录了用于交互式使用的 Opus over RTP(例如延迟很重要的实时聊天) 。对于 HTTP 流,用于记录、回放和其他类似应用程序的文件存储使用 Ogg 容器,记录在这里。在 libavformat 中有这两种方法的实现。如果您对细节感到好奇,请参阅 rtpenc.c、oggenc.c 和 oggparseopus.c。