Beispiel #1
0
        /// <summary>
        /// Creates a new instance of <see cref="FFMpegWriter"/>.
        /// </summary>
        /// <param name="FileName">Path for the output file.</param>
        /// <param name="FrameRate">Video Frame Rate.</param>
        public FFMpegWriter(string FileName, IImageProvider ImageProvider, int FrameRate,
                            int VideoQuality, FFMpegVideoArgsProvider VideoArgsProvider,
                            int AudioQuality, FFMpegAudioArgsProvider AudioArgsProvider,
                            IAudioProvider AudioProvider, int Frequency = 44100, int Channels = 2)
        {
            _videoBuffer = new byte[ImageProvider.Width * ImageProvider.Height * 4];

            var audioPipeName = GetPipeName();
            var videoPipeName = GetPipeName();

            var videoInArgs  = $"-framerate {FrameRate} -f rawvideo -pix_fmt rgb32 -video_size {ImageProvider.Width}x{ImageProvider.Height} -i {pipePrefix}{videoPipeName}";
            var videoOutArgs = $"{VideoArgsProvider(VideoQuality)} -r {FrameRate}";

            string audioInArgs = "", audioOutArgs = "";

            if (AudioProvider != null)
            {
                audioInArgs  = $"-f s16le -acodec pcm_s16le -ar {Frequency} -ac {Channels} -i {pipePrefix}{audioPipeName}";
                audioOutArgs = AudioArgsProvider(AudioQuality);

                _audioPipe = new NamedPipeServerStream(audioPipeName, PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, 10000, 10000);
            }

            _ffmpegIn = new NamedPipeServerStream(videoPipeName, PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, 10000, 10000);

            _ffmpegProcess = FFMpegService.StartFFMpeg($"{videoInArgs} {audioInArgs} {videoOutArgs} {audioOutArgs} \"{FileName}\"");
        }
Beispiel #2
0
        /// <summary>
        /// Creates a new instance of <see cref="IRecorder"/> writing to <see cref="IAudioFileWriter"/>.
        /// </summary>
        /// <param name="audioWriter">The <see cref="IAudioFileWriter"/> to write to.</param>
        /// <param name="audioProvider">The audio source.</param>
        public Recorder(IAudioFileWriter audioWriter, IAudioProvider audioProvider)
        {
            _audioWriter   = audioWriter ?? throw new ArgumentNullException(nameof(audioWriter));
            _audioProvider = audioProvider ?? throw new ArgumentNullException(nameof(audioProvider));

            _audioProvider.DataAvailable += AudioProvider_DataAvailable;
        }
Beispiel #3
0
        /// <summary>
        /// Creates a new instance of <see cref="IRecorder"/> writing to <see cref="IAudioFileWriter"/>.
        /// </summary>
        /// <param name="AudioWriter">The <see cref="IAudioFileWriter"/> to write to.</param>
        /// <param name="AudioProvider">The audio source.</param>
        public Recorder(IAudioFileWriter AudioWriter, IAudioProvider AudioProvider)
        {
            _audioWriter   = AudioWriter ?? throw new ArgumentNullException(nameof(AudioWriter));
            _audioProvider = AudioProvider ?? throw new ArgumentNullException(nameof(AudioProvider));

            _audioProvider.DataAvailable += (s, e) => _audioWriter.Write(e.Buffer, 0, e.Length);
        }
