java - 将 AudioStream 从 WebRTC 路由到应用层

标签 java android java-native-interface webrtc

  • 我有一个目标,即从 WebRTC 转换现有的 AudioStream。因此,我想将(仅用于示例)来自另一个应用程序的自定义噪音添加到已经工作的 PeerConnection 和本地流中。我的目标是为 Android 创建此更改,并构建 java 库。那么,是否有可能甚至改变 Native WebRTC?

  • 另一个问题,关于使用 WebRTC 构建自定义 native 更改。我想在 WebRTC 中添加我自己的功能。为此,我还应该更改构建脚本或类型,我该如何做到这一点?您能否就这件事提出建议,也许有一些文档,关于构建您自己的更改(以及其他系统,Android\iOS 中的下一个用法)?

更新

关于第一个问题,是否可以制作、抛出清晰的WebRTC版本(无需库定制)?例如,我们可以使用放入 PeerConnection 中的本地 AudioStream 对象进行操作吗?

还有第二个的附加更新。我们可以更改一些 WebRTC native C 代码,并继续使用 depot 工具脚本进行构建吗?或者我们也应该创建自己的脚本,用于生成 .so 和 .jar 库? Android 的变化又如何呢?如果 native C 源代码发生一些更改,我们如何为新的 .jar 库构建 JNI 更改?

最佳答案

1) Webrtc libjingle 使用 Android 框架仅用于捕获音频/视频数据。对于音频,它使用 android AudioRecord API 来录制来自手机麦克风的音频并将其传递到 native , native 以适当的格式对数据进行编码并将其传递到远程端。现在,将在代码中为您提供一些提示,例如您可以在哪里寻找引入自己的音频而不是使用手机麦克风的位置。检查“WebRtcAudioRecord.java”,其中我们使用AudioRecord框架来捕获麦克风数据,如下所示:

  int bytesRead = audioRecord.read(byteBuffer, byteBuffer.capacity()); 

这个相同的 byteBuffer 被传递到 native 进行音频编码并将其发送到远程端:

nativeCacheDirectBufferAddress(byteBuffer, nativeAudioRecord);

因此,您需要做的就是循环复制 byteBuffer 中的音频数据,而不是从麦克风读取。

2) 您可以按照所述构建 webrtc 源代码 here 。为了总结所有步骤,您可以使用以下脚本:

#!/bin/sh
set -e
export GYP_DEFINES="OS=android"
if [ -f .gclient ];
then
  echo "gclient exists so go ahead"
  cd src
else
  fetch --nohooks webrtc_android
  cd src
  git fetch --tags
  git checkout branch-heads/55  
  gclient sync
  ./build/install-build-deps.sh 
  ./build/install-build-deps-android.sh
  gclient sync
  gn gen out/x86  --args='target_os="android" target_cpu="x86" is_debug=false dcheck_always_on=true symbol_level=1 is_component_build=false'
  gn gen out/x64  --args='target_os="android" target_cpu="x64" is_debug=false dcheck_always_on=true symbol_level=1 is_component_build=false'
  gn gen out/arm64 --args='target_os="android" target_cpu="arm64" is_debug=false dcheck_always_on=true symbol_level=1 is_component_build=false'
  gn gen out/armv7 --args='target_os="android" target_cpu="arm" is_debug=false dcheck_always_on=true symbol_level=1 is_component_build=false' 
fi
ninja -C out/arm64
ninja -C out/armv7
ninja -C out/x86
ninja -C out/x64

此脚本将为所有架构构建 android libjingle v55,以便您可以在设备和模拟器上使用二进制文件。

关于java - 将 AudioStream 从 WebRTC 路由到应用层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42981629/

相关文章:

android - 获取安卓音频流

java - MATLAB + JNI = 错误?

java - 如何为 Apache Camel 路由的 Split 准备 Executor 服务,org.apache.camel.spi.ThreadPoolProfile 与 java.util.concurrent.ExecutorService

java - TrueZip 创建虚拟目录而不是存档

java - XmlPullParser - 以 XML 字符串形式获取节点内容

android - 如何在Android中获取没有上下文的资源?

java - JNI 对象指针

string - JNI程序中的jstring返回

JavaMail 和电子邮件帐户的连接

java - ArrayList的效率