opusbtc3100中文說明
① 德律風根opus studio 2650的音頻輸出是什麼插頭
最近項目中用到了語音編碼opus,在網上搜了一下,資料非常少,而且沒有一個完整的教程,現在簡單記錄下來opus的使用方法。
首先介紹一下opus
Opus
Opus編碼器 是一個有損聲音編碼的格式,由互聯網工程任務組(IETF)進來開發,適用於網路上的實時聲音傳輸,標准格式為RFC 6716。Opus 格式是一個開放格式,使用上沒有任何專利或限制。
特性
Opus的前身是celt編碼器。在當今的有損音頻格式爭奪上,擁有眾多不同編碼器的AAC格式打敗了同樣頗有潛力的Musepack、Vorbis等格式,而在Opus格式誕生後,情況似乎不同了。通過諸多的對比測試,低碼率下Opsu完勝曾經優勢明顯的HE AAC,中碼率就已經可以媲敵碼率高出30%左右的AAC格式,而高碼率下更接近原始音頻。
以上來自網路(PS:網路對opus的介紹都很少)
簡單來說,opus是一個高保真的適合在網路中傳輸的開源的語音編碼格式,相對於其他編碼格式來講,保真性更好,但體積會稍微大一些。官網地址:http://www.opus-codec.org/
怎麼用呢?
首先你可以使用編譯好的so庫直接使用,或者也可以使用源碼自己根據需求生成so庫來使用,當然,你也可以直接將源碼使用到自己工程各中,這就是開源的好處。好了下面介紹如何編譯。
我是通過Eclipse來編譯的,首先在opus官網下載源代碼,解壓。
編碼工作需要ndk編程所以需要一些NDK編程的知識。
在工程中創建OpusTool類,該類用於調用native層的方法。
[java] view plain
package com.ione.opustool;
public class OpusTool {
public native String nativeGetString();
public native int encode_wav_file(String in_path, String out_path);
public native int decode_opus_file(String in_path, String out_path);
}
其中nativeGetString()方法是用來測試jni調用是否成功的測試方法,encode_wav_file(String in_path, String out_path);和 decode_opus_file(String in_path, String out_path);分別是用來編解碼。以上三個方法均需聲明為native,用來調用jni的c函數。然後在項目根目錄下打開命令行,使用javah命令生成.h文件,即:
javah -classpath .\bin\classes -d jni com.ione.opustool.OpusTool
其中.\bin\classes為指定OpusTool.class的路徑,-d jni為在當前目錄下生成jni文件夾,用來存放native層代碼。回車之後便在工程的根目錄下生成了jni文件夾以及com_ione_opustool_OpusTool.h文件。如:
[cpp] view plain
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ione_opustool_OpusTool */
#ifndef _Included_com_ione_opustool_OpusTool
#define _Included_com_ione_opustool_OpusTool
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ione_opustool_OpusTool
* Method: nativeGetString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ione_opustool_OpusTool_nativeGetString
(JNIEnv *, jobject);
/*
* Class: com_ione_opustool_OpusTool
* Method: encode_wav_file
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_encode_1wav_1file
(JNIEnv *, jobject, jstring, jstring);
/*
* Class: com_ione_opustool_OpusTool
* Method: decode_opus_file
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_decode_1opus_1file
(JNIEnv *, jobject, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
接下來復制一份com_ione_opustool_OpusTool.h文件到jni目錄,修改名稱為com_ione_opustool_OpusTool.c修改內容為:
[cpp] view plain
#include <com_ione_opustool_OpusTool.h>
JNIEXPORT jstring JNICALL Java_com_ione_opustool_OpusTool_nativeGetString
JNIEnv * env, jobject obj) {
return (*env)->NewStringUTF(env, "Hello Opus");
}
JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_encode_1wav_1file(
JNIEnv *env, jobject obj, jstring wav_path, jstring opus_path) {
return 0;
}
JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_decode_1opus_1file(
JNIEnv *env, jobject obj, jstring wav_path, jstring opus_path) {
return 0;
}
然後創建並配置makefile和android.mk文件,後面會給出。記得配置NDK_Builder。
此時可以調用OpusTool類的nativeGetString()方法查看返回數據是否正常,若為Hello Opus 則jni調用成功。可以繼續下面的工作。
在jni目錄下創建libopus文件夾,將Opus源碼粘貼到該文件夾下,即celt、include、silk、src文件夾以及config文件,當然不是所有的文件都用的上,可以根據自記得需求進行拷貝。配置好makefile等配置文件後即可編譯工程,如果編譯順利,則說明配置文件沒有問題,繼續操作。在src文件加下創建opus_tool.c文件用來進行音頻文件的編解碼的c實現。
opus_tool.c
[cpp] view plain
/*****************************************************************************
# -*- coding:utf-8 -*-
# author: ione
# create date: 2014-11-27
*****************************************************************************/
#include "android_log.h"
#include "opus.h"
#include "opus_types.h"
#include "opus_multistream.h"
#define SAMPLE_RATE 16000
#define CHANNEL_NUM 1
#define BIT_RATE 16000
#define BIT_PER_SAMPLE 16
#define WB_FRAME_SIZE 320
#define DATA_SIZE 1024 * 1024 * 4
int encode(char* in, int len, unsigned char* opus, int* opus_len) {
int err = 0;
opus_int32 skip = 0;
OpusEncoder *enc = opus_encoder_create(SAMPLE_RATE, CHANNEL_NUM,
OPUS_APPLICATION_VOIP, &err);
if (err != OPUS_OK) {
fprintf(stderr, "cannnot create opus encoder: %s\n",
opus_strerror(err));
enc = NULL;
return -1;
}
opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_WIDEBAND));
opus_encoder_ctl(enc, OPUS_SET_BITRATE(BIT_RATE));
opus_encoder_ctl(enc, OPUS_SET_VBR(1));
opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10));
opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0));
opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO));
opus_encoder_ctl(enc, OPUS_SET_DTX(0));
opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0));
opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip));
opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(16));
short frame_size = WB_FRAME_SIZE;
int frame_bytes = (frame_size << 1);
opus_int16 *frame = (opus_int16 *) in;
unsigned char *cbits = opus;
while (len > frame_bytes) {
int nbytes = opus_encode(enc, frame, frame_size, cbits + sizeof(char),
640 - sizeof(short));
if (nbytes > frame_size * 2 || nbytes < 0) {
return -1;
}
cbits[0] = nbytes;
frame += WB_FRAME_SIZE;
cbits += nbytes + sizeof(char);
len -= frame_bytes;
*opus_len += nbytes + sizeof(char);
}
opus_encoder_destroy(enc);
return 0;
}
int decode(unsigned char* in, int len, short* out, int* out_len) {
int err = 0;
opus_int32 skip = 0;
*out_len = 0;
OpusDecoder *dec = opus_decoder_create(SAMPLE_RATE, 1, &err);
if (err != OPUS_OK) {
fprintf(stderr, "cannnot decode opus: %s\n", opus_strerror(err));
dec = NULL;
return -1;
}
short frame_size = WB_FRAME_SIZE;
opus_int16 *frame = (opus_int16 *) in;
while (len > 0) {
int nbytes = in[0];
if (nbytes <= 0) {
return -1;
}
int decode_len = opus_decode(dec, in + sizeof(char), nbytes, out,
frame_size, 0);
if (decode_len != frame_size) {
return -1;
}
in += sizeof(char) + nbytes;
out += frame_size;
len -= nbytes - sizeof(char);
*out_len += frame_size;
}
opus_decoder_destroy(dec);
return 0;
}
int encode_wav_file(char *in_file_path, char *out_file_path) {
FILE *fin = fopen(in_file_path, "rb");
if (fin == NULL || fin == 0) {
return -1;
}
char *in = (char*) malloc(DATA_SIZE);
memset(in, 0, DATA_SIZE);
int len = fread(in, 1, DATA_SIZE, fin);
if (len == 0) {
return -1;
}
FILE *fout = fopen(out_file_path, "wb");
if (fout == NULL || fout == 0) {
return -1;
}
unsigned char *out = (unsigned char*) malloc(DATA_SIZE);
memset(out, 0, DATA_SIZE);
int out_len = 0;
encode(in, len, out, &out_len);
if (len < 0) {
return -1;
}
fwrite(out, 1, out_len * sizeof(unsigned char), fout);
free(in);
free(out);
fclose(fin);
fclose(fout);
return len;
}
int make_wav_header(FILE *out, int len) {
int size = 0;
int *sz = &size;
int number;
int * nm = &number;
// RIFF 4 bytes
fseek(out, 0, SEEK_SET);
fputs("RIFF", out);
// len 4 bytes
len = (len + 44 - 8);
fwrite(&len, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);
// WAVE 4 bytes + "fmt " 4 bytes
fputs("WAVEfmt ", out);
// size1 4 bytes
number = 16;
fwrite(nm, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);
// format tag 2 bytes
number = 1;
fwrite(nm, 2, 1, out);
// channel 2 bytes
number = CHANNEL_NUM;
fwrite(nm, 2, 1, out);
// sample rate 4 bytes
number = SAMPLE_RATE;
fwrite(nm, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);
//byte per seconds 4 bytes
number = 22664;
fwrite(nm, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);
// block align 2 bytes
number = CHANNEL_NUM * BIT_PER_SAMPLE / 8;
fwrite(nm, 2, 1, out);
// bitPerSample 2 bytes
number = 16;
fwrite(nm, 2, 1, out);
// "data" 4 bytes
fputs("data", out);
// size2 4 bytes
size = (size - 36);
fwrite(sz, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);
return 0;
}
int decode_opus_file(char *in_file_path, char *out_file_path) {
printf("%s\n", in_file_path);
FILE *fin = fopen(in_file_path, "rb");
if (fin == NULL || fin == 0) {
return -1;
}
unsigned char *in = (unsigned char *) malloc(DATA_SIZE);
memset(in, 0, DATA_SIZE);
int len = fread(in, 1, DATA_SIZE, fin);
FILE *fout = fopen(out_file_path, "wb");
if (fout == NULL || fout == 0) {
return -1;
}
short *out = (short *) malloc(DATA_SIZE);
memset(out, 0, DATA_SIZE);
int out_len = 0;
out += 44;
decode(in, len, (short *) out, &out_len);
if (len < 0) {
return -1;
}
fwrite(out, 1, out_len * sizeof(short), fout);
int err = make_wav_header(fout, out_len);
free(in);
free(out);
fclose(fin);
fclose(fout);
return out_len;
}
配置makefile文件添加opus_tool.c文件,然後編譯,即可在libs目錄下生成.so文件
② Directory Opus 11怎麼查看PDF
ActiveX + Preview + Office + Web
意思是調用插件的吧。
如果你裝的是office2013 的話可以配置一下,把.pdf設置為調用office打開。
或者如果你用acrobat的話是可以調用瀏覽器打開的。
不過,你要是想一個軟體打開很多種文件格式的文件的話,可以繼續看看官方的說明文件看看有木有解決辦法。
③ 如何修改OPUS登錄密碼
可以通過任意 Scopus 頁面右上角的 Scopus 菜單更新密碼。
注意:如果忘記了用戶名或密碼,請查看此處的進一步說明。
如何操作
按照以下步驟更新密碼:
登錄 Scopus。
在任意 Scopus 頁面中,單擊 Scopus 菜單鍵。
在 Scopus 菜單鍵中,單擊「個人資料訪問」。
在「個人資料訪問」中,單擊「更改密碼」。將打開「更改密碼」頁面。
輸入當前密碼,然後輸入新密碼兩次。
單擊「提交」保存您的新密碼。
完成這些步驟後,密碼即更新完成。
④ (解決中)求最新完美破解版的 Directory Opus 12 注冊碼 KEY
directory opus v11.17綠色破解版http://www.ddooo.com/softdown/70685.htm,這個版本需要不。
使用說明:
1、該版本為綠色破解版,下載文件之後,點擊dopus.exe即可運行軟體,無需安裝
2、點擊「選項」按鈕進入軟體的選項設置,軟體提供豐富的設置選項,我們首先需要關閉軟體的自動更新功能(為安裝證書准備),如下圖:
3、設置HTTP選項(隨便輸入即可),主要是防止軟體自動進行代理訪問,必須連接時出錯
4、在下圖中將框中顯示選項夠選掉
5、上述操作完成之後,我們就可以點擊「幫助」按鈕,選擇「證書管理」進行證書的安裝了
6、選擇「安裝證書」-「導入」-選擇安裝包文件內的證書文件,點擊「安裝」之後,即可完成證書的安裝操作。
7、完成以上步驟之後,directory opus算是全部破解完成了,請用戶可以放心使用,如果需要語言更改的話,可參照下圖進行設置即可!
⑤ Directory Opus的驅動器欄Driverbar怎麼用
Directory Opus能做到的不僅僅是利用驅動器欄進行快速切換盤符,還能做到更多。下面我先說說如何調出Directory Opus的驅動器欄,然後再全手工打造一個更強大的驅動器欄。
一、啟用Directory Opus的驅動器欄
在工具欄空白地方點擊右鍵,在彈出菜單中選擇「自定義」(①),並切換到「工具欄」(②),如圖1。
2. 如圖2,點擊「新建」按鈕(①),在輸入框中輸入驅動器欄的名字(②),比如「Driver」,確定。此時你會發現在列表窗上方出現了一個新的空白Toolbar(③)。
3. 如圖3,點擊「命令」標簽(①),在下方的列表框中選擇「轉到」(②),再在右邊的列表框中選擇「驅動器按鈕」(③),然後在驅動器按鈕上按住左鍵,把「驅動器按鈕」拖到上一步剛建立的空白Toolbar上(④)。此時Toolbar上出現了一個軟盤、光碟、硬碟三合一模樣的圖標,點擊確定退出。
4. 此時剛才空白的Toolbar上已經出現了你機器中所有的磁碟圖標,滑鼠放每個圖標上會顯示磁碟名稱、可用空間、磁碟大小等信息,點擊圖標則會進入相應的磁碟分區。但有一個問題,沒有顯示磁碟的盤符標簽,如圖4,我們只能根據數量來判斷到底是哪個磁碟分區,很不方便,所以我們還要進一步設置。
5. 在工具欄空白地方點擊右鍵並選擇「自定義」,然後右鍵點擊剛才建立的那個「驅動器按鈕」的圖標(①),選擇「編輯」(②),如圖5。
6. 如圖6,在彈出的「命令編輯器」中勾選「顯示標簽」(①),並在右邊的下拉框中選擇「右側」(②),點擊確定,再點擊「自定義」對話框的確定退出。
這時磁碟圖標右側出現了對應的盤符,我們可以很容易的進行磁碟切換了。Directory Opus的「驅動器按鈕」按鈕支持所有的磁碟,比如光碟機、軟碟機、優盤、網路映射磁碟等,它會自動加入新添加的磁碟盤符,不需要我們再進行任何設置。
小貼士:
①可以移動驅動器欄到任何位置,以合理化空間布置。
②可以不建立驅動器欄,而在其他Toolbar上直接添加「驅動器按鈕」,也就是從上面的第三步開始做,把「驅動器按鈕」放置到任何一個已有的Toolbar上。不過「驅動器按鈕」會自動吸附到右邊,而不是左邊。如圖7所示。
二、增強型的驅動器欄
上面所啟用的是Directory Opus內置的驅動器工具(命令),只能定位到磁碟根目錄,沒法進入次級目錄。雖然已經很方便了,但還沒有達到理想的狀態,也不符合我們一直貫徹的DIY精神,因此我們應該更深入的挖掘Directory Opus的應用。
在打造增強型的驅動器欄之前,需要先申明一下,下面的方法並不是官方的標准應用方法,而是用基本功能堆徹起來的應用,因此比較繁瑣。另外這種方法只適合---
能夠有效管理文件的人使用(文件歸類有條理),像某些各種文件和目錄亂擺亂放的人不適用(一個盤符下能有幾十上百個混亂的文件和文件夾);
對固定目錄適用(用固定位置、名稱的目錄集中管理相關文件),對非固定目錄不適用(經常換位置、改名字)。因此進行下一步之前先想一想,自己到底有沒有一個良好的使用習慣,如果沒有的話,還是不要浪費時間了,否則得不償失。
打開自定義對話框,建立一個新Toolbar,假設名字「Driver_Ex」。在新建的Toolbar上點擊右鍵,選擇「新建-按鈕」,如圖8。
2. 右鍵點擊這個新建的按鈕,選擇「編輯」,如圖9,在彈出的「命令編輯器」中修改標簽為「C:」(①),右側的「顯示標簽」中選擇「右側」(②)。然後勾選右上的「顯示圖標」(③),再點擊左上的第一個空白圖標框(④),選擇一個圖標。為了保持與前面Directory Opus內置的「驅動器按鈕」的圖標一致,建議使用系統圖標,選擇「從文件中選擇圖片」(⑤),定位到「C:\Windows\System32\Shell32.dll」,選擇磁碟圖標,點擊兩次確定退出「命令編輯器」。此時這個按鈕已經顯示與Directory Opus內置的「驅動器按鈕」相同的圖標和文字標簽。
3. 再次右鍵點擊這個按鈕,選中「三重按鈕」,如圖10。
4. 左鍵點擊這個按鈕,在彈出的次級按鈕上點擊右鍵,選擇「復制」(①),如圖11。再次左鍵點擊次級按鈕,選擇「粘貼」(②),此時會出現兩個按鈕(③)。
5. 右鍵點擊第一個次級按鈕,選擇「編輯」,如圖12,在彈出的「命令編輯器」中修改標簽為「C:」(①),修改提示信息為「Goto C:\」(②)(這里的提示信息可以隨便修改,比如你可以改為「切換到C盤根目錄」,以下相同)。在下面的「函數」位置輸入「Go C:\」(③)(這個命令是唯一的,也就是必須是這條命令),確定退出。
6. 右鍵點擊第二個次級按鈕,選擇「編輯」,如圖13,在彈出的「命令編輯器」中修改標簽為「屬性」(①),修改提示信息為「所選文件或文件夾的屬性」(②)。在下面的「函數」位置輸入「Properties」(③)(這個命令的作用是顯示文件的屬性對話框,這里只是用這條命令舉例子,如果你熟悉Directory Opus的內部命令,可以修改為自己需要的),確定退出。
7. 右鍵點擊這個新建Toolbar(也就是當前操作的按鈕所在的Toolbar,即剛才新建的名稱為Driver_Ex的Toolbar)的空白地方,選擇「新建-新建菜單」(①),如圖14,Toolbar上會出現一個「新建菜單」的按鈕(②)。左鍵點住這個菜單按鈕,把它拖到C:按鈕的次級按鈕的中間位置(③)。
8. 右鍵點擊「新建菜單」按鈕,選擇「編輯」,如圖15,在編輯對話框中修改標簽為「進入」(①),修改提示信息為「進入下一級目錄」(②),確定。
9. 點擊剛才這個菜單按鈕,進入次級按鈕,右鍵點擊這個次級按鈕,選擇「新建-新建按鈕」(①),如圖16,此時會添加一個名字為「新建按鈕」的按鈕(②)。
上一次我們利用Directory Opus的Toolbar打造了兩個驅動器欄,特別是第二種增強型的驅動器欄,帶有子目錄顯示,所以很方便。今天我們再來打造兩種增強型的DriverBar,這兩種DriverBar都可以自動進入次級目錄,並顯示目錄下的文件。因為上次把操作過程講的比較詳細,所以這里只詳細說明關鍵步驟。
一、自動彈出型
1. 新建一個Toolbar,在這個Toolbar上點擊右鍵,選擇「新建-新建菜單」,編輯菜單標簽為「C:」 。
2. 點擊這個菜單,在彈出的次級空白按鈕上點擊右鍵,選擇「新建-新建按」,編輯這個按鈕,修改標簽為「C:」 ,在「函數」欄里輸入「Go C:\」。
3. 在這里再新建一個菜單,編輯菜單標簽為「C:\」。點擊這個新建的菜單,在彈出的三級空白按鈕上新建一個按鈕,編輯這個按鈕的標簽為「C:\」,在「函數」欄里輸入「Go C:\ FOLDERCONTENT」,確定退出。
OK,C盤的驅動器按鈕已經建立完成,你還可以再增加一個按鈕,讓它顯示選中文件或文件夾的屬性,具體方法看前一篇。這里我們先看看效果,如下圖:
滑鼠右鍵點擊「C:」按鈕後,會彈出C盤下所有文件及文件夾(不能顯示隱藏文件和文件夾),滑鼠在某個目錄按鈕上懸停後會自動彈出下級目錄,在這里你可以直接進入目錄並打開此目錄下的文件。但是有一個弊端,不能打開文件夾!下面我們再來打造一個能打開文件夾的DriverBar。
二、點擊彈出型
1. 在ToolBar上新建一個菜單,,編輯菜單標簽為「C:」。
2. 點擊這個菜單,在彈出的次級空白按鈕上新建一個按鈕,修改標簽為「C:」 ,在「函數」欄里輸入「Go C:\」。
3. 在這里再新建一個菜單,編輯菜單標簽為「C:\」。點擊這個新建的菜單,在彈出的三級空白按鈕上新建一個按鈕,修改標簽為「C:\」,在「函數」欄里輸入「Go C:\ FOLDERCONTENT=Butoon」。
好了,現在在這個新驅動器按鈕上點右鍵,發現彈出的目錄按鈕不能自動彈出下級目錄了,而且菜單上的左箭頭變成了向下的箭頭。此時點擊目錄按鈕就會進入這個目錄的所在的文件夾,點擊右邊向下的箭頭後彈出下級目錄以及目錄下的所有文件。
三、總結
現在我們回頭來看這四種DriverBar:
第一種是Directory Opus自帶的命令,可以自動顯示所有驅動器,實現起來比較簡單,但是功能也很簡單,只能進入該磁碟的根目錄。
第二種雖然能顯示並進入次級目錄,但是需要我們手動指定,工作量非常大。
第三種雖然可以快速進入所有次級目錄,但只能選擇文件,不能打開目錄所在文件夾,因此適合遍歷目錄和快速打開文件用。
第四種不僅可以進入所有次級目錄,並可以打開文件夾和文件,唯一的缺點是需要手動點擊箭頭才能進入下一級目錄。
這四種DriverBar各有特點和優勢,又有各自的不足,但這么強大的功能卻是其他軟體所不具有的。其實我們可以變相使用所有的功能,比如把第三種和第四種結合起來使用。這里說說我的做法:
選中第四種作為主用DriverBar,然在這個DriverBar後面再建立一個菜單,把第三種中建立的彈出按鈕全部整合到這個菜單中。這樣在平時使用第三種進入目錄,而用最後一個快速遍歷目錄以及定位並打開文件。如下圖:
關於DriverBar到此全部結束。
⑥ 能研BC-3100和OPUS BT-C3100是什麼關系
那是充電器。
樓主是不是用過後覺得不好。有些東西可能產品質量不好,或者質檢沒把好關。
所以把殘次產品拿出來賣。