Beispiel #4
0
        /// <summary>
        /// Creates a new instance of <see cref="IRecorder"/> writing to <see cref="IVideoFileWriter"/>.
        /// </summary>
        /// <param name="VideoWriter">The <see cref="IVideoFileWriter"/> to write to.</param>
        /// <param name="ImageProvider">The image source.</param>
        /// <param name="FrameRate">Video Frame Rate.</param>
        /// <param name="AudioProvider">The audio source. null = no audio.</param>
        public Recorder(IVideoFileWriter VideoWriter, IImageProvider ImageProvider, int FrameRate, IAudioProvider AudioProvider = null)
        {
            _videoWriter   = VideoWriter ?? throw new ArgumentNullException(nameof(VideoWriter));
            _imageProvider = ImageProvider ?? throw new ArgumentNullException(nameof(ImageProvider));
            _audioProvider = AudioProvider;

            if (FrameRate <= 0)
            {
                throw new ArgumentException("Frame Rate must be possitive", nameof(FrameRate));
            }

            _frameRate            = FrameRate;
            _congestionFrameCount = _frameRate * 2; // 2 seconds
            _maxFrameCount        = _frameRate * 4; // 4 seconds

            _continueCapturing = new ManualResetEvent(false);

            if (VideoWriter.SupportsAudio && AudioProvider != null)
            {
                AudioProvider.DataAvailable += AudioProvider_DataAvailable;
            }
            else
            {
                _audioProvider = null;
            }

            _sw     = new Stopwatch();
            _frames = new BlockingCollection <IBitmapFrame>();

            _recordTask = Task.Factory.StartNew(async() => await DoRecord(), TaskCreationOptions.LongRunning);
            _writeTask  = Task.Factory.StartNew(DoWrite, TaskCreationOptions.LongRunning);
        }
Beispiel #5
0
        /// <summary>
        /// Initializes a new AudioManager class.
        /// </summary>
        /// <param name="audioInitializer">The AudioInitializer.</param>
        internal AudioManager(IAudioInitializer audioInitializer)
        {
            _audioEffectGroups = new List <AudioEffectGroup>();
            var logger = LogManager.GetClassLogger();

            if (audioInitializer == null)
            {
                logger.Warn("The specified audio initializer was null.");
            }
            else if (!audioInitializer.IsSupported)
            {
                logger.Warn("The specified AudioProvider is not supported.");
            }
            else
            {
                AudioInitializer = audioInitializer;
                _audioProvider   = audioInitializer.Create();
                _audioProvider.PlaybackChanged += PlaybackChanged;


#if DEBUG
                var metadata = MetaDataReader.ReadMetaData(_audioProvider);
                if (metadata.ContainsKey("Name"))
                {
                    logger.Info("Audiosystem initialized with {0}.", metadata["Name"]);
                }
                else
                {
                    logger.Info("Audiosystem initialized with unknown.");
                }
#endif
            }
        }
Beispiel #6
0
        /// <summary>
        /// Initializes a new AudioManager class.
        /// </summary>
        /// <param name="audioInitializer">The AudioInitializer.</param>
        internal AudioManager(IAudioInitializer audioInitializer)
        {
            _audioEffectGroups = new List<AudioEffectGroup>();
            var logger = LogManager.GetClassLogger();

            if (audioInitializer == null)
            {
                logger.Warn("The specified audio initializer was null.");
            }
            else if (!audioInitializer.IsSupported)
            {
                logger.Warn("The specified AudioProvider is not supported.");
            }
            else
            {
                AudioInitializer = audioInitializer;
                _audioProvider = audioInitializer.Create();
                _audioProvider.PlaybackChanged += PlaybackChanged;

            #if DEBUG
                var metadata = MetaDataReader.ReadMetaData(_audioProvider);
                if (metadata.ContainsKey("Name"))
                {
                    logger.Info("Audiosystem initialized with {0}.", metadata["Name"]);
                }
                else
                {
                    logger.Info("Audiosystem initialized with unknown.");
                }
            #endif
            }
        }
Beispiel #7
0
        /// <summary>
        /// Creates a new instance of <see cref="IRecorder"/> writing to <see cref="IVideoFileWriter"/>.
        /// </summary>
        /// <param name="VideoWriter">The <see cref="IVideoFileWriter"/> to write to.</param>
        /// <param name="ImageProvider">The image source.</param>
        /// <param name="FrameRate">Video Frame Rate.</param>
        /// <param name="AudioProvider">The audio source. null = no audio.</param>
        public Recorder(IVideoFileWriter VideoWriter, IImageProvider ImageProvider, int FrameRate, IAudioProvider AudioProvider = null)
        {
            _videoWriter   = VideoWriter ?? throw new ArgumentNullException(nameof(VideoWriter));
            _imageProvider = ImageProvider ?? throw new ArgumentNullException(nameof(ImageProvider));
            _audioProvider = AudioProvider;

            _frameRate = FrameRate;

            _continueCapturing = new ManualResetEvent(false);

            if (VideoWriter.SupportsAudio && AudioProvider != null)
            {
                AudioProvider.DataAvailable += AudioProvider_DataAvailable;
            }
            else
            {
                _audioProvider = null;
            }

            _sw     = new Stopwatch();
            _frames = new BlockingCollection <Bitmap>();

            _recordTask = Task.Factory.StartNew(DoRecord, TaskCreationOptions.LongRunning);
            _writeTask  = Task.Factory.StartNew(DoWrite, TaskCreationOptions.LongRunning);
        }
