我们使用Flash和RTMP编写了一个基于Web的讨论论坛,用于流式传输和录制。正如在网上多次讨论的那样(例如在SO上,有多个编解码器可用于这样的任务。主要是这些编解码器是Speex和Nellymoser,而Speex是出于多种原因的明显喜爱。
在我们的应用程序中,我们已明确将Speex设置为要选择的编解码器:
mic = Microphone.getEnhancedMicrophone();
mic.codec = SoundCodec.SPEEX;
这主要是有效的。但是,有时用户出现并使用Nellymoser进行流式传输,我无法理解。最后一个用户使用的是OSX 10.8,当前使用当前版本的Chrome或Firefox。这是我们已经在不同机器上使用了数百次的设置。必须有一个我没有看到的变量。
如何对Speex强制执行编解码器?我们需要禁止Nellymoser,因为它会产生许多问题(压缩不良,与Speex流无法正常合并,通常会损坏流,......)。
为了完整性(可能存在我没有看到的副作用),我将发布围绕上述两行的代码:
var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
options.mode = MicrophoneEnhancedMode.FULL_DUPLEX;
options.autoGain = false;
options.echoPath = 128;
options.nonLinearProcessing = true;
mic = Microphone.getEnhancedMicrophone();
mic.setSilenceLevel(0, 2000);
mic.codec = SoundCodec.SPEEX;
mic.encodeQuality = 7;
mic.framesPerPacket = 1;
mic.gain = 50;
mic.setUseEchoSuppression(true);
var ns: NetStream = new NetStream(nc);
ns.attachAudio(mic);
ns.publish(stream, "live");
netStreams.push(ns);