來自:http://www.opus-codec.org/docs/html_api-1.1.0/group__opus__encoder.html#gaefeb7dc1d6e3b59dea5ea674c86e9c18
詳細說明
此頁面描述了用於編碼的使用過程和功能。
因為Opus是狀態編解碼,進行編碼前,首先需要建立一個編碼器。你可以這樣做:
int error;
OpusEncoder *enc;
enc = opus_encoder_create(Fs, channels, application, &error);
從這起,enc就可以用來對音頻流進行編碼。這個編碼器不能同時對多個流進行編碼 (線程不安全)。同時,對多幀進行編碼時,編碼器不需要重複初始化。
調用opus_encoder_create()時,會建立記憶體空間,它也可以初始化預分配記憶體:
int size;
int error;
OpusEncoder *enc;
size = opus_encoder_get_size(channels);
enc = malloc(size);
error = opus_encoder_init(enc, Fs, channels, application);
opus_encoder_get_size()會返回編碼器所需的記憶體大小。請注意,這個大小可能在未來的版本中有所修改,所以盡量不要使用常量代替。
這個編碼器會分配到連續的記憶體塊中,可以通過淺拷貝擷取他(例如memcpy)
你可以通過opus_encoder_ctl()對編碼器的內部設定進行修改。這些設定預設使用推薦值。以下為最常見的修改項:
opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));//傳輸速率
opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));//複雜度
opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type));//訊號
在這裡
bitrate的單位是位元每秒(B / S)
complexity是一個值從1至10,其中1最低和10最高
signal_type要麼OPUS_AUTO(預設),OPUS_SIGNAL_VOICE或OPUS_SIGNAL_MUSIC
參看編碼器相關的CTL和通用的CTL可以知道完整的設定列表。大多數參數可以在流編碼時,進行設定或修改。
在調用opus_encode()或者opus_encode_float()時必須是一個完整的音頻資料(2.5,5,10,20,40或60毫秒):
len = opus_encode(enc, audio_frame, frame_size, packet, max_packet);
在這裡
audio_frame是opus_int16音頻資料(或是opus_encode_float())
frame_size是幀中的樣本的期間(每個通道)
packet是音頻資料需要寫入的位元組數組
max_packet是可寫在包的最大位元組數(4000位元組建議)。不要通過max_packet來控制VBR的位元速率,如果需要請使用OPUS_SET_BITRATE CTL。
opus_encode()和opus_encode_float()返回實際寫入到分組的位元組數。傳回值可以是負的,這表示發生了錯誤。如果傳回值是1位元組,則分組不需要被發送(DTX)。
當需要釋放編碼器時,可以通過:
opus_encoder_destroy(enc);
如果編碼器,用opus_encoder_init()建立,而不是opus_encoder_create(),則不執行任何操作,只需要釋放預先分配的記憶體,調用free(enc)