Beispiel #8
0
 public void Removed(IAudioProvider provider)
 {
     lock (_locker)
     {
         _providers.Remove(provider);
     }
 }
Beispiel #9
0
        /// <summary>
        /// Initialises the <see cref="IVideoFileWriter"/>. Usually called by an <see cref="IRecorder"/>.
        /// </summary>
        /// <param name="ImageProvider">The Image Provider.</param>
        /// <param name="FrameRate">Video Frame Rate.</param>
        /// <param name="AudioProvider">The Audio Provider (not supported with GIF).</param>
        public void Init(IImageProvider ImageProvider, int FrameRate, IAudioProvider AudioProvider)
        {
            DefaultFrameDelay = 1000 / FrameRate;

            DefaultWidth  = ImageProvider.Width;
            DefaultHeight = ImageProvider.Height;
        }
Beispiel #10
0
        /// <summary>
        /// Creates a new instance of <see cref="IRecorder"/> writing to <see cref="IVideoFileWriter"/>.
        /// </summary>
        /// <param name="videoWriter">The <see cref="IVideoFileWriter"/> to write to.</param>
        /// <param name="imageProvider">The image source.</param>
        /// <param name="frameRate">Video Frame Rate.</param>
        /// <param name="audioProvider">The audio source. null = no audio.</param>
        public Recorder(IVideoFileWriter videoWriter, IImageProvider imageProvider, int frameRate, IAudioProvider audioProvider = null)
        {
            _videoWriter   = videoWriter ?? throw new ArgumentNullException(nameof(videoWriter));
            _imageProvider = imageProvider ?? throw new ArgumentNullException(nameof(imageProvider));
            _audioProvider = audioProvider;

            _cancellationTokenSource = new CancellationTokenSource();
            _cancellationToken       = _cancellationTokenSource.Token;

            if (frameRate <= 0)
            {
                throw new ArgumentException("Frame Rate must be possitive", nameof(frameRate));
            }

            _frameRate = frameRate;

            _continueCapturing = new ManualResetEvent(false);

            if (videoWriter.SupportsAudio && audioProvider != null)
            {
                audioProvider.DataAvailable += AudioProvider_DataAvailable;
            }
            else
            {
                _audioProvider = null;
            }

            _sw = new Stopwatch();

            _recordTask = Task.Factory.StartNew(async() => await DoRecord(), TaskCreationOptions.LongRunning);
        }
Beispiel #11
0
 public void Append(IAudioProvider provider)
 {
     lock (_locker)
     {
         _providers.Add(provider);
     }
 }
Beispiel #12
0
        /// <summary>
        /// Creates Real-Time FFT analyzer.
        /// </summary>
        /// <param name="source">Specified audio provider.</param>
        /// <param name="fftLength">Length of FFT.</param>
        public LiveFftAnalyzer(IAudioProvider source, int fftLength = 16384, bool real = true)
        {
            _real     = real;
            FftLength = fftLength;

            _channels = source.ChannelCount();
            if (!IsPowerOfTwo(fftLength))
            {
                throw new ArgumentException("FFT Length must be a power of two");
            }

            _m         = (int)Math.Log(fftLength, 2.0);
            _fftLength = fftLength;

            FftPlan(_fftLength);

            _fftBuffer = new Complex[fftLength];
            _fftArgs   = new FftEventArgs(_fftBuffer);

            _source = source;
            _source.DataChunkRecieved += DataChunkRecieved;

            if (_source is IFloatProvider)
            {
                (_source as IFloatProvider).FloatChunkRecieved += FloatChunkRecieved;
            }

            WaveFormat = new WaveFormat(_source.SamplingRate(), _source.Bits(), _source.ChannelCount());
            _converter = new FloatConverter(_source.SamplingRate(), _source.Bits(), _source.ChannelCount());
            _step      = _channels * _converter.Step();
        }
