使用python将opus封装成ogg

原创
04/29 09:14
阅读数 133
实验结果:音频格式改成 opus 后,对于服务器带宽要求大幅度降低,提升10倍并发,但对反应速度没有明显变化,这里主要取决于服务平台。

安装pyogg 最新版本

pip install git+https://github.com/TeamPyOgg/PyOgg

参考文档

https://juejin.cn/post/6844904016254599175

使用pyogg

https://pyogg.readthedocs.io/en/latest/testing_installation.html

需要下载

https://github.com/TeamPyOgg/PyOgg

 

概念如下

OGG是以页(page)为单位将逻辑流组织链接起来,每个页都有pageheader和pagedata。

  1. capture_pattern页标识:ASCII字符,0x4f ‘O’ 0x67 ‘g’ 0x67 ‘g’ 0x53 ‘S’,4个字节大小,它标识着一个页的开始。
  2. stream_structure_version版本id:一般当前版本默认为0,1个字节。
  3. header_type_flag类型标识:标识当前的页的类型,1个字节, - 0x01:本页媒体编码数据与前一页属于同一个逻辑流的同一个packet,若此位没有设,表示本页是以一个新的packet开始的; - 0x02:表示该页为逻辑流的第一页,bos标识,如果此位未设置,那表示不是第一页; - 0x04:表示该页位逻辑流的最后一页,eos标识,如果此位未设置,那表示本页不是最后一页。
  4. granule_position:媒体编码相关的参数信息,8个字节,对于音频流来说,它存储着到本页为止逻辑流在PCM输出中采样码的数目,可以由它来算得时间戳。对于视频流来说,它存储着到本页为止视频帧编码的数目。若此值为-1,那表示截止到本页,逻辑流的packet未结束。(小端)
  5. serial_number:当前页中的流的id,4个字节,它是区分本页所属逻辑流与其他逻辑流的序号,我们可以通过这个值来划分流。(小端)
  6. page_seguence_number:本页在逻辑流的序号,4个字节。
  7. CRC_cbecksum:循环冗余效验码效验,4个字节,用来效验每页的有效性。
  8. number_page_segments:给定本页在segment_table域中出现的segement个数,1个字节。
  9. segment_table:从字面看它就是一个表,表示着每个segment的长度,取值范围是0~255。由segment(1个segment就是1个字节)可以得到packet的值,每个packet的大小是以最后一个不等于255的segment结束的,从页头中的segment_table可以得到每个packet长度,举例:如果一组segment依次顺序为FF 45 FF FF FF 40FF 05FF FF FF 66(共4个packet,含12个segment,每个packet的长度是:FF 45【324】;FF FF FF 40【829】;FF 05【260】;FF FF FF 66【847】),那么第一个packet的长度为255+69 = 324,第二个packet大小829,同理。
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部