Android WebRTC 自定义远程和本地视图

Posted

技术标签:

【中文标题】Android WebRTC 自定义远程和本地视图【英文标题】:Android WebRTC customize remote and local view 【发布时间】:2015-11-15 08:40:22 【问题描述】:

我正在一个 android 项目中实现 webrtc,我基于这个示例 in github。

本示例使用 libjingle 库。这就是视频渲染视图的创建方式:

        // Create video renderers.
        VideoRendererGui.setView((GLSurfaceView)videoView, new Runnable() 
            @Override
            public void run() 
                createPeerConnectionFactory();
            
        );
        remoteRender = VideoRendererGui.create(
                REMOTE_X, REMOTE_Y,
                REMOTE_WIDTH, REMOTE_HEIGHT, scalingType, false);
        localRender = VideoRendererGui.create(
                LOCAL_X_CONNECTING, LOCAL_Y_CONNECTING,
                LOCAL_WIDTH_CONNECTING, LOCAL_HEIGHT_CONNECTING, scalingType, true);

我的问题是如何自定义remoteRenderlocalRender,以便在GLSurfaceView 中更改position 及其宽度和高度

编辑:

我做了一个监听器,我试过这个:

    @Override
    public void onWidthHeightChange(int width, int height) 
        VideoRendererGui.update(remoteRender,
                REMOTE_X-width, REMOTE_X-height,
                REMOTE_WIDTH-width, REMOTE_HEIGHT-height, scalingType, false);
        if (iceConnected) 
            VideoRendererGui.update(localRender,
                    LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED,
                    LOCAL_WIDTH_CONNECTED, LOCAL_HEIGHT_CONNECTED,
                    ScalingType.SCALE_ASPECT_FIT, true);
         else 
            VideoRendererGui.update(localRender,
                    LOCAL_X_CONNECTING, LOCAL_Y_CONNECTING,
                    LOCAL_WIDTH_CONNECTING, LOCAL_HEIGHT_CONNECTING, scalingType, true);
        
    

当我给宽度和高度都赋值 150 时,它给了我这个错误:

08-21 14:34:01.621    7636-7636/org.appspot.apprtc E/AppRTCDemoActivity﹕ Fatal error: glUseProgram: GLES20 error: 1281
    java.lang.RuntimeException: glUseProgram: GLES20 error: 1281
            at org.webrtc.GlUtil.checkNoGLES2Error(GlUtil.java:48)
            at org.webrtc.GlShader.useProgram(GlShader.java:123)
            at org.webrtc.GlRectDrawer.drawOes(GlRectDrawer.java:132)
            at org.webrtc.VideoRendererGui$YuvImageRenderer.draw(VideoRendererGui.java:371)
            at org.webrtc.VideoRendererGui$YuvImageRenderer.access$800(VideoRendererGui.java:131)
            at org.webrtc.VideoRendererGui.onDrawFrame(VideoRendererGui.java:722)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1522)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)

使用解决方案编辑 2:

当我查看mattm 的答案时,我明白他是对的。

当我搜索我的异常时,我发现它是从libjingle 库抛出的异常。我在 VideoRendererGui.java 第 368、347 行找到了这段代码,我找到了我的问题的解决方案。

根据以下代码添加视图高度和宽度时,它必须在这些范围内:

  /**
   * Creates VideoRenderer.Callbacks with top left corner at (x, y) and
   * resolution (width, height). All parameters are in percentage of
   * screen resolution.
   */
  public static YuvImageRenderer create(
      int x, int y, int width, int height) 
    // Check display region parameters.
    if (x < 0 || x > 100 || y < 0 || y > 100 ||
        width < 0 || width > 100 || height < 0 || height > 100 ||
        x + width > 100 || y + height > 100) 
      throw new RuntimeException("Incorrect window parameters.");
    

所以只要我遵循这些规则调用 VideoRendererGui.update(... 方法就可以完美运行

谢谢

【问题讨论】:

【参考方案1】:

就像更改字段一样简单

坐标:REMOTE_XREMOTE_Y,或LOCAL_X_CONNECTINGLOCAL_Y_CONNECTING, 或尺寸: REMOTE_WIDTHREMOTE_HEIGHTLOCAL_WIDTH_CONNECTINGLOCAL_HEIGHT_CONNECTING

如果您想在创建对象后更改渲染,请致电VideoRendererGui.update(remoteRender, ...)

【讨论】:

我试过了,但它没有用,有时它会崩溃,我会再试一次并给你反馈。谢谢 我已经找到崩溃的原因了 :) 谢谢 @Ultimo_m 我遇到了同样的问题是什么原因? @richashah 您提供的值不被接受,请检查我在问题上方的回答,或检查您调用文档的方法。尝试不同的值... 如何将 VideoRendererGui.setView(binding.remoteStreamView) 转换为surfaceview渲染?

以上是关于Android WebRTC 自定义远程和本地视图的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC 不显示远程媒体

使用 libjingle 在 android WebRTC 中自定义音频设备

iOS Swift - 如何获取本地和远程视频的纵横比?

WebRTC Native M96 SDK接口封装--setupLocalVideosetupRemoteVideo设置本地(远端)视图

WebRTC Native M96 SDK接口封装--setupLocalVideosetupRemoteVideo设置本地(远端)视图

WebRTC 无法在控制台上的 RTCPeerConnection 错误上执行“addIceCandidate”,但仍可以显示远程和本地视频