Beispiel #13
0
        IVideoFileWriter GetVideoFileWriter(IImageProvider ImgProvider, IAudioProvider AudioProvider)
        {
            if (VideoViewModel.SelectedVideoSourceKind == VideoSourceKind.NoVideo)
            {
                return(null);
            }

            IVideoFileWriter videoEncoder = null;

            var encoder = VideoViewModel.SelectedVideoWriter.GetVideoFileWriter(_currentFileName, Settings.FrameRate, Settings.VideoQuality, ImgProvider, Settings.AudioQuality, AudioProvider);

            switch (encoder)
            {
            case GifWriter gif:
                if (Settings.GifUnconstrained)
                {
                    _recorder = new UnconstrainedFrameRateGifRecorder(gif, ImgProvider);
                }

                else
                {
                    videoEncoder = gif;
                }
                break;

            default:
                videoEncoder = encoder;
                break;
            }

            return(videoEncoder);
        }
Beispiel #14
0
 /// <summary>
 /// Setup audio playback.
 /// </summary>
 /// <param name="AudioOutput">The audio provider.</param>
 /// <param name="soundEnabled">Indicates if the sound playback is enabled or not.</param>
 /// <param name="frequency">The sound playback frequency in Hz. Preferred value is 44100 Hz</param>
 /// <param name="samplesCount">The buffer size in samples (bytes count / 2)</param>
 public static void SetupSoundPlayback(IAudioProvider AudioOutput, bool soundEnabled, int frequency, int samplesCount)
 {
     audio_playback_buffer_frequency = frequency;
     AudioOut     = AudioOutput;
     SoundEnabled = soundEnabled;
     audio_playback_blipbuffer_size = samplesCount;
     x = x_1 = 0;
 }
Beispiel #15
0
 /// <summary>
 /// Initiates this engine module using an <see cref="IAudioProvider"/> as a backend for selecting background soundtrack as well as the volume level for the sound.
 /// </summary>
 /// <param name="_p">A background soundtrack and volume provider.</param>
 /// <exception cref="ArgumentNullException">Thrown if <paramref name="_p"/> is null.</exception>
 public static void Init(IAudioProvider _p)
 {
     if (_p == null)
     {
         throw new ArgumentNullException("_p");
     }
     _provider = _p;
 }
Beispiel #16
0
        public BridgeRouter(IAudioProvider provider)
        {
            _locker = new object();
            _routes = new HashSet <IPEndPoint>();

            _provider           = provider;
            _provider.Received += OnProviderReceived;
        }
Beispiel #17
0
 public ManagedAudioProvider(IAudioProvider audioProvider)
 {
     if (audioProvider == null)
     {
         throw new ArgumentNullException("audioProvider");
     }
     this._audioProvider = audioProvider;
     this._cacheTable    = new ManagedAudioProvider.CacheEntry[4096];
 }
Beispiel #18
0
        /// <summary>
        /// Creates live audio recorder.
        /// </summary>
        /// <param name="provider">Specified audio provider.</param>
        public LiveAudioRecorder(IAudioProvider provider)
        {
            _provider = provider;

            _format = new WaveFormat(provider.SamplingRate(), provider.Bits(), provider.ChannelCount()); // must match the waveformat of the raw audio

            _bitRate = provider.Bits() * provider.ChannelCount() * provider.SamplingRate();
            _provider.DataChunkRecieved += AudioChunkRecieved;
        }
        IRecorder GetAudioRecorder(IAudioProvider AudioProvider)
        {
            var audioFileWriter = GetAudioFileWriter(
                FileName + extention,
                AudioProvider?.WaveFormat,
                80);

            return(new AudioRecorder(audioFileWriter, AudioProvider));
        }
        internal Narrator(Random random, INarrationSettings settings, IAudioProviderFactory factory, ITextToAudioProvider textToAudioProvider, IActivityDisplayProvider activityDisplayProvider)
        {
            _settings            = settings;
            _audioProvider       = factory.Create(settings);
            _textToAudioProvider = textToAudioProvider;
            _random = random;

            _activityDisplayProvider = activityDisplayProvider;
        }
