WebRTC点对点连接

7

我正在使用C++实现WebRTC点对点音频通话的连接。

我有两个线程:_worker_thread_signaling_thread。当我尝试通过调用方法webrtc::CreatePeerConnectionFactory()创建_peerConnectionFactory时,我的应用程序崩溃了。我该怎么做才能使它正常工作?

_signaling_thread.reset(new rtc::Thread());
if(!_signaling_thread->Start())
{
    printf("_signaling_thread is Failed");
    return;
}
_worker_thread.reset(new rtc::Thread());
if (!_worker_thread->Start()) {
    printf( "_worker_thread is Failed");
    return;
}

_peerConnectionFactory = webrtc::CreatePeerConnectionFactory(_worker_thread.get(),_signaling_thread.get(),NULL,NULL,NULL);

这是我得到的回溯信息:
* thread #15: tid = 0x17e516, 0x00000001008d5674 MyAPP`rtc::MessageQueue::Get(rtc::Message*, int, bool) + 816, stop reason =  EXC_BAD_ACCESS (code=1, address=0x100000038)                                              
* frame #0: 0x00000001008d5674 MyAPP`rtc::MessageQueue::Get(rtc::Message*, int, bool) + 816
frame #1: 0x00000001008e5fb0 MyAPP`rtc::Thread::ProcessMessages(int) + 100
frame #2: 0x00000001008e5e44 MyAPP`rtc::Thread::PreRun(void*) + 88
frame #3: 0x0000000199337b3c libsystem_pthread.dylib`_pthread_body + 156
frame #4: 0x0000000199337aa0 libsystem_pthread.dylib`_pthread_start + 1

这篇帖子中并没有问题,但它却被点赞了两次。我想知道是谁点的赞以及为什么。 - SergeyA
@SergeyA,我需要解决方案,为什么这对我不起作用,有没有什么方法可以解决这个问题?还有什么其他信息您需要了解,请告诉我。 - Aagman
不清楚回溯与发布的代码之间的关系。rtc::MessageQueue::Get中偏移量816发生了什么?为什么会调用这个函数以及在何时调用?根据pthread行,我猜想这是在后台线程中发生的。你能告诉我具体是哪个线程吗? - Austin Mullins
@AustinMullins - 'rtc::MessageQueue::Get' 这个方法会在我的信令线程启动时被调用。是的,有一个后台线程在调用上述代码,基本上这组代码是用于建立点对点的Webrtc连接。 - Aagman
你能编辑你的问题并包含Get方法吗?那里是段错误(Bad Access)的地方。 - Austin Mullins
@AustinMullins-这是WebRTC交付库的一部分。我们只需要从我们这一端启动线程。我的问题类似于此处讨论的问题[链接](https://code.google.com/p/webrtc/issues/detail?id=4196)。问题是由于WebRtc线程引起的。 - Aagman
1个回答

6

在查看WebRTC源代码中的PeerConnection示例后,我总是在创建线程之前初始化SSL模块,方法如下:

bool Core::Init() {
  rtc::InitializeSSL();
  rtc::InitRandom(rtc::Time());
  rtc::ThreadManager::Instance()->WrapCurrentThread();

  _signalingThread = new rtc::Thread();
  _workerThread = new rtc::Thread();

  _signalingThread->SetName("signaling_thread", NULL);
  _workerThread->SetName("worker_thread", NULL);

  if (!_signalingThread->Start() || !_workerThread->Start()) {
    return false;
  }

  _peerConnectionFactory =
      webrtc::CreatePeerConnectionFactory(_signalingThread,
                                          _workerThread,
                                          NULL, NULL, NULL).release();

  return true;
}

1
为什么要在peerConnectionFactory上调用release()方法? - Phylliida
是的,为什么要在peerConnectionFactory对象上调用.release()方法? - JSON
3
@Phylliida @JSON 返回值是std::unique_ptr,因此他想要拥有指针的所有权。 - ceztko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接