예제 #1
0
 /// <summary>
 /// Generates a visualisation of an audio stream using the 'showfreqs' filter
 /// </summary>
 /// <param name="inputPath">Path to the input file containing the audio stream to visualise</param>
 /// <param name="outputPath">Path to output the visualised audio stream to</param>
 /// <param name="size">The Size of the outputted video stream</param>
 /// <param name="pixelFormat">The output pixel format (default is yuv420p)</param>
 /// <param name="mode">The visualisation mode (default is bar)</param>
 /// <param name="amplitudeScale">The frequency scale (default is lin)</param>
 /// <param name="frequencyScale">The amplitude scale (default is log)</param>
 /// <returns>IConversion object</returns>
 public async Task <IConversion> VisualiseAudio(string inputPath, string outputPath, VideoSize size,
                                                PixelFormat pixelFormat       = PixelFormat.yuv420p,
                                                VisualisationMode mode        = VisualisationMode.bar,
                                                AmplitudeScale amplitudeScale = AmplitudeScale.lin,
                                                FrequencyScale frequencyScale = FrequencyScale.log)
 {
     return(await Task.FromResult(Conversion.VisualiseAudio(inputPath, outputPath, size, pixelFormat, mode, amplitudeScale, frequencyScale)));
 }
예제 #2
0
        private void Update(EvaluationContext context)
        {
            var t = (float)EvaluationContext.BeatTime * SpeedFactor.GetValue(context);

            //var value = Value.GetValue(context);
            var amplitude      = Amplitude.GetValue(context);
            var period         = Period.GetValue(context);
            var offset         = Offset.GetValue(context);
            var phase          = Phase.GetValue(context);
            var amplitudeScale = AmplitudeScale.GetValue(context);

            Result.Value = new System.Numerics.Vector2(
                (float)Math.Sin(t / period.X + phase.X) * amplitude.X * amplitudeScale + offset.X,
                (float)Math.Sin(t / period.Y + phase.Y) * amplitude.Y * amplitudeScale + offset.Y
                );
        }
예제 #3
0
        public static IConversion VisualiseAudio(string inputPath, string outputPath, VideoSize size,
                                                 PixelFormat pixelFormat       = PixelFormat.yuv420p,
                                                 VisualisationMode mode        = VisualisationMode.bar,
                                                 AmplitudeScale amplitudeScale = AmplitudeScale.lin,
                                                 FrequencyScale frequencyScale = FrequencyScale.log)
        {
            IMediaInfo   inputInfo   = FFmpeg.GetMediaInfo(inputPath).GetAwaiter().GetResult();
            IAudioStream audioStream = inputInfo.AudioStreams.FirstOrDefault();
            IVideoStream videoStream = inputInfo.VideoStreams.FirstOrDefault();

            string filter = $"\"[0:a]showfreqs=mode={mode}:fscale={frequencyScale}:ascale={amplitudeScale},format={pixelFormat},scale={size.ToFFmpegFormat()} [v]\"";

            return(New()
                   .AddStream(audioStream)
                   .AddParameter($"-filter_complex {filter}")
                   .AddParameter("-map [v]")
                   .SetFrameRate(videoStream != null ? videoStream.Framerate : 30) // Pin framerate at the original rate or 30 fps to stop dropped or duplicated frames
                   .SetOutput(outputPath));
        }
예제 #4
0
        private void Update(EvaluationContext context)
        {
            var t = OverrideTime.IsConnected
                        ? OverrideTime.GetValue(context)
                        : (float)context.LocalFxTime * SpeedFactor.GetValue(context);

            //var value = Value.GetValue(context);
            var amplitude      = Amplitude.GetValue(context);
            var period         = Period.GetValue(context);
            var offset         = Offset.GetValue(context);
            var phase          = Phase.GetValue(context);
            var amplitudeScale = AmplitudeScale.GetValue(context);

            Result.Value = new Vector3(
                (float)Math.Sin(t / period.X + phase.X) * amplitude.X * amplitudeScale + offset.X,
                (float)Math.Sin(t / period.Y + phase.Y) * amplitude.Y * amplitudeScale + offset.Y,
                (float)Math.Sin(t / period.Z + phase.Z) * amplitude.Z * amplitudeScale + offset.Z
                );
        }
예제 #5
0
        public async Task VisualiseAudioTest(VideoSize size, PixelFormat pixelFormat, VisualisationMode mode, AmplitudeScale amplitudeScale, FrequencyScale frequencyScale)
        {
            string     output = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + FileExtensions.Mp4);
            IMediaInfo info   = await FFmpeg.GetMediaInfo(Resources.MkvWithAudio);

            IAudioStream audioStream = info.AudioStreams.First()?.SetCodec(AudioCodec.aac);

            IConversionResult conversionResult = await(await FFmpeg.Conversions.FromSnippet.VisualiseAudio(Resources.Mp4WithAudio, output, size, pixelFormat, mode, amplitudeScale, frequencyScale))
                                                 .Start();

            IMediaInfo resultFile = await FFmpeg.GetMediaInfo(output);

            // The resulting streams are 4 seconds longer than the original
            Assert.Equal(resultFile.VideoStreams.First().Duration, audioStream.Duration + TimeSpan.FromSeconds(4));
            Assert.Equal(resultFile.AudioStreams.First().Duration, audioStream.Duration + TimeSpan.FromSeconds(4));
            Assert.Equal(1920, resultFile.VideoStreams.First().Width);
            Assert.Equal(1080, resultFile.VideoStreams.First().Height);
        }