AudioBuffer" getChannelData()"相当于MediaStream(或MediaStreamAudioSourceNode)?

时间:2016-10-28 23:19:15

标签: audio-recording web-audio audiocontext web-audio-api mediastream

我在mp3文件上使用AudioContext' decodeAudioData,这给了我一个AudioBuffer。有了这个音频缓冲区,我继续使用getChannelData()返回的数据在画布上绘制这个mp3文件的波形。

现在我想使用相同的代码绘制MediaStream的音频数据波形,这意味着我需要相同类型的输入/数据。我知道MediaStream包含实时信息,但必须有一种方法可以从MediaStream访问每个新数据

  

包含PCM数据的Float32Array

这是AudioBuffer' s getChannelData返回的内容。

我尝试用MediaStream包裹MediaStreamAudioSourceNode并将其反馈到AnalyserNode以使用getFloatFrequencyData()(返回Float32Array),但我可以告诉数据与我从getChannelData()获得的数据不同。也许它不是" PCM"数据?我怎样才能得到" PCM"数据?

希望这很清楚。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

首先,请注意AnalyserNode仅偶尔对数据进行采样,但不会处理所有数据。我认为这很适合您的场景,但只要知道如果您需要所有数据(例如,您正在缓冲音频),您今天就需要使用ScriptProcessor。

假设您只想要数据样本,可以使用AnalyserNode,但是应该调用getFloatTimeDomainData(),而不是getFloatFrequencyData()。这将为您提供PCM数据(FrequencyData为您提供PCM数据的FFT)。

答案 1 :(得分:1)

使用音频上下文创建MediaStreamDestination,然后从流中创建新的MediaRecorder,

...
public class AppConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    MyAuthenticationProvider myAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(new MyAuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class)
        ...
    }

    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(Arrays.asList(myAuthenticationProvider));
    }
}