问题描述
我遇到的问题是,我用于 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,这样就可以保持纵横比。