略,一搜一大把,官网地址可以看看,具体如下:
https://opus-codec.org/
https://opus-codec.org/docs/
常用的工具就是 opus-tools,下载地址: https://opus-codec.org/downloads/
opus-tools的编译依赖openssl和opusfile(在https://opus-codec.org/downloads/可以下载),编译安装即可。编译完之后会生成opusdec, opusenc,opusinfo,opusrtp几个可执行程序。
opusinfo只能查看ogg封装格式的opus编码的音频;opusrtp可以从opus的抓包文件中提取出来opus音频,opusrtp输出的是已经封装到ogg中的音频。
输出的封装到ogg里面的音频可以直接用ffplay播放。
例子1:从opus.pcap中提取音频
opusrtp -e opus.pcap -o audio.opus
例子2:将 audio.opus 转换成 wav
opusdec audio.opus audio.wav
命令的使用直接 --help 就行。这里有个地址也可以查看:https://opus-codec.org/docs/opus-tools/opusdec.html
RTP封装OPUS PACKET的过程可以参考RFC 7587,概括一句话就是一个RTP包中只能封装一个opus packet,而一个opus packet可以包含多个opus frame(RFC6716)。
从RTP中提取出的OPUS数据如果直接落盘是不能播放的,必须将其内部的opus packet按照RFC7845封装成ogg packet(一个一个的ogg packet连接起来就组成了logical ogg bitstream),然后再通过RFC3533将logical ogg bitstream封装成physical ogg bitstream。将physical ogg bitstream落盘就可以播放了。
RFC7845将 opus packet进一步封装成 ogg packet的目的主要是:精确seek,崩溃检测等等,RFC7845的第二页都讲了。
RFC3533中主要就是可以将多个logical ogg bitstream MUX到 一个physical ogg bitstream中。
// 第一页
4f67 6753 //OggS
00 //version
02 //header type ===> bos
0000 0000 0000 0000 //granule_position
a741 0000 //bitstream_serial_number
0000 0000 //page_sequence_number
fb69 fc11 //crc_checksum
01 // page_segments 本页有1个segment
13 // segment table 这一个segment的长度是19个字节
//id header
4f70 7573 4865 6164 // opusHead 共有19个字节
01 Version
02 channel count
0000 pre-skip
80bb 0000 48000采样率
0000
00 mapping family
// 第二页
4f67 6753 // OggS
00 //version
00 // header type ===> 表示该页不是logical opus bitstream的第一页、不是最后一页、也不是延续之前的packet
0000 0000 0000 0000 //granule_position
a741 0000 //bitstream_serial_number
0100 0000 //page_sequence_number
48d4 f428 //crc_checksum
01 // page_segments 本页有1个segment
24 // segment table 这一个segment的长度是36个字节
// comment header
4f70 7573 5461 6773 //OpusTags
14 0000 00 // Vendor String Length 小端 0x00000014 ===> 20 个字节
6f 7075 7320 7274 7020
7061 636b 6574 2064 756d 70 // Vendor String
00 0000 00 // User Comment List Length 这里为0,表示没有评论
// 第三页
4f6767 53 //OggS
00
00
80 5200 0000 0000 00 // granule_position
a7 410000 // bitstream_serial_number
02 0000 00 // page_sequence_number
8d a82c 7f // crc_checksum
18 // page_segments 本页有24个segment,说明下面 segment_table 共有24个字节,每个字节表示一个segment的长度
c9 // 表示第一个 segment 的长度是 0xc9,也就是 201 个字节,刚好对应RTP包中所包含的opus packet 的长度
ff 1ac8 c4c5
c6c1 bfbd b5ae a5a5 a2a4 9e9c 9fa5 a7a2
ff1a //到这里都是 segment_table
//第一个segment,刚好对应第一个RTP包中的所包含的opus packet
f8d0 821a b662 97f9 96d0 0e8d be38
b5a0 4ff5 75ec 4ce9 2348 c92a b039 e12e
a290 fcef 174a b620 baa6 29cb 4095 817f
d439 6b4f 57ee 5e9c a663 e908 88d4 f91e
6270 8f2a 9902 d881 5f9c 8d4c a657 e88b
deab 9c0e 1238 be7b 0b93 9d71 d854 7db5
698e e912 ecd6 6b74 fb9f 7f84 470e ac29
2c33 fa48 d9c6 2a96 a322 da5f 2296 43ee
4141 9e73 3c25 72b7 30ad 4adb 3322 8432
a3dd fbc3 d4d0 6c2d 52e6 3810 5426 12dc
2966 e689 bea0 0925 1b98 04e2 47d5 9947
921c eff3 63b7 126b 8897 9150 44f7 7101
63fa 648f 3a94 242c bc9e 21
//第二个segment
f8 d51f a7a4 ........
https://juejin.cn/post/6844904016254599175#heading-10
https://webrtc.org.cn/analysing-opus-media/