Android WebRtc 本地视频流无法在棉花糖上显示,但可以在棒棒糖上显示

2024-04-03

添加的库:

libjingle_peerconnection.jar (Version :1.7.0_101) libjingle_peerconnection_so.so

等级依赖性:

fi.vtt.nubomedia:utilities-android:1.0.1@aar

在 Lenovo K3 Note(Android 6 Marshmallow)上测试

Log:
================================================================================
09-15 15:36:10.585 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/mpeg-L2

09-15 15:36:10.590 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/x-adpcm-ms

09-15 15:36:10.595 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/x-adpcm-dvi-ima

09-15 15:36:10.605 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/ape

09-15 15:36:10.607 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/alac

09-15 15:36:10.609 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/ac3

09-15 15:36:10.611 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/eac3

09-15 15:36:10.614 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/eac3-joc

09-15 15:36:10.618 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/x-adpcm-ms

09-15 15:36:10.619 4103-4103/com.caprusit.capv W/AudioCapabilities: Unsupported mime audio/x-adpcm-dvi-ima

09-15 15:36:10.631 4103-4103/com.caprusit.capv W/VideoCapabilities: Unrecognized profile/level 32768/2 for video/mp4v-es

09-15 15:36:10.643 4103-4103/com.caprusit.capv W/VideoCapabilities: Unsupported mime video/x-ms-wmv

09-15 15:36:10.645 4103-4103/com.caprusit.capv W/VideoCapabilities: Unsupported mime video/divx

09-15 15:36:10.647 4103-4103/com.caprusit.capv W/VideoCapabilities: Unsupported mime video/divx3

09-15 15:36:10.649 4103-4103/com.caprusit.capv W/VideoCapabilities: Unsupported mime video/xvid

09-15 15:36:10.652 4103-4103/com.caprusit.capv W/VideoCapabilities: Unsupported mime video/flv1

09-15 15:36:10.800 4103-4712/com.caprusit.capv W/org.webrtc.Logging: WebRtcAudioManager: Invalid audio mode: MODE_NORMAL

09-15 15:36:10.873 4103-4719/com.caprusit.capv W/org.webrtc.Logging: WebRtcAudioManager: Invalid audio mode: MODE_NORMAL

09-15 15:36:11.224 4103-4702/com.caprusit.capv W/libEGL: [ANDROID_RECORDABLE] format: 2

09-15 15:36:11.250 4103-4747/com.caprusit.capv W/libEGL: [ANDROID_RECORDABLE] format: 2

09-15 15:36:11.889 4103-4702/com.caprusit.capv E/AndroidRuntime: FATAL EXCEPTION: GLThread 124856

Process: com.caprusit.capv, PID: 4103
                                                                 java.lang.RuntimeException: compileShader: GLES20 error: 1282

at org.webrtc.GlUtil.checkNoGLES2Error(GlUtil.java:29)

at org.webrtc.GlShader.compileShader(GlShader.java:37)

at org.webrtc.GlShader.<init>(GlShader.java:44)

at org.webrtc.GlRectDrawer$Shader.<init>(GlRectDrawer.java:104)

at org.webrtc.GlRectDrawer.prepareShader(GlRectDrawer.java:176)

at org.webrtc.GlRectDrawer.drawRgb(GlRectDrawer.java:135)

at com.caprusit.capv.CustomVideoRenderGui$YuvImageRenderer.draw(CustomVideoRenderGui.java:453)

at com.caprusit.capv.CustomVideoRenderGui$YuvImageRenderer.access$700(CustomVideoRenderGui.java:320)


at com.caprusit.capv.CustomVideoRenderGui.onDrawFrame(CustomVideoRenderGui.java:314)

at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1590)

at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1286)

09-15 15:36:12.621 4103-4110/com.caprusit.capv W/art: Suspending all threads took: 89.404ms

09-15 15:36:13.765 4103-4103/com.caprusit.capv E/libEGL: call to OpenGL ES API with no current context (logged once per thread)

使用以下代码设置视频和音轨:

public void setCamera() {

    localMS = factory.createLocalMediaStream("ARDAMS");

    if (pcParams.videoCallEnabled) {

        MediaConstraints videoConstraints = new MediaConstraints();
        videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxHeight", Integer.toString(pcParams.videoHeight)));
        videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxWidth", Integer.toString(pcParams.videoWidth)));
        videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxFrameRate", Integer.toString(pcParams.videoFps)));
        videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("minFrameRate", Integer.toString(pcParams.videoFps)));

        getVideoCapturer();
        videoSource = factory.createVideoSource(videoCapturer, videoConstraints);
        videoTrack = factory.createVideoTrack("ARDAMSv0", videoSource);
        localMS.addTrack(videoTrack);

    }

    audioSource = factory.createAudioSource(new MediaConstraints());
    audioTrack = factory.createAudioTrack("ARDAMSa0", audioSource);
    localMS.addTrack(audioTrack);

    mListener.onLocalStream(localMS, true);


}

使用下面的代码来检索 VideoCapturer:

private void createCapturer(CameraEnumerator enumerator) {
    final String[] deviceNames = enumerator.getDeviceNames();
    Logging.d(TAG, "Looking for front facing cameras.");

    for (String deviceName : deviceNames) {
        if (enumerator.isFrontFacing(deviceName)) {
            Logging.d(TAG, "Creating front facing camera capturer.");
            videoCapturer = enumerator.createCapturer(deviceName, null);

            if (videoCapturer != null) {

                System.out.println("deviceName = " + deviceName);
                return;

            }
        }
    }

    // Front facing camera not found, try something else
    Logging.d(TAG, "Looking for other cameras.");
    for (String deviceName : deviceNames) {
        if (!enumerator.isFrontFacing(deviceName)) {
            Logging.d(TAG, "Creating other camera capturer.");
            videoCapturer = enumerator.createCapturer(deviceName, null);

            if (videoCapturer != null) {
                return;
            }
        }
    }
}

使用以下代码更新自定义 VideoRenderGui:

                localStream.videoTracks.get(0).addRenderer(new VideoRenderer(localRender));

                localVideoRenderGui.update(localRender,
                        LOCAL_X_CONNECTING, LOCAL_Y_CONNECTING,
                        LOCAL_WIDTH_CONNECTING, LOCAL_HEIGHT_CONNECTING,
                        scalingType, true);

我们已将正确的 EGL 上下文传递给PeerConnectionFactory.setVideoHwAccelerationOptions打电话之前PeerConnectionFactory.createVideoSource

下面是代码。

    factory.setVideoHwAccelerationOptions(rootEglBase.getEglBaseContext(), rootEglBase.getEglBaseContext());
    localMS = factory.createLocalMediaStream("ARDAMS");

    if (pcParams.videoCallEnabled) {

        getVideoCapturer();

        videoSource = factory.createVideoSource(videoCapturer);
        videoCapturer.startCapture(pcParams.videoWidth, pcParams.videoHeight, pcParams.videoFps);
        videoTrack = factory.createVideoTrack("ARDAMSv0", videoSource);
        videoTrack.setEnabled(true);

        localMS.addTrack(videoTrack);

    }

    audioSource = factory.createAudioSource(new MediaConstraints());
    audioTrack = factory.createAudioTrack("ARDAMSa0", audioSource);
    localMS.addTrack(audioTrack);

    mListener.onLocalStream(localMS, true);        

Eglcontext是在您所在的活动上创建的SurfaceViewRenderer被建造。 它作为参数传递给setVideoHwAccelerationOptions method.

下面一行显示了如何创建 EGL 上下文

    rootEglBase = EglBase.create(); 

