Ticket #1904 (closed enhancement: fixed)
Support for Opus codec
|Reported by:||ming||Owned by:||nanang|
|Backport to 1.x milestone:||Backported:||no|
Description (last modified by nanang) (diff)
Opus is a totally open, royalty-free, highly versatile audio codec. Opus is unmatched for interactive speech and music transmission over the Internet, but is also intended for storage and streaming applications. It is standardized by the Internet Engineering Task Force (IETF) as RFC 6716 which incorporated technology from Skype's SILK codec and Xiph.Org's CELT codec. (From http://www.opus-codec.org)
How to use:
- Download Opus source code from here (latest stable release 1.1.2 or above is recommended).
- Build Opus:
- For iOS, get the build script here or here.
- For Android, get the Android makefile attached in this ticket (tested with Opus 1.1.2), or check here
- create jni folder in Opus root directory and put Android.mk from this ticket attachment in there
- run ndk-build from Opus root directory
- make a new folder called opus-dev-lib and create subfolders: include/opus and lib in it
- copy Opus header files from [OPUS_ROOT_DIR]/include to opus-dev-lib/include/opus and libopus.a file from [OPUS_ROOT_DIR]/obj/local/armeabi to opus-dev-lib/lib
- For GNU build system, e.g: *nix, Linux, MacOS, just invoke ./configure, make, and make install.
- For Windows:
- use GNU build tools such as MinGW, or
- use VS solution & projects provided by Opus (usually in win32 dir), then modify the following line in the end of pjmedia/src/pjmedia-codec/opus.c appropriately:
# pragma comment(lib, "libopus.a")
- Run PJSIP's configure script with the option --with-opus=your_opus_installation_dir. For example on Android platform:
Opus Codec Settings
General codec settings for this codec such as VAD and PLC can be manipulated through the setting field in #pjmedia_codec_param (see the documentation of #pjmedia_codec_param for more info).
For Opus codec specific settings, such as sample rate, channel count, bit rate, complexity, and CBR, can be configured in #pjmedia_codec_opus_config. The default setting of sample rate is specified in #PJMEDIA_CODEC_OPUS_DEFAULT_SAMPLE_RATE. The default setting of bitrate is specified in #PJMEDIA_CODEC_OPUS_DEFAULT_BIT_RATE. And the default setting of complexity is specified in #PJMEDIA_CODEC_OPUS_DEFAULT_COMPLEXITY.
After modifying any of these settings, application needs to call #pjmedia_codec_opus_set_default_param(), which will generate the appropriate decoding fmtp attributes.
Here is an example of modifying the codec settings:
pjmedia_codec_param param; pjmedia_codec_opus_config opus_cfg; pjmedia_codec_mgr_get_default_param(.., ¶m); pjmedia_codec_opus_get_config(&opus_cfg); ... // Set VAD param.setting.vad = 1; // Set PLC param.setting.vad = 1; // Set sample rate opus_cfg.sample_rate = 16000; // Set channel count opus_cfg.channel_cnt = 2; // Set bit rate opus_cfg.bit_rate = 20000; ... pjmedia_codec_opus_set_default_param(&opus_cfg, ¶m);