如何使用 SurfaceViewRenderer 通过 Android 自定义渲染器实现访问远程 WebRTC 视频轨道的纵横比?

问题描述

我遇到的问题是,我用于 Android SurfaceVieWrenderer 的 Xamarin Forms 自定义渲染器与它显示的远程视频的纵横比不同。这会导致视频两边的相等部分被切断。我曾尝试查看 SurfaceVieWrenderer 的 SurfaceChanged 事件,但宽度和高度与 SurfaceView 本身有关,而不是它作为接收器的视频轨道。

在对等连接观察者的 OnAddStream 函数中,我可以看到 MediaStream 对象和相关的远程 VideoTrack。以下是我认为最相关的代码区域:

public void OnAddStream(MediaStream p0)
    {
        System.Diagnostics.Debug.WriteLine($"{nameof(OnAddStream)}");
        try
        {
            var videoTracks = p0.VideoTracks.OfType<VideoTrack>(); 
            videoTracks.FirstOrDefault().AddSink(_remoteView);

            var theRemoteSurface = _remoteView.Holder.SurfaceFrame;

            var metrics = Resources.System.displayMetrics;

            // this is wrong and should be the remote video aspect ratio
            decimal remoteratio = decimal.Divide((theRemoteSurface.Right - theRemoteSurface.Left),(theRemoteSurface.Bottom - theRemoteSurface.Top));


            decimal myRatio = decimal.Divide(metrics.WidthPixels,metrics.HeightPixels);
            

            var audioTracks = p0.AudioTracks.OfType<AudioTrack>();
            audioTracks.FirstOrDefault().SetEnabled(true);
            audioTracks.FirstOrDefault().SetVolume(10);
        }
        catch (Exception ex)
        {

        }
    }

解决方法

我找到了解决问题的方法。我没有为 WebRTC android 包中的 SurfaceViewRenderer 创建自定义渲染器,而是为 Android.Widget.RelativeLayout 创建了一个。创建RelativeLayout 对象后,我创建了一个SurfaceViewRenderer 对象并使用AddView 方法将其添加到RelativeLayout。然后我将本机控件设置为 RelativeLayout,这样就可以保持纵横比。