【问题标题】:UWP AudioGraph AudioFileInputNode change pitchUWP AudioGraph AudioFileInputNode 改变音高
【发布时间】:2017-01-01 20:41:52
【问题描述】:

如何在 UWP 应用中更改 AudioGraph 节点的间距?

我正在尝试将应用程序从 WP7 移植到 uwp(Windows 10、Mobile)。 在我的 WP7 应用程序中,我使用代码:

SoundEffect soundEffect = //...(load sound effect).
SoundEffectInstance soundInstance = soundEffect.CreateInstance();
soundInstance.Pitch = pitch;

如何在 UWP 中使用AudioGraph

【问题讨论】:

    标签: c# audio uwp soundeffect


    【解决方案1】:

    到目前为止,您应该分享更多代码,但您想使用 AudioFileInputNode 中包含的 PlaybackSpeedFactor 属性:

    https://msdn.microsoft.com/en-us/library/windows/apps/windows.media.audio.audiofileinputnode.playbackspeedfactor

    目前,微软的 GitHub 上有使用 AudioGraph 的最佳示例: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/AudioCreation/cs/AudioCreation

    在最后一个链接的 FilePlayback 场景中,您所要做的就是添加此行以使音频文件的音高加倍:

     fileInput.PlaybackSpeedFactor = 2;
    

    您可以在程序中的任何位置实时进行此更改(例如,有一个控制播放速度的滑块)。这对于 AudioGraph 来说根本不是问题。您可能也可以通过将此值设置为负值来向后播放内容!

    【讨论】:

    • 我想在不改变速度的情况下改变音高。因为它在 WP7 中工作。
    【解决方案2】:

    您可能需要将 AudioFrame 数据通过傅立叶变换运行,将音高乘以某个因子,然后通过傅立叶变换运行。

    这里有一些获取框架的代码

    您在哪里定义图表 graph.QuantumStarted += Graph_QuantumStarted;

    [ComImport]
    [Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    
    unsafe interface IMemoryBufferByteAccess
    {
        void GetBuffer(out byte* buffer, out uint capacity);
    }
    
    private static void Graph_QuantumStarted(AudioGraph sender, object args)
    {
        AudioFrame frame = frameOutputNode.GetFrame();
        using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
        using (IMemoryBufferReference reference = buffer.CreateReference())
        {
            //Run Fourier and Adjust here
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 2017-02-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2020-08-13
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多