我正在尝试创建一个使用WebRTC的通用Windows平台应用程序,但是我的代码从未执行过第一个新的RTCPeerConnection.
我一直在研究UWP的开源项目WebRTC(blog post,带有git repos的链接),并设法构建和运行ChatterBox VoIP客户端示例.由于我是UWP编程和WebRTC(以及.NET,C#和Windows编程的新手)的新手,因此我在上述存储库中查看的示例过于复杂,以至于我无法理解.
首先,我想将WebRTC.org简约codelab exercise重新创建为用C#编写的UWP应用程序.原始的HTML / javascript创建了一个包含两个视频流的网页,一个是本地视频流,另一个是通过WebRTC发送的.但是,我的UWP代码甚至还没有创建第一个RTCPeerConnection.
我正在使用Visual Studio 2015并已为UWP安装了Nuget WebRTC软件包.
我的代码,第一个版本
public sealed partial class MainPage : Page
{
RTCPeerConnection _pc1;
public MainPage()
{
this.InitializeComponent();
}
// Code that is executed when ‘Call’ button is clicked
private async void uxCall_Click(object sender, RoutedEventArgs e)
{
/* GetDefaultList() returns List<RTCIceServer>, with Stun/Turn-servers borrowed from the ChatterBox-example */
var config = new RTCConfiguration() { IceServers = GetDefaultList() };
pc1 = new RTCPeerConnection(config);
Debug.WriteLine(“Never reaches this point”);
}
}
调试和打印输出显示,从未到达创建新RTCPeerConnection之后的语句.我以为可能无法在主线程上创建新的RTCPeerConnection,所以我更新了代码以在另一个线程上运行该代码.
我的代码,第二版
public sealed partial class MainPage : Page
{
RTCPeerConnection _pc1;
public MainPage()
{
this.InitializeComponent();
}
// Code that is executed when ‘Call’ button is clicked
private async void uxCall_Click(object sender, RoutedEventArgs e)
{
var config = new RTCConfiguration() { IceServers = GetDefaultList() };
_pc1 = await CreatePeerConnection(config);
Debug.WriteLine(“Never reaches this point”);
}
private async Task<RTCPeerConnection> CreatePeerConnection(RTCConfiguration config)
{
RTCPeerConnection pc;
Debug.WriteLine("Creating peer connection.");
pc = await Task.Run(() => {
// A thread for the anonymous inner function has been created here
var newpc = new RTCPeerConnection(config);
Debug.WriteLine("Never reaches this point");
return newpc;
});
return pc;
}
}
调试打印输出显示,在创建新的RTCPeerConnection之后,代码未到达该行.调试显示,为匿名内部函数创建的线程永远不会被破坏.我曾尝试在代码实验室练习中使用空的RTCConfiguration,但没有区别.
我对WebRTC,UWP和UWP中的异步/线程编程的经验不足,这使我很难确定错误的位置.任何帮助将不胜感激.
解决方法:
我终于找到问题了,解决方法是半途而废:
有一个静态方法Initialize(CoreDispatcher dispatcher),该方法使用分派器和辅助线程(在UWP WebRTC包装器中链接到definition)初始化WebRTC.创建新的RTCPeerConnection之前的以下语句解决了该问题.
WebRTC.Initialize(this.Dispatcher);
根据ChatterBox示例,在Windows 10中,可以将null而不是调度程序作为参数(code example).