详情请参考以下链接:https://github.com/njovy/AppRTCDemo https://github.com/njovy/AppRTCDemo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android WebRtc 本地视频流无法在棉花糖上显示,但可以在棒棒糖上显示 的相关文章

  • 将roottools.jar导入Android Studio

    我正在尝试从这里导入 roottools https code google com p roottools https code google com p roottools jar 文件 到 Android Studio 项目 到目前为
  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • Android STFP 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的 Android 项目中使用 SFTP 安卓已经有了吗 SFTP 库 还是我必须实现它 I
  • 删除视图并重新创建它

    有没有办法删除设置的视图 setContentView R layout set map center mapView MapView findViewById R id mapview 如果我再次调用此视图 则会收到一条错误消息 java
  • 如何使用gradle这样的格式更改apk名称?

    当我使用 gradle 构建应用程序时 我想将 app release apk 文件名更改为如下所示 format appname of package name V version code yyMMdd R T explain appn
  • Android平台源码中哪里可以找到版本信息

    Android 平台源文件中的版本信息在哪里找到 我尝试查找 设置 gt gt 中列出的有关手机的一些信息 显示的一些信息包括固件版本 模块编号 基带版本 内核版本 你可以给它办理登机手续platform build core versio
  • NumberPicker 的格式化值在单击时消失

    我的 NumberPicker 在setDescendantFocusability FOCUS BLOCK DESCENDANTS 模式和setWrapSelectorWheel false 已关闭 我用一个简单的格式化程序格式化了我的
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • Android中如何将文件写入raw文件夹?

    我认为这是一个非常基本的问题 我目前正在编写这样的文件 File output new File exampleout mid 现在 我想将文件写入 myproject res raw 我读到我可以通过将完整的网址放在 中来做到这一点 但
  • 调试 Java InterruptedException,即查找原因

    在调试Android应用程序时 有时中断异常发生并使应用程序崩溃 我已经能够在默认异常处理程序上设置断点 但调用堆栈不提供信息 at java util concurrent locks AbstractQueuedSynchronizer
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • 返回主要活动(意图)时传递数据我做错了什么?

    我是安卓新手 这可能是最简单的问题 但我不明白这里出了什么问题 我试图创建一个通过意图传递值的基本示例 因此 当我关闭第二个活动时 我需要将数据传递到主活动 这是代码 意图测试1 主要活动 public void onClick View
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • 使用 DiffUtil 在 RecyclerView 上添加拖放

    我有一个从房间数据库更新的列表 我从 Room 收到更新的数据作为新列表 然后将其传递给列表适配器 https developer android com reference androidx recyclerview widget Lis
  • 如何在 Android 应用程序中使用多个 Graph API 获取 Facebook Notes 项目的评论?

    我想使用 Graph API 显示 Facebook 页面的注释项目以及这些评论和点赞 为此 我使用 Facebook SDK 中的 asyncFacebookRunner 步骤是这样的 调用 asyncFacebookRunner req
  • 以编程方式应用样式资源

    我没有找到一种以编程方式做到这一点的方法 所以我在这里发布这个问题 我也没有找到与此相关的任何问题 我有一个资源样式 在 res values styles xml 中定义 我想做的是使用 java 将这种样式应用到我正在操作的 View
  • 如何从webkit浏览器中检测Android版本和品牌?

    如何通过webkit浏览器检测Android版本和品牌 可靠吗 我相信你可以检查用户代理 但是 我认为它不安全 因为有很多方法可以用来欺骗用户代理 在谷歌上搜索这个问题给了我们很多答案 它甚至可以在默认浏览器上运行 您只需输入 about
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 如何在 Android 中保存 Edittext 中的文本而不丢失文本的粗体、斜体等功能

    我想做的就是从 Edittext 中获取文本 该文本具有粗体和斜体等功能 并将其保存在文本文件中 但是当我读回并显示它时 这些功能丢失了 它们不显示 如何通过将文本保存在文本文件或任何文件中来保持丰富的功能 您可以使用Html toHtml
  • Android BLE 扫描永远找不到设备

    几天以来 我尝试在我的应用程序中实现 BLE 连接 我知道我尝试连接的设备功能齐全 因此问题一定是我的代码 我用BluetoothLeScanner startScan 方法 但回调方法永远不会被调用 public void startSc

