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是什么关系
那是充电器。
楼主是不是用过后觉得不好。有些东西可能产品质量不好,或者质检没把好关。
所以把残次产品拿出来卖。