提升线程和FFmpeg:这样简单的代码给我错误C2064。我做错了什么?

时间:2010-11-08 19:58:50

标签: c++ multithreading class boost ffmpeg

我有一些类file.h,其中定义了public:bool frameSendingFinished;。 所以在类逻辑中我创建和编码视频帧,现在我想使用ffmpeg将它发送到某个服务器。我想发送单独的线程,所以在我的一个类函数(在file.cpp中)我做:

  if (frameSendingFinished)
  {
      boost::thread UrlWriteFrame(url_context, (unsigned char *)pb_buffer, len);
  }

 ....// some other functions code etc.

     void VideoEncoder::UrlWriteFrame( URLContext *h, const unsigned char *buf, int size )
{
    frameSendingFinished =false;
    url_write (h, (unsigned char *)buf, size);
    frameSendingFinished =true;
}

它可用于创建新线程。注释线程使其编译...

所以错误是error c2064 term does not evaluate to a function taking 2 arguments

那么 - 我应该怎样处理我的代码才能让我的课程得到提升?

1 个答案:

答案 0 :(得分:1)

当你写:

boost::thread UrlWriteFrame(url_context, (unsigned char *)pb_buffer, len);

创建名为UrlWriteFrame的boost :: thread对象,并将url_contextpb_bufferlen传递给boost :: thread构造函数。 boost :: thread的ctors之一需要一些可调用的函数(函数指针,函数对象)作为第一个参数,并将其他参数转发给该函数。在您的示例中,它最终会尝试类似:

url_context(pb_buffer, len);

这可能是触发“不评估为带2个参数的函数”错误的原因。

IIUC,您想在新线程中调用UrlWriteFrame函数。使用boost :: thread这样做的正确方法就是:

boost::thread (&VideoEncoder::UrlWriteFrame, this, url_context, (unsigned char *)pb_buffer, len);

(假设这是从VideoEncoder的一个方法中调用的)