随机推荐

  • 在 OSX 上设置 PHPUnit

    尽管我确信其他人最终已经设法解决了这个问题 但我一直在关注各种文档 并且度过了一段艰难的时光 http www phpunit de manual current en installation html http www phpunit
  • 谷歌地图破坏 KML

    我已经创建了一些世界地区的 KML 文件 以便使用 Google 地图 API 进行显示 这一直工作正常 但最近有一个区域开始显示数据好像已损坏 你可以在这里明白我的意思 https drive google com file d 0B9u
  • jQuery 切换动画

    我有这个 jQuery document ready function panel hide login toggle function panel animate height 150 padding 20px 0 backgroundC
  • Bash 中常量的命名约定是什么?

    在 shell 脚本中 即使我使用Java or Python样式命名约定 我仍然不清楚命名常量 许多约定建议我使用 大写字母 和 下划线 一起命名常量 例如MY CONSTANT PI 但在Bash 这可能与环境变量 https stac
  • 使用 Yosup 时如何查找最新的 MD5、KEY 和 VERSION

    我发现在使用 yowsup 时出现 old version 错误时 向 Whatsapp 服务器注册有时会失败 Yosup 旧版本错误 https stackoverflow com questions 35877803 yowsup ol
  • GAE PHP 应用程序:无法找到包装器“gs”

    我正在编写一些非常简单的代码standardphp73 Google App 引擎环境 遵循此处的文档 https cloud google com appengine docs standard php googlestorage htt
  • Node-sass 不理解波浪号

    探索angular cli对于最近发布的 Angular2 的 RC1 我遇到了奇怪的问题 node sass在 sass 插件中angular cli不解析 在包名称之前抛出以下错误 Error File to import not fo
  • 非常简单的DNS服务器

    我有一台 Linux 服务器 有一个临时无线网络供客户端连接 连接后 我希望用户始终被重定向到它自己的 Web 服务器 无论他们输入什么 URL 最大的解决方案是设置一个完整的 DNS 服务器 使用 BIND 或等效服务器 但这似乎有点过头
  • QString 的运算符 <<

    为 QString 实现 std ostream operator lt lt std ostream stream const QString str stream lt lt str toAscii constData or strea
  • 浏览器也可以缓存嵌入的 Base64 图像吗?

    我想知道是否有任何现代浏览器实际上缓存了嵌入的图像 base64 字符串 这在不久的将来有可能吗 基于 W3C 或主要浏览器的官方文档 我不这么认为 因为你错过了Resource Identifier作为缓存图像的键 对于嵌入图像 您只有数
  • 使用 pandas 标记每组的每 N 行

    我有一个数据框 其中包含客户信息及其购买详细信息 我正在尝试添加一个新列 指示同一客户每进行第三次购买 下面给出的是数据框 customer name bill no date Mark 101 2018 10 01 Scott 102 2
  • input:not(:placeholder-shown) ~ 标签选择器不适用于自动填充

    我在输入字段中有浮动占位符 当我们未提供输入值时 占位符将出现在中心 如下图所示 电子邮件和密码为占位符 现在 当您向电子邮件提供值时 它确实如下所示 观察提供值后 电子邮件和密码已被提取 当浏览器开始从页面加载时保存的凭据 如用户名 电子
  • NSCalendar NSDateComponents weekofYear 返回 1,日期为 2014-12-31

    我想获得日期为 2014 12 31 的 weekofYear 但它总是返回 1 而不是 52 这是我的代码 NSCalendar calendar NSCalendar currentCalendar NSUInteger unitFla
  • 为什么 Google 的 pandas_datareader 不起作用?

    我尝试通过以下代码从谷歌财经获取数据 import pandas datareader data as wb import datetime as dt start dt datetime 2015 1 1 end dt datetime
  • nginx php 友好的 URL 重定向,不会干扰 index.php 导致 /index

    我尝试了很多不同的配置来启用任何以 php 结尾的请求的永久重定向 以重定向到不带 php 的自身 问题是 我无法获得将使用 index php 发送到任何目录的请求重定向到 而不是 index 的规则 Example 期望的行为 blog
  • 如何获取系统设备语言,swift iOS

    如何使用 swift iOS 获取系统设备语言 而不是应用程序语言 我没有遇到任何问题 我想从以下位置获取设备语言设置 gt 常规 gt 语言该用户将语言设置为 我尝试了下面的代码 let appLang Locale preferredL
  • 如何处理异步。护照和猫鼬的 findOrCreate 方法

    身份验证模块 Passport 需要 FindOrCreate 方法才能进行登录 我使用 mongoose 来保存我的用户 其架构如下 var UserSchema new Schema firstname String lastname
  • AspectJ Maven 插件无法编译我的项目

    我尝试使用aspectj maven插件使用aspectj编译器来编译项目 然后尝试将类打包到 war 文件中 不幸的是 它不适用于以下配置 pom xml
  • 限制属性的字符串长度

    当我试图找出一个更大的问题时出现了这个问题 为了简单起见 我省略了这个问题 我必须用 C 表示某种数据结构 它是一种用于与外部系统通信的协议 因此 它具有一系列具有预定义长度和整数 或其他更复杂的数据 的字符串 我们假设 SYSTEM fo
  • Android WebRtc 本地视频流无法在棉花糖上显示,但可以在棒棒糖上显示

    添加的库 libjingle peerconnection jar Version 1 7 0 101 libjingle peerconnection so so 等级依赖性 fi vtt nubomedia utilities andr