Beispiel #21
0
        public MainPage()
        {
            InitializeComponent();

            animatedControl.ClearColor        = Colors.Transparent;
            animatedControl.TargetElapsedTime = TimeSpan.FromMilliseconds(16); // Make sure there are at least 60 frame per second.
            _audioProvider = new BassAudioPlayer();
            //_audioProvider = new AudioGraphProvider();
        }
        public BeatboxModel(int nbPad, IAudioProvider audioProvider)
        {
            var recorder = audioProvider.GetRecorder();

            for (var i = 0; i < nbPad; i++)
            {
                var player = audioProvider.CreatePlayer();
                Sounds.Add(new SoundModel(player, recorder));
            }
        }
Beispiel #23
0
        async void Dispose(bool TerminateRecord)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            _cancellationTokenSource.Cancel();

            // Resume record loop if paused so it can exit
            _continueCapturing.Set();

            // Ensure all threads exit before disposing resources.
            if (TerminateRecord)
            {
                _recordTask.Wait();
            }

            try
            {
                if (_frameWriteTask != null)
                {
                    await _frameWriteTask;
                }
            }
            catch { }

            try
            {
                if (_audioWriteTask != null)
                {
                    await _audioWriteTask;
                }
            }
            catch { }

            if (_audioProvider != null)
            {
                _audioProvider.Stop();
                _audioProvider.Dispose();
                _audioProvider = null;
            }

            _imageProvider?.Dispose();
            _imageProvider = null;

            _videoWriter.Dispose();
            _videoWriter = null;

            _audioBuffer = _silenceBuffer = null;

            _continueCapturing.Dispose();
        }
Beispiel #24
0
        private void Dispose(bool terminateRecord)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            if (_audioProvider != null)
            {
                _audioProvider.DataAvailable -= AudioProvider_DataAvailable;
                _audioProvider.Stop();
                _audioProvider.Dispose();
                _audioProvider = null;
            }

            if (_videoWriter != null)
            {
                _cancellationTokenSource.Cancel();

                // Resume record loop if paused so it can exit
                _continueCapturing.Set();

                if (terminateRecord)
                {
                    _recordTask.Wait();
                }

                try
                {
                    if (_task != null && !_task.IsCompleted)
                    {
                        _task.GetAwaiter().GetResult();
                    }
                }
                catch
                {
                    // Ignored in dispose
                }

                _videoWriter.Dispose();
                _videoWriter = null;

                _continueCapturing.Dispose();
            }
            else
            {
                _audioWriter.Dispose();
                _audioWriter = null;
            }

            _imageProvider?.Dispose();
            _imageProvider = null;
        }
Beispiel #25
0
        private int Read(IAudioProvider provider, float[] buffer)
        {
            if (!_samples.TryGetValue(provider, out var samples))
            {
                return(0);
            }

            Array.Copy(samples.ToArray(), buffer, buffer.Length);

            return(buffer.Length);
        }
        public void StartRecoding(String savePath)
        {
            FileSavePath = savePath + "BAR-" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".avi";

            //图像
            IImageProvider imgProvider = null;

            try
            {
                imgProvider = GetImageProvider();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                imgProvider?.Dispose();
                return;
            }
            //声音
            IAudioProvider audioProvider = null;

            try
            {
                Settings.Audio.Enabled = true;
                if (Settings.Audio.Enabled && !Settings.Audio.SeparateFilePerSource)
                {
                    audioProvider = _audioSource.GetMixedAudioProvider();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                _audioSource?.Dispose();
                return;
            }
            //视频写入
            IVideoFileWriter videoEncoder;

            try
            {
                videoEncoder = GetVideoFileWriterWithPreview(imgProvider, audioProvider);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);

                imgProvider?.Dispose();
                audioProvider?.Dispose();

                return;
            }

            _recorder = new Recorder(videoEncoder, imgProvider, Settings.Video.FrameRate, audioProvider);
            _recorder.Start();
        }
        IVideoFileWriter GetVideoFileWriterWithPreview(IImageProvider ImgProvider, IAudioProvider AudioProvider)
        {
            if (_videoViewModel.SelectedVideoSourceKind is NoVideoSourceProvider)
            {
                return(null);
            }

            _previewWindow.Init(ImgProvider.Width, ImgProvider.Height);

            return(new WithPreviewWriter(GetVideoFileWriter(ImgProvider, AudioProvider, FileSavePath), _previewWindow));
        }
