Пример #1
0
        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");
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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();
        }
Пример #4
0
        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;
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        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);
        }
Пример #9
0
 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;
 }
Пример #10
0
        /// <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);
        }
Пример #11
0
        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();
        }
Пример #12
0
        public Opus()
        {
            decoder = OpusDecoder.Create(48000, 1);

            encoder         = OpusEncoder.Create(48000, 1, OpusApplication.OPUS_APPLICATION_VOIP);
            encoder.Bitrate = 12000;
        }
Пример #13
0
 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;
     }
 }
Пример #14
0
        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);
        }
Пример #15
0
        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);
            }
        }
Пример #16
0
    // 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();
    }
Пример #17
0
 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);
 }
Пример #20
0
        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);
        }
Пример #21
0
        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);
        }
Пример #22
0
		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
		}
Пример #23
0
        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);
        }
Пример #24
0
 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);
 }
Пример #25
0
 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);
 }
Пример #26
0
        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)) { }
                }
        }
Пример #27
0
 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);
 }
Пример #28
0
 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);
 }
Пример #29
0
        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);
            }
        }
Пример #30
0
 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);
 }
Пример #31
0
 public void Stop_recording()
 {
     network.Closeconn();
     waveIn.StopRecording();
     waveIn.Dispose();
     waveIn = null;
     if (encoder != null)
     {
         encoder.Dispose();
         encoder = null;
     }
 }
Пример #32
0
        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);
        }