【问题标题】:How to determine the end of an Opus stream?如何确定 Opus 流的结束?
【发布时间】:2021-02-26 13:24:28
【问题描述】:

我正在编写一个程序,它正在读取通过 UDP 传输的 Opus 数据包的非连续流 - 换句话说,我可能会获得 30 秒的音频,30 分钟的无内容,然后是 2 分钟的音频。

我已经能够使用official Opus docs 来解码、保存和播放音频,但我无法找到一种方法来确定流是否完成时间>。我已经看到对指示流已完成的标志的引用(例如 Ogg 页面有一个标志),但我对音频不够熟悉,无法确定我得到的是 Ogg 编码还是我应该是深入研究实际的 Opus 数据包本身。 RFC itself 似乎也没有太大帮助。

对于它的价值,this 是执行传输的程序(我的接收代码是 Python。)

【问题讨论】:

    标签: audio voip pcm opus


    【解决方案1】:

    我相信 Opus 数据包本身是无状态的音频,这些数据包的所有组织都将发生在它们的封装/容器中(Ogg、WebM 等)。据我所知,Opus 是一种不包含预定义持续时间的流媒体格式。

    通过阅读“How do I get the duration of a .opus file?”,您可能会使用序列号来识别新“逻辑 Ogg 比特流”的开始,并在遇到新序列号时确定比特流的“结束”。 “Logical bitstreams are identified by a unique serial number”(Ogg Spec RFC 3533,其父 Ogg Opus Spec RFC 7845)。

    使用opusencopusinfo 对Ogg Opus 文件进行编码时,您会看到列有序列号的比特流:

    $ opusinfo audio-test.opus
    Processing file "audio-test.opus"...
    
    New logical stream (#1, serial: 30b7344f): type opus
    ...
    Opus stream 1:
    ...
    Logical stream 1 ended
    

    【讨论】:

    • 我想在此评论前声明我完全不适合这里,我正在做出有根据的猜测,而不是知情的陈述。您提到数据包本身是无状态的,但the docs 似乎另有说明:“Opus 是具有重叠块的有状态编解码器,因此 Opus 数据包不是相互独立编码的。”你链接的页面是一个文件,但我说的是一个流。我错过了什么吗?流中是否也包含序列号?
    • 哈,我有严重的阅读障碍,完全误读/误解了那部分。序列号包含在 Ogg 比特流中,我不相信它们本身在 Opus 数据包中。我刚刚更新了答案以表明这一点。
    • 另外,权威答案见Opus codec - contact。他们总是反应迅速,乐于助人。
    • 别担心,我不需要积分/信用。很高兴能帮助你!愿意在您找到它时发布它,以便社区中的其他人也能从中受益吗?电子邮件列表也是存档/可搜索的,因此电子邮件与 IRC 也可能使其他人受益更多。
    猜你喜欢
    • 2023-04-06
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多