Beispiel #28
0
 public void StopMusic()
 {
     if (_currentState == SpotifyState.Playing)
     {
         _currentState = SpotifyState.LoggedIn;
         Spotify.StopMusic();
         StopStream(_streamKey);
         LogOut();
         _provider = null;
     }
 }
Beispiel #29
0
 private void FormFourier_FormClosed(object sender, FormClosedEventArgs e)
 {
     if (_Reader != null)
     {
         _Reader.Dispose();
         _Reader = null;
     }
     if (_Provider != null)
     {
         _Provider.Dispose();
         _Provider = null;
     }
 }
Beispiel #30
0
 public void SetupSoundPlayback(IAudioProvider AudioOutput, bool soundEnabled, int frequency, int bufferSize,
                                int latencyInBytes)
 {
     audio_playback_latency      = latencyInBytes;
     audio_playback_bufferSize   = bufferSize;
     audio_playback_frequency    = frequency;
     audio_playback_sampleReload = audio_playback_samplePeriod / audio_playback_frequency;
     AudioOut     = AudioOutput;
     SoundEnabled = soundEnabled;
     x            = x_1 = y = y_1 = 0;
     audio_playback_first_render = true;
     audio_playback_buffer       = new byte[audio_playback_bufferSize];
 }
Beispiel #31
0
        public HITThread(uint TrackID, HITVM VM, HITResourceGroup Src)
        {
            this.VM        = VM;
            ResGroup       = Src;
            Owners         = new List <int>();
            Notes          = new List <HITNoteEntry>();
            NotesByChannel = new Dictionary <SoundEffectInstance, HITNoteEntry>();

            audContent = Content.Content.Get().Audio;
            SetTrack(TrackID);

            SimpleMode = true;
            PlaySimple = true; //play next frame, so we have time to set volumes.
        }
Beispiel #32
0
        /// <summary>
        /// Initializes a new AudioEffect class.
        /// </summary>
        /// <param name="audioSource">The AudioSource.</param>
        public AudioEffect(AudioSource audioSource)
        {
            AudioSource = audioSource;
            var audioInitializer = SGL.QueryComponents<AudioManager>().AudioInitializer;
            var logger = LogManager.GetClassLogger();

            if (audioInitializer == null)
            {
                logger.Warn("The specified audio initializer was null.");
            }
            else if (!audioInitializer.IsSupported)
            {
                logger.Warn("The specified AudioProvider is not supported.");
            }
            else
            {
                _audioProvider = audioInitializer.Create();
                _audioProvider.PlaybackChanged += PlaybackChanged;
            }
        }
Beispiel #33
0
 /// <summary>
 /// Setup audio playback.
 /// </summary>
 /// <param name="AudioOutput">The audio provider.</param>
 /// <param name="soundEnabled">Indicates if the sound playback is enabled or not.</param>
 /// <param name="frequency">The sound playback frequency in Hz. Preferred value is 44100 Hz</param>
 /// <param name="samplesCount">The buffer size in samples (bytes count / 2)</param>
 public static void SetupSoundPlayback(IAudioProvider AudioOutput, bool soundEnabled, int frequency, int samplesCount)
 {
     audio_playback_buffer_frequency = frequency;
     AudioOut = AudioOutput;
     SoundEnabled = soundEnabled;
     audio_playback_blipbuffer_size = samplesCount;
     x = x_1 = 0;
 }
 private async void AudioProvider_StateChanged(IAudioProvider sender, AudioPlayerPlayState e)
 {
     await UpdateAudioState();
 }
 private async void AudioProvider_TrackChanged(IAudioProvider sender, QuranAudioTrack request)
 {
     await UpdateAudioState();
 }