fpzeng / KSYStreamer_Android

金山云Android采集推流SDK(Livestream SDK),支持内置/自定义美颜(Beauty Filter)、美声(Beauty Voice)、软硬编(Software/Hardware Encoder) 、网络自适应(Network Auto Adapt)、混音(Voice Mixer)、混响(Reverb)、画中画(PIP)、连麦(RTC)、动态贴纸(Sticker)、大眼瘦脸(Bigger Eyes and Smaller Faces)
https://github.com/ksvc/KSYStreamer_Android/releases
730 stars 208 forks source link

关于自采集多声道pcm数据的问题 #283

Open typehm opened 6 years ago

typehm commented 6 years ago

我们项目需要自采集多声道的pcm后进行推流。 之前尝试了在AudioFilter中劫持替换pcm的方式,结果发现mic的源是单声道的,替换进去的数据会复制到左右声道去。 结果只好尝试自己加一路声频输入到AudioMixer中。

流程如下: 派生了一个SrcPin的子类。 将这个类的实例连接到AudioMixer的SinkPin上。 向这个类写入pcm数据,累积到一定量时调用这个类的onFrameAvailable的接口。

结果是,推出的流没有声音(streamer设置了静音),看起来新加的一路输入没有被混音。 但是整个过程没有看到错误或是有奇怪的日志输出。所以想问一下目前这个方案是不是可行的?如果可行,问题可能发生在哪里?

buliaoyin commented 6 years ago

你是没有自定义kit类?然后用了KSYStreamer类里面的setMuteAudio(true)? 这个接口会将所有音频静音。

如果只想静音mic采集到的数据,可以调用setVoiceVolume(0)

buliaoyin commented 6 years ago

另外,补充一点,用AudioFilter也是完全可以实现同样功能的,只要将这个AudioFilter的输出格式配置一下,比如要把声道数配成2,采样率也配成所输入pcm的采样率。 具体一点就是实现AudioFilterBase中的getOutFormat方法。

typehm commented 6 years ago

你是没有自定义kit类?然后用了KSYStreamer类里面的setMuteAudio(true)? 这个接口会将所有音频静音。

如果只想静音mic采集到的数据,可以调用setVoiceVolume(0)

没有静音,用的是dummyAudioCapture来输出空白pcm。

另外,补充一点,用AudioFilter也是完全可以实现同样功能的,只要将这个AudioFilter的输出格式配置一下,比如要把声道数配成2,采样率也配成所输入pcm的采样率。 具体一点就是实现AudioFilterBase中的getOutFormat方法。

这个方法我尝试一下,之前是直接继承自AudioFilterBase的,没有重写getOutFormat方法。

typehm commented 6 years ago

感谢,用AudioFilter,重载getOutFormat后解决了。 但是貌似不会重采样,只有把采样率设为和streamer设置的采样率一致时才正常。

buliaoyin commented 6 years ago

实际上不是跟streamer设置的采用率一致,而是需要跟dummyAudioCapture输出的采样率一致,你可以再添加一个resample的filter,也就是在这个替换filter之前再添加一个 AudioResampleFilter 先把dummyAudioCapture输出数据重采样成跟pcm数据一致。

上面的步骤应该不是必要的,只要把声道数跟采样率配置正确应该就可以满足需求了,建议你再确认下。

buliaoyin commented 6 years ago

你看下wiki首页的描述吧,特别是最下方的结构图: https://github.com/ksvc/KSYStreamer_Android/wiki#3-ksystreamer%E7%B1%BB%E7%9A%84%E7%BB%84%E7%BB%87%E6%96%B9%E5%BC%8F