This is a read-only archive of the Mumble forums.

This website archives and makes accessible historical state. It receives no updates or corrections. It is provided only to keep the information accessible as-is, under their old address.

For up-to-date information please refer to the Mumble website and its linked documentation and other resources. For support please refer to one of our other community/support channels.

Jump to content

[SOLVED] Updated protocol documentation


Recommended Posts


I'm working on a python implementation of the protocol, and I have already some success for version 1.2.3 (a client that record the audio available on a channel).

I would like to adapt it for the new 1.2.4 functionalities (opus, ...) but the protocol documentation available in the source is still 2 years old.

Any chance it would be updated with the latest features ?

Link to comment
Share on other sites

  • Administrators

Yes, there is a chance.

The current Mumble.proto includes

message CodecVersion {
optional bool opus = 4 [default = false];


Is that not enough to get you going?

With codec negotiation given you know the type it should not be a problem?

(not too familiar with the protocol specifics)

Link to comment
Share on other sites

  • 2 weeks later...

Hello again,

Is something changed in the audio packet format when using Opus (chapter 5.2 of the protocol documentation) ?

When I try to decode the repeated audio frame within the packet, the lengths given in the first byte (excluding the terminator bit) don't make any sense... looks like it is random...

2 examples (the hex part start with the type/target byte of the audio packet) ...


80011aa0 647806e3 79c8c957 c0fec82b 4d467a46 346249fe 3a194c52 ef9ae40c dee4177d d96c81dd 
802b0cb1 594ac9ec a3b251c6 10850cf9 b1cd7353 6e13cd61 3776c596 c5935e3e c593709e 6ea3709b 
709c1533 fdd667fb df75eebd d6000000 000018a3 84000000 00
2012-12-01 14:48:00,839-PyMumble-DEBUG-audio packet received from 1, sequence 26, type:4, target:0, lenght:105
2012-12-01 14:48:00,841-PyMumble-DEBUG-Audio frame : time:1354369680.840000, last:False, size:32, type:4, target:0, pos:3
2012-12-01 14:48:00,841-PyMumble-DEBUG-Audio frame : time:1354369680.841000, last:False, size:89, type:4, target:0, pos:36

8001834f a0647806 e379c8c9 57c0a212 23faef12 9a51276d 2d839a1d d0729bae 105db1d1 aa72206a 
1b07ded4 fc2c305d e1ff6c07 44197d64 dd02d1ee 834e2135 7a5b0881 d17b6dc7 6f3b199d 801923f1 
e7067e67 e0000000 0067e67e 67e00000 d716fe62 8e100000 0000
2012-12-01 15:12:36,499-PyMumble-DEBUG-audio packet received from 1, sequence 847, type:4, target:0, lenght:106
2012-12-01 15:12:36,500-PyMumble-DEBUG-Audio frame : time:1354371156.500000, last:False, size:32, type:4, target:0, pos:4
2012-12-01 15:12:36,500-PyMumble-DEBUG-Audio frame : time:1354371156.500000, last:True, size:114, type:4, target:0, pos:37


Doing the same test with OPUS disabled give something that gives complete sense !

000180d2 b1fffe00 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000 00000000 0000b1ff fe000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000 00000000 00000000 00000000 00000000 00
2012-12-01 15:03:02,726-PyMumble-DEBUG-audio packet received from 1, sequence 210, type:0, target:0, lenght:105
2012-12-01 15:03:02,727-PyMumble-DEBUG-Audio frame : time:1354370582.728000, last:False, size:49, type:0, target:0, pos:4
2012-12-01 15:03:02,729-PyMumble-DEBUG-Audio frame : time:1354370582.729000, last:False, size:49, type:0, target:0, pos:54



Link to comment
Share on other sites

  • Administrators

Yeah. The packaging for Opus is different because if you ask for 60ms Mumble no longer packs six ten ms CELT frames but can directly create one 60ms Opus frame. That got to big for the old encoding (<=127 bytes per frame) so now we directly encode the size in bytes in a varint.

So when previously it was [header][frame][header][frame]... it now is [header][frame] for Opus type packets (others are unchanged). Here's the relevant snippet for decoding this part of the packet (AudioOutputSpeech.cpp):

	pds >> size;

bHasTerminator = size & 0x2000;
qlFrames << pds.dataBlock(size & 0x1fff);

Link to comment
Share on other sites


  • Create New...