我正在尝试将Opus文件解码回原始的48 kHz.但是,我无法找到任何示例代码来执行此操作.
我目前的代码是这样的:
void COpusCodec::Decode(unsigned char* encoded, short* decoded, unsigned int len)
{
int max_size=960*6;//not sure about this one
int error;
dec = opus_decoder_create(48000, 1, &error);//decode to 48kHz mono
int frame_size=opus_decode(dec, encoded, len, decoded, max_size, 0);
}
Run Code Online (Sandbox Code Playgroud)
"编码"这个参数可能是更大量的数据,所以我认为我必须把它分成帧.我不知道怎么能这样做.
作为Opus的初学者,我真的害怕搞砸了.
有人可能会帮忙吗?
我正在尝试编译opus音频编解码器(http://www.opus-codec.org/downloads/)以用于Android应用程序.我正在使用Android NDK(第6版)来编译我的库.到目前为止,我必须为我的应用程序编译的本机C库非常简单,我已经能够将我的Android.mk文件基于jni主要基于教程或其他示例.但是,Opus的编辑看起来有点复杂.tar.gz存档包含一个用于编译Windows库的解决方案文件,它还包含一些用于标准Unix实现的Makefile,但是将这些文件转换为Android NDK使用的Android.mk makefile是一个挑战.
我已经搜索过,但一直无法找到Android makefile的在线版本来编译libopus.有人可能会将我链接到这样的makefile吗?或者,我可能会遗漏一些更简单的东西?是否有可能使用Automake或某种转换器为我生成Android.mk文件来自已包含在tar.gz中的unix makefile?
由于 Safari 的支持不佳,在网络上使用无专利的音频和视频编解码器一直存在问题。不过,根据Safari 15 发行说明,这种情况可能会开始改变。iPadOS 15 上的 MSE 显然现在支持 WebM 视频,WebM 容器也支持 Opus 音频编解码器。
\n不过,根据Can I Use(WebM、Opus)的说法,i(Pad)OS 15 的情况并没有改变。在移动设备上,WebM 仅支持 WebRTC,而 Opus 仅在使用 CAF 容器时才有效。 xe2\x80\x94,其他浏览器不支持。
\n不幸的是,我的实验表明“我可以使用吗”是正确的。不过,我想知道是否有人可以解开这个谜团。发行说明是否像看起来的情况那样是错误的?我是否误解了发行说明?是否有一些技巧可以让您使用这些编解码器?
\n我想看看是否可以直接访问Opus使用getUserMedia或与最新浏览器类似的东西.
我一直在研究它,但没有很好的结果.
我知道Opus或Speex实际上都是在webkitSpeechRecognitionAPI中使用的.我想做语音识别,但使用我自己的服务器而不是谷歌.
我正在对 Opus 中的 DTX 选项进行一些研究:
不连续传输 (DTX) 可在静音或背景噪音期间降低比特率。启用 DTX 后,每 400 毫秒仅编码一帧。
我想知道是否有一种简单的方法可以让 Opus 在整个静音期间只对一帧进行编码,而不是每 400 毫秒编码一次无用的静音帧?
我想在无声或非语音活动期间产生“绝对”静音并最小化标题的开销,因此基本上安静的录音将产生一个几乎空的文件。
如果有其他编解码器可以做到这一点,我很高兴听到他们的消息。
我想用ffmpeg直接将音频(opus编解码器)流式传输到android设备.
在PC上我开始流:
./ffmpeg -re -stream_loop -1 -i akgld-c8mxm.opus -acodec libopus -ac 1 -ab 96k -vn -f rtp rtp://192.168.0.100:6000
Run Code Online (Sandbox Code Playgroud)
其中192.168.0.100 - 我手机的本地wifi地址.
在Android设备上我尝试播放流:
public void tryPlayStream() {
String ip = Utils.wifiIpAddress(this);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
StrictMode.setThreadPolicy(policy);
AudioManager audio = (AudioManager) getSystemService(AUDIO_SERVICE);
audio.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioGroup = new AudioGroup();
audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
InetAddress inetAddress;
try {
inetAddress = InetAddress.getByName(ip);
audioStream = new AudioStream(inetAddress);
audioStream.setCodec(AudioCodec.PCMA);
audioStream.setMode(RtpStream.MODE_RECEIVE_ONLY);
InetAddress inetAddressRemote = InetAddress.getByName(ip);
audioStream.associate(inetAddressRemote, 6000);
audioStream.join(audioGroup);
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
在logcat中我看到下一行:
E/AudioRecord: AudioFlinger could not …Run Code Online (Sandbox Code Playgroud) 在播放解码后的音频时,我设法制作了各种各样的声音,从潺潺到尖锐的恶魔吟唱.最接近的声音类似于在快进和播放中播放仅持续约15秒.我已尝试使用解码和AudioSystem API方法的大量参数组合,似乎没有任何工作.
那么,导致这种音频失真的原因是什么?
此文件的Opusinfo显示以下内容:
Processing file "test.opus"...
New logical stream (#1, serial: 00002c88): type opus
Encoded with libopus 1.1
User comments section follows...
ENCODER=opusenc from opus-tools 0.1.9
Opus stream 1:
Pre-skip: 356
Playback gain: 0 dB
Channels: 1
Original sample rate: 44100Hz
Packet duration: 20.0ms (max), 20.0ms (avg), 20.0ms (min)
Page duration: 1000.0ms (max), 996.8ms (avg), 200.0ms (min)
Total data length: 1930655 bytes (overhead: 1.04%)
Playback length: 4m:09.173s
Average bitrate: 61.99 kb/s, w/o overhead: 61.34 kb/s
Logical stream 1 ended …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 WAV 文件转换为 Opus,使用 Nodefs.readFile并将该缓冲区传递给@Discord/opus转换器。我既没有得到结果,也没有得到错误的解释以及错误的解释。这基本上是你在文档中的例子......对吗?
漏洞?按设计?还是我错过了什么?我希望会try/catch被调用,但不知何故错误被“吸收”,脚本只是默默退出。
在线示例:https : //codesandbox.io/s/funny-jones-d7sls?file=/src/index.js
const audioBuffer = await fs
.readFile(file)
.catch(err => console.log("Error reading input file:", err));
console.log("LENGTH:", audioBuffer.length); // all good so far...
const encoder = new OpusEncoder(41000, 2);
let encoded = null;
try {
console.log("Trying to encode..."); // log runs
encoded = encoder.encode(audioBuffer);
console.log("Encoded!"); // log doesn't run :(
} catch (err) {
console.log("Encoding failed:", err); // no error thrown... :'(
}
return encoded;
Run Code Online (Sandbox Code Playgroud)
更多细节:
我已经用最高质量的设置和多个 STUN/TURN 服务器进行了测试,但没有找到真正高质量的流。
根据我的经验,webRTC 总是具有波动且有限的带宽和高水平的背景噪音,无法达到 mp3/Shoutcast/Icecast 无线电流的质量。
有没有人找到一种通过 webRTC 提供真正高带宽音频流的方法,或者目前实际上不可能?
我只想获取仅在 webm 文件中的音频文件(使用 opus 编解码器)。我尝试搜索什么是 webm 格式,如何解析,但我无法很好地获取信息。我检查webm格式来自mkv,那么我应该先检查mkv吗?
只有一个 github 代码,但我找不到如何解析 webm 音频的方法。 https://github.com/webmproject/libwebm/tree/master/webm_parser