public void OpusArchiveEncoderTest() { ExtendedArchiveWriter writer = new ExtendedArchiveWriter("opusencoder"); writer.Files.Add(new Subfile(new FileSource(WavTestFile), "audio.wav", "arc")); writer.Write("opusencodertest.ppx"); ExtendedArchive arc = new ExtendedArchive("opusencodertest.ppx"); var subfile = arc.Files.First(); Assert.AreEqual(ArchiveFileType.OpusAudio, subfile.Type); Assert.IsTrue(subfile.Name == "audio.opus", $"Internal name did not switch to \"audio.opus\". Actual: {subfile.Name}"); Assert.IsTrue(subfile.EmulatedName == "audio.wav", $"Emulated name did stay as \"audio.wav\". Actual: {subfile.EmulatedName}"); Assert.IsTrue(subfile.ArchiveName == "arc", $"Archive name did not stay as \"arc\". Actual: {subfile.ArchiveName}"); Assert.IsTrue(subfile.EmulatedArchiveName == "arc.pp", $"Emulated archive name did not change to \"arc.pp\". Actual: {subfile.EmulatedArchiveName}"); using (OpusEncoder decoder = new OpusEncoder(subfile.GetRawStream())) { Stream decoded = decoder.Decode(); //Ensure it can be read using (WaveReader wavreader = new WaveReader(decoded)) { } } File.Delete("opusencodertest.ppx"); }
internal void InitializeOpusEncoder() { if (Channel != null && Channel.Type == ChannelType.Voice) { if (Channel.Bitrate > 0) { mainOpusEncoder = new OpusEncoder(VoiceConfig.SampleRate, VoiceConfig.Channels, VoiceConfig.FrameLengthMs, (Channel.Bitrate / 1000), VoiceConfig.OpusMode); } else { mainOpusEncoder = new OpusEncoder(VoiceConfig.SampleRate, VoiceConfig.Channels, VoiceConfig.FrameLengthMs, null, VoiceConfig.OpusMode); } mainOpusEncoder.SetForwardErrorCorrection(true); msToSend = VoiceConfig.FrameLengthMs; } if (!VoiceConfig.SendOnly) { InitializeOpusDecoder(); } }
public static void Main(string[] args) { FileStream fileIn = new FileStream("C:\\Users\\lostromb\\Documents\\Visual Studio 2015\\Projects\\Concentus-git\\AudioData\\repro.raw", FileMode.Open); OpusEncoder encoder = new OpusEncoder(16000, 1, OpusApplication.OPUS_APPLICATION_AUDIO); encoder.Bitrate = (96000); encoder.ForceMode = (OpusMode.MODE_CELT_ONLY); encoder.SignalType = (OpusSignal.OPUS_SIGNAL_MUSIC); encoder.Complexity = (0); OpusDecoder decoder = new OpusDecoder(16000, 1); FileStream fileOut = new FileStream("C:\\Users\\lostromb\\Documents\\Visual Studio 2015\\Projects\\Concentus-git\\AudioData\\out_c.raw", FileMode.Create); int packetSamples = 960; byte[] inBuf = new byte[packetSamples * 2]; byte[] data_packet = new byte[1275]; while (fileIn.Length - fileIn.Position >= inBuf.Length) { int bytesRead = fileIn.Read(inBuf, 0, inBuf.Length); short[] pcm = BytesToShorts(inBuf, 0, inBuf.Length); int bytesEncoded = encoder.Encode(pcm, 0, packetSamples, data_packet, 0, 1275); //System.out.println(bytesEncoded + " bytes encoded"); int samplesDecoded = decoder.Decode(data_packet, 0, bytesEncoded, pcm, 0, packetSamples, false); //System.out.println(samplesDecoded + " samples decoded"); byte[] bytesOut = ShortsToBytes(pcm); fileOut.Write(bytesOut, 0, bytesOut.Length); } fileIn.Close(); fileOut.Close(); }
private async Task RunConnect() { var ct = ProcessCancel.Token; var taskSet = new HashSet <Task>(); var blockSize = (int)(Param.SamplingRate * Param.SampleLength); Logger.LogInformation($"[loop3] blockSize {blockSize}"); var audioInterval = (long)(10_000_000.0 * Param.SampleLength); Logger.LogInformation($"[loop3] audioInterval {audioInterval}"); var videoInterval = (long)(10_000_000.0 / Param.MaxFrameRate); Logger.LogInformation($"[loop3] videoInterval {videoInterval}"); var counter = new ElapsedTimeCounter(); using var audioWaiter = new Waiter(counter, audioInterval); using var videoWaiter = new Waiter(counter, videoInterval); using var buf = new IPCBuffer <float>(Param.EffectName, blockSize * 2 * Param.BufferCount, LoggerFactory); using var vstBufferPool = new BufferPool <VstBuffer2 <float> >(Param.BufferCount, () => new VstBuffer2 <float>(blockSize, 2, buf), LoggerFactory); using var pcmPool = new BufferPool <PcmBuffer <float> >(Param.BufferCount, () => new PcmBuffer <float>(blockSize, 2), LoggerFactory); using var audioPool = new BufferPool <OpusOutputBuffer>(Param.BufferCount, () => new OpusOutputBuffer(5000), LoggerFactory); using var pcmDrowPool = new BufferPool <PcmBuffer <float> >(Param.BufferCount, () => new PcmBuffer <float>(blockSize, 2), LoggerFactory); using var bmpPool = new BufferPool <H264InputBuffer>(Param.BufferCount, () => new H264InputBuffer(Param.Width, Param.Height), LoggerFactory); using var videoPool = new BufferPool <H264OutputBuffer>(Param.BufferCount, () => new H264OutputBuffer(200000), LoggerFactory); using var vst = new AudioMaster <float>(Param.SamplingRate, blockSize, LoggerFactory, counter, DllManager); using var toPcm = new ToPcm <float>(LoggerFactory, counter); using var opus = new OpusEncoder(SamplingRate.Sampling48000, Channels.Stereo, LoggerFactory, counter); using var fft = new FFTEncoder(Param.Width, Param.Height, Param.MaxFrameRate, LoggerFactory, counter); using var h264 = new H264Encoder(Param.Width, Param.Height, Param.TargetBitrate, Param.MaxFrameRate, LoggerFactory, counter); var effect = vst.AddEffect(Param.EffectName); using var ftl = new FtlIngest(StreamKey, IngestHostname, LoggerFactory, counter, audioInterval, videoInterval, default, CaInfoPath);
public void StopEncoding() { _waveIn?.Dispose(); _waveIn = null; _waveOut?.Dispose(); _waveOut = null; _playBuffer?.ClearBuffer(); _playBuffer = null; _encoder?.Dispose(); _encoder = null; _decoder?.Dispose(); _decoder = null; _playBuffer?.ClearBuffer(); _playBuffer = null; _speex?.Dispose(); _speex = null; _waveFile?.Dispose(); _waveFile = null; SpeakerMax = -100; MicMax = -100; }
/// <summary> /// Takes an ogg file and splits it down to a list of pcms /// </summary> /// <param name="fileName">The full file name</param> /// <returns>A list of byte arrays (pcms) that represent the full audio file</returns> public static List <byte[]> Extract(string fileName) { const int CHANNELS = 2; List <byte[]> samples = new List <byte[]>(); using (FileStream stream = File.Open($"./audio_files/{fileName}", FileMode.Open)) { OpusEncoder encoder = new OpusEncoder(48000, CHANNELS, Concentus.Enums.OpusApplication.OPUS_APPLICATION_AUDIO); OpusDecoder decoder = new OpusDecoder(48000, CHANNELS); OpusOggReadStream oggIn = new OpusOggReadStream(decoder, stream); while (oggIn.HasNextPacket) { short[] pcm = oggIn.DecodeNextPacket(); if (pcm != null) { byte[] outputBytes = new byte[1920 * 4]; int outputBytesLength = encoder.Encode(pcm, 0, 1920, outputBytes, 0, outputBytes.Length); outputBytes = outputBytes.Take(outputBytesLength).ToArray(); samples.Add(outputBytes); } } } return(samples); }
public byte[] Encode(byte[] data) { if (data == null) { throw new ArgumentNullException("data"); } if (this.encoder == null) { lock (this.codecLock) { if (this.encoder == null) { this.encoder = OpusEncoder.Create(this.settings.SampleRate, this.settings.Channels, Application.Voip); this.encoder.Bitrate = this.settings.Bitrate; } } } int encodedLength; byte[] encoded = this.encoder.Encode(data, data.Length, out encodedLength); if (encoded.Length != encodedLength) { byte[] final = new byte[encodedLength]; Buffer.BlockCopy(encoded, 0, final, 0, encodedLength); encoded = final; } return(encoded); }
internal LocalVoice(IVoiceFrontend client, byte id, IAudioStream audioStream, VoiceInfo voiceInfo, int channelId) { this.info = voiceInfo; this.channelId = channelId; this.opusEncoder = new OpusEncoder((SamplingRate)voiceInfo.SamplingRate, (Channels)voiceInfo.Channels, voiceInfo.Bitrate, OpusApplicationType.Voip, (POpusCodec.Enums.Delay)(voiceInfo.FrameDurationUs * 2 / 1000)); this.frontend = client; this.id = id; this.audioStream = audioStream; this.sourceSamplingRateHz = audioStream.SamplingRate; this.sourceFrameSize = this.info.FrameSize * this.sourceSamplingRateHz / (int)this.opusEncoder.InputSamplingRate; this.frameBuffer = new float[this.info.FrameSize]; if (this.sourceFrameSize == this.info.FrameSize) { this.sourceFrameBuffer = this.frameBuffer; } else { this.sourceSamplingRateHz = audioStream.SamplingRate; this.sourceFrameBuffer = new float[this.sourceFrameSize]; this.frontend.DebugReturn(DebugLevel.WARNING, "[PV] Local voice #" + this.id + " audio source frequency " + this.sourceSamplingRateHz + " and encoder sampling rate " + (int)this.opusEncoder.InputSamplingRate + " do not match. Resampling will occur before encoding."); } this.LevelMeter = new LevelMeter(this.sourceSamplingRateHz, this.info.Channels); //1/2 sec this.VoiceDetector = new VoiceDetector(this.sourceSamplingRateHz, this.info.Channels); // _debug_decoder = new OpusDecoder(this.InputSamplingRate, this.InputChannels); }
public Opus() { _decoder = OpusDecoder.Create(SAMPLE_RATE, CHANNEL_COUNT); _encoder = OpusEncoder.Create(SAMPLE_RATE, CHANNEL_COUNT, OpusPInvoke.Application.Voip); _encoder.InbandFec = true; _encoder.LossPercentage = 30; }
/// <summary> /// Constructs a stream that will accept PCM audio input, and automatically encode it to Opus and packetize it using Ogg, /// writing the output pages to an underlying stream (usually a file stream). /// You are allowed to change the encoding parameters mid-stream using the properties of the OpusEncoder; the only thing you /// cannot change is the sample rate and num# of channels. /// </summary> /// <param name="encoder">An opus encoder to use for output</param> /// <param name="outputStream">A base stream to accept the encoded ogg file output</param> /// <param name="fileTags">(optional) A set of tags to include in the encoded file</param> /// <param name="inputSampleRate">The actual real sample rate of your input data (NOT the encoder's sample rate). /// The opus encoder usually requires 48Khz input, but most MP3s and such will give you 44.1Khz. To get the /// sample rates to line up properly in this case, set the encoder to 48000 and pass inputSampleRate = 44100, /// and the write stream will perform resampling for you automatically (Note that resampling will slow down /// the encoding).</param> public OpusOggWriteStream(OpusEncoder encoder, Stream outputStream, OpusTags fileTags = null, int inputSampleRate = 0, int logicalStreamId = 0) { _encoder = encoder; if (_encoder.UseDTX) { throw new ArgumentException("DTX is not currently supported in Ogg streams"); } _inputSampleRate = inputSampleRate; if (_inputSampleRate == 0) { _inputSampleRate = _encoder.SampleRate; } if (logicalStreamId == 0) { logicalStreamId = new Random().Next(); } _logicalStreamId = logicalStreamId; _encoderSampleRate = encoder.SampleRate; _inputChannels = encoder.NumChannels; _outputStream = outputStream; _opusFrameIndex = 0; _granulePosition = 0; _opusFrameSamples = (int)((long)_encoderSampleRate * FRAME_SIZE_MS / 1000); _opusFrame = new short[_opusFrameSamples * _inputChannels]; _crc = new Crc(); _resampler = SpeexResampler.Create(_inputChannels, _inputSampleRate, _encoderSampleRate, 5); BeginNewPage(); WriteOpusHeadPage(); WriteOpusTagsPage(fileTags); }
void StartEncoding() { _startTime = DateTime.Now; _bytesSent = 0; _segmentFrames = 960; _encoder = OpusEncoder.Create(48000, 1, FragLabs.Audio.Codecs.Opus.Application.Voip); _encoder.Bitrate = 8192; _decoder = OpusDecoder.Create(48000, 1); _bytesPerSegment = _encoder.FrameByteCount(_segmentFrames); _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback()); _waveIn.BufferMilliseconds = 50; _waveIn.DeviceNumber = comboBox1.SelectedIndex; _waveIn.DataAvailable += _waveIn_DataAvailable; _waveIn.WaveFormat = new WaveFormat(48000, 16, 1); _playBuffer = new BufferedWaveProvider(new WaveFormat(48000, 16, 1)); _waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()); _waveOut.DeviceNumber = comboBox2.SelectedIndex; _waveOut.Init(_playBuffer); _waveOut.Play(); _waveIn.StartRecording(); if (_timer == null) { _timer = new Timer(); _timer.Interval = 1000; _timer.Tick += _timer_Tick; } _timer.Start(); }
public Opus() { decoder = OpusDecoder.Create(48000, 1); encoder = OpusEncoder.Create(48000, 1, OpusApplication.OPUS_APPLICATION_VOIP); encoder.Bitrate = 12000; }
public void Stop_it() { if (waveIn != null) { waveIn.StopRecording(); waveIn.Dispose(); waveIn = null; } network.Closeconn(); network = null; if (waveOut != null) { waveOut.Stop(); waveOut.Dispose(); waveOut = null; } notEncodedBuffer = new byte[0]; EncodedBuffer = new byte[0]; soundBuffer = new byte[0]; playBuffer = null; if (encoder != null) { encoder.Dispose(); encoder = null; } if (decoder != null) { decoder.Dispose(); decoder = null; } }
public override OpusFormat EncodeFromPcm16(Pcm16Format pcm16, OpusParameters config) { const int frameSize = 960; var encoder = new OpusEncoder(pcm16.SampleRate, pcm16.ChannelCount, OpusApplication.OPUS_APPLICATION_AUDIO); if (config.Bitrate > 0) { encoder.Bitrate = config.Bitrate; } int inPos = 0; int remaining = pcm16.SampleCount; short[] pcmData = pcm16.Channels.Interleave(1); // Encoded data shouldn't be larger than the input pcm var buffer = new byte[frameSize * pcm16.ChannelCount]; var frames = new List <OpusFrame>(); short[] encodeInput = pcmData; while (remaining >= 0) { int encodeCount = Math.Min(frameSize, remaining); if (remaining < frameSize) { encodeInput = new short[frameSize * pcm16.ChannelCount]; Array.Copy(pcmData, inPos, encodeInput, 0, encodeCount); inPos = 0; } int frameLength = encoder.Encode(encodeInput, inPos, frameSize, buffer, 0, buffer.Length); var frame = new OpusFrame(); frame.Length = frameLength; frame.Data = new byte[frameLength]; frame.FinalRange = encoder.FinalRange; frame.SampleCount = frameSize; Array.Copy(buffer, frame.Data, frameLength); frames.Add(frame); if (remaining == 0) { break; } remaining -= encodeCount; inPos += encodeCount * pcm16.ChannelCount; } OpusFormat format = new OpusFormatBuilder(pcm16.SampleCount, pcm16.SampleRate, pcm16.ChannelCount, encoder.Lookahead, frames) .WithLoop(pcm16.Looping, pcm16.LoopStart, pcm16.LoopEnd) .Build(); return(format); }
public void StartPreview(int mic, MMDevice speakers) { try { _waveOut = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 30); _buffBufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1)); _buffBufferedWaveProvider.ReadFully = true; RadioFilter filter = new RadioFilter(_buffBufferedWaveProvider.ToSampleProvider()); //add final volume boost to all mixed audio _volumeSampleProvider = new VolumeSampleProviderWithPeak(filter, (peak => SpeakerMax = peak)); _volumeSampleProvider.Volume = SpeakerBoost; _waveOut.Init(_volumeSampleProvider); _waveOut.Play(); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message); MessageBox.Show($"Problem Initialising Audio Output! Try a different Output device and please post your client log on the forums", "Audio Output Error", MessageBoxButton.OK, MessageBoxImage.Error); Environment.Exit(1); } try { //opus _encoder = OpusEncoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1, FragLabs.Audio.Codecs.Opus.Application.Voip); _encoder.ForwardErrorCorrection = false; _decoder = OpusDecoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1); _decoder.ForwardErrorCorrection = false; _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback()) { BufferMilliseconds = AudioManager.INPUT_AUDIO_LENGTH_MS, DeviceNumber = mic }; _waveIn.NumberOfBuffers = 2; _waveIn.DataAvailable += _waveIn_DataAvailable; _waveIn.WaveFormat = new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1); _waveIn.StartRecording(); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Input - Quitting! " + ex.Message); MessageBox.Show($"Problem Initialising Audio Input! Try a different Input device and please post your client log on the forums", "Audio Input Error", MessageBoxButton.OK, MessageBoxImage.Error); Environment.Exit(1); } }
// Use this for initialization void Start() { Debug.Log("start."); micBuffer = new List <float>(); if (true) { //data = new float[samples]; encoder = new OpusEncoder(opusSamplingRate, opusChannels); encoder.EncoderDelay = POpusCodec.Enums.Delay.Delay20ms; Debug.Log("Opustest.Start: framesize: " + encoder.FrameSizePerChannel + " " + encoder.InputChannels); // the encoder delay has some influence on the amount of data we need to send, but it's not a multiplication of it // 960byte * channel sizeになってる。 packageSize = encoder.FrameSizePerChannel * (int)opusChannels; //dataSendBuffer = new float[packageSize]; //encoder.ForceChannels = POpusCodec.Enums.ForceChannels.NoForce; //encoder.SignalHint = POpusCodec.Enums.SignalHint.Auto; //encoder.Bitrate = samplerate; //encoder.Complexity = POpusCodec.Enums.Complexity.Complexity0; //encoder.DtxEnabled = true; //encoder.MaxBandwidth = POpusCodec.Enums.Bandwidth.Fullband; //encoder.ExpectedPacketLossPercentage = 0; //encoder.UseInbandFEC = true; //encoder.UseUnconstrainedVBR = true; // setup a microphone audio recording Debug.Log("Opustest.Start: setup mic with " + Microphone.devices[micDeviceId] + " " + AudioSettings.outputSampleRate); audiorecorder = GetComponent <AudioSource>(); audiorecorder.loop = true; audiorecorder.clip = Microphone.Start( Microphone.devices[micDeviceId], true, 1, AudioSettings.outputSampleRate ); audiorecorder.Play(); } // playback stuff decoder = new OpusDecoder(opusSamplingRate, opusChannels); receiveBuffer = new List <float>(); // setup a playback audio clip, length is set to 1 sec (should not be used anyways) AudioClip myClip = AudioClip.Create( "MyPlayback", (int)opusSamplingRate, (int)opusChannels, (int)opusSamplingRate, true, OnAudioRead, // pcmreader callback. OnAudioSetPosition ); // ここでプレイすれば自分に入力したサウンドが聞こえてきたりするんだろうか // audioplayer.loop = true; // audioplayer.clip = myClip; // audioplayer.Play(); }
public CSCoreRecorder(MMDevice captureDevice, bool triggerSingleBlockRead, int bitrate, Application application) { _captureDevice = captureDevice; _triggerSingleBlockRead = triggerSingleBlockRead; _opusEncoder = OpusEncoder.Create(48000, 1, application); _opusEncoder.Bitrate = bitrate; _bytesPerSegment = _opusEncoder.FrameByteCount(SegmentFrames); }
public void StopEncoding() { if (_clientAudioMixer != null) { _effectsOutputBuffer = null; _volumeSampleProvider = null; _clientAudioMixer.RemoveAllMixerInputs(); _clientAudioMixer = null; } _clientsBufferedAudio.Clear(); if (_waveIn != null) { _waveIn.StopRecording(); _waveIn.Dispose(); _waveIn = null; } if (_waveOut != null) { _waveOut.Stop(); _waveOut.Dispose(); _waveOut = null; } if (_micWaveOut != null) { _micWaveOut.Stop(); _micWaveOut.Dispose(); _micWaveOut = null; } if (_encoder != null) { _encoder.Dispose(); _encoder = null; } if (_decoder != null) { _decoder.Dispose(); _decoder = null; } if (_tcpVoiceHandler != null) { _tcpVoiceHandler.RequestStop(); _tcpVoiceHandler = null; } _stop = true; SpeakerMax = 0; MicMax = 0; MessageHub.Instance.ClearSubscriptions(); }
public OpusEncoderManager(AudioOutputWriter aout, int sampleRate) { this.aout = aout; _bytesSent = 0; _segmentFrames = GlobalConfiguration.samplesPerPacket; //1024; //960; mEncoder = OpusEncoder.Create(sampleRate, 1, FragLabs.Audio.Codecs.Opus.Application.Voip); mEncoder.Bitrate = GlobalConfiguration.encoderBps; // 1KB/sec が最低値のようだ _bytesPerSegment = mEncoder.FrameByteCount(_segmentFrames); }
public const int BUFFER_SIZE = (8 * MAX_COMPRESSED_SIZE * FREQUENCY) / BITRATE; //20ms window public static OpusEncoder CreateEncoder() { var encoder = new OpusEncoder(FREQUENCY, 1, OpusApplication.OPUS_APPLICATION_VOIP); encoder.Bandwidth = OpusBandwidth.OPUS_BANDWIDTH_AUTO; encoder.Bitrate = BITRATE; encoder.SignalType = OpusSignal.OPUS_SIGNAL_VOICE; return(encoder); }
public Voice() { OnStatusChanged += EventOnStatusChanged; _decoder = OpusDecoder.Create((int)SampleRate, 1); _encoder = OpusEncoder.Create((int)SampleRate, 1, Application.Voip); _encoder.Bitrate = 8192 * 2; _bytesPerSegment = _encoder.FrameByteCount(StreamSize); }
public DiscordVoiceSocket(DiscordClient client, int timeout, int interval, bool isDebug) : base(client, timeout, interval, isDebug) { _connectWaitOnLogin = new ManualResetEventSlim(false); #if !DNXCORE50 _sendQueue = new ConcurrentQueue<Packet>(); _encoder = new OpusEncoder(48000, 1, 20, Application.Audio); #endif }
public ConcentusCodec() { _encoder = OpusEncoder.Create(48000, 1, OpusApplication.OPUS_APPLICATION_AUDIO); SetBitrate(_bitrate); SetComplexity(_complexity); SetVBRMode(_vbr, _cvbr); _encoder.EnableAnalysis = true; _decoder = OpusDecoder.Create(48000, 1); }
internal VoiceSocket(DiscordConfig config, AudioServiceConfig audioConfig, JsonSerializer serializer, Logger logger) : base(config, serializer, logger) { _audioConfig = audioConfig; _decoders = new ConcurrentDictionary <uint, OpusDecoder>(); _targetAudioBufferLength = _audioConfig.BufferLength / 20; //20 ms frames _encodingBuffer = new byte[MaxOpusSize]; _ssrcMapping = new ConcurrentDictionary <uint, ulong>(); _encoder = new OpusEncoder(48000, _audioConfig.Channels, 20, _audioConfig.Bitrate, OpusApplication.MusicOrMixed); _sendBuffer = new VoiceBuffer((int)Math.Ceiling(_audioConfig.BufferLength / (double)_encoder.FrameLength), _encoder.FrameSize); }
public VoiceWebSocket(DiscordWSClient client) : base(client) { _rand = new Random(); _decoders = new ConcurrentDictionary <uint, OpusDecoder>(); _targetAudioBufferLength = client.Config.VoiceBufferLength / 20; //20 ms frames _encodingBuffer = new byte[MaxOpusSize]; _ssrcMapping = new ConcurrentDictionary <uint, string>(); _encoder = new OpusEncoder(48000, 1, 20, Opus.Application.Audio); _sendBuffer = new VoiceBuffer((int)Math.Ceiling(client.Config.VoiceBufferLength / (double)_encoder.FrameLength), _encoder.FrameSize); }
public void OpusDecoderTest() { using (Stream opus = File.OpenRead(OpusTestFile)) using (OpusEncoder decoder = new OpusEncoder(opus)) { Stream decoded = decoder.Decode(); //Ensure it can be read using (WaveReader wavreader = new WaveReader(decoded)) { } } }
internal VoiceSocket(DiscordConfig config, AudioServiceConfig audioConfig, JsonSerializer serializer, Logger logger) : base(config, serializer, logger) { _audioConfig = audioConfig; _decoders = new ConcurrentDictionary<uint, OpusDecoder>(); _targetAudioBufferLength = _audioConfig.BufferLength / 20; //20 ms frames _encodingBuffer = new byte[MaxOpusSize]; _ssrcMapping = new ConcurrentDictionary<uint, ulong>(); _encoder = new OpusEncoder(48000, _audioConfig.Channels, 20, _audioConfig.Bitrate, OpusApplication.MusicOrMixed); _sendBuffer = new VoiceBuffer((int)Math.Ceiling(_audioConfig.BufferLength / (double)_encoder.FrameLength), _encoder.FrameSize); }
internal VoiceWebSocket(DiscordClient client, AudioClient audioClient, JsonSerializer serializer, Logger logger) : base(client, serializer, logger) { _audioClient = audioClient; _config = client.Audio().Config; _decoders = new ConcurrentDictionary <uint, OpusDecoder>(); _targetAudioBufferLength = _config.BufferLength / 20; //20 ms frames _encodingBuffer = new byte[MaxOpusSize]; _ssrcMapping = new ConcurrentDictionary <uint, ulong>(); _encoder = new OpusEncoder(48000, _config.Channels, 20, _config.Bitrate, OpusApplication.Audio); _sendBuffer = new VoiceBuffer((int)Math.Ceiling(_config.BufferLength / (double)_encoder.FrameLength), _encoder.FrameSize); }
internal OpusEncodeStream(AudioClient audioClient, byte[] secretKey, int samplesPerFrame, uint ssrc, int?bitrate = null, OpusApplication application = OpusApplication.MusicOrMixed, int bufferSize = 4000) : base(audioClient, secretKey, samplesPerFrame, ssrc, bufferSize) { _encoder = new OpusEncoder(SampleRate, Channels); _encoder.SetForwardErrorCorrection(true); if (bitrate != null) { _encoder.SetBitrate(bitrate.Value); } }
internal VoiceWebSocket(DiscordClient client, AudioClient audioClient, Logger logger) : base(client, logger) { _audioClient = audioClient; _config = client.Audio().Config; _decoders = new ConcurrentDictionary<uint, OpusDecoder>(); _targetAudioBufferLength = _config.BufferLength / 20; //20 ms frames _encodingBuffer = new byte[MaxOpusSize]; _ssrcMapping = new ConcurrentDictionary<uint, ulong>(); _encoder = new OpusEncoder(48000, _config.Channels, 20, _config.Bitrate, OpusApplication.MusicOrMixed); _sendBuffer = new VoiceBuffer((int)Math.Ceiling(_config.BufferLength / (double)_encoder.FrameLength), _encoder.FrameSize); }
public void Stop_recording() { network.Closeconn(); waveIn.StopRecording(); waveIn.Dispose(); waveIn = null; if (encoder != null) { encoder.Dispose(); encoder = null; } }
private Stream CompileMMX2(Stream basestream) { var mem = new MemoryStream(); using (var writer = new BinaryWriter(mem, Encoding.ASCII, true)) using (var wav = new WaveFileReader(basestream)) using (var res = new MediaFoundationResampler(wav, new WaveFormat( wav.WaveFormat.SampleRate < 24000 ? 24000 : 48000 , 1))) { var opus = OpusEncoder.Create(res.WaveFormat.SampleRate, 1, FragLabs.Audio.Codecs.Opus.Application.Voip); opus.Bitrate = PPeXCore.Settings.XggBitrate; int packetsize = (int)(res.WaveFormat.SampleRate * 2 * PPeXCore.Settings.XggFrameSize); writer.Write(Encoding.ASCII.GetBytes("XGG")); writer.Write(Version); writer.Write(packetsize); writer.Write(opus.Bitrate); long oldpos = mem.Position; ushort count = 0; writer.Write(count); byte[] uncompressed = new byte[10000 + (res.WaveFormat.AverageBytesPerSecond / wav.WaveFormat.AverageBytesPerSecond) * wav.Length]; byte[] buffer = new byte[packetsize]; int result = res.Read(buffer, 0, packetsize); int offset = 0; while (result > 0) { /* * count++; * int outlen = 0; * byte[] output = opus.Encode(buffer, result / 2, out outlen); * writer.Write((uint)outlen); * writer.Write(output, 0, outlen);*/ Array.Copy(buffer, 0, uncompressed, offset, result); offset += result; result = res.Read(buffer, 0, packetsize); } mem.Position = oldpos; writer.Write(count); } mem.Position = 0; _size = (uint)mem.Length; return(mem); }