如何使用Proxygen和Folly发送HTTP分块响应来模拟视频流?

时间:2015-06-15 14:02:43

标签: facebook http video-streaming chunked-encoding folly

我正在编写一个基于Facebooks Proxygen的HTTP视频流媒体服务器。没有寻求计划。使用proxygen::ResponseBuilder我能够将webm编码视频的块作为HTTP响应发送,即分块传输编码正在工作。我的问题是,Proxygen在发送响应头之前等待proxygen::ResponseBuilder::sendWithEOM()。我想在每次调用proxygen::ResponseBuilder::send()后实际发送数据。

我尝试使用evb->runInLoop()evb->runInEventBaseThread()

从EventBaseThread执行的lambda运行ResponseBuilder调用
using namespace folly;
using namespace proxygen;

std::thread t([&](){
    EventBase* evb = EventBaseManager::get()->getExistingEventBase();    
    // send headers ...
    while ( chunks avail. ) {
        //...
        evb->runInLoop([&](){
            ResponseBuilder(downstream_)
                     .body(std::move(chunk))
                     .send();
        });
        //... 
    }
    // sendWithEOM ...
});
t.detach();

此代码是从onRequest()的{​​{1}}方法调用的。我试图调用RequestHandler而不将其包装到ResponseBuilder::send()中,但是带有Folly v0.42.0的Proxygen v0.25.0禁止使用断言从另一个线程调用evb->runInLoop()。我从这里删除了这个断言:https://github.com/facebook/folly/blob/v0.42.0/folly/io/async/EventBase.cpp#L491

现在模拟的流媒体正在运行,但如果有并行请求,它就会崩溃。我想这并不意味着像这样使用,这就是断言的用途。但也许有人知道如何正确使用Proxygen基础设施用于我的用例?

2 个答案:

答案 0 :(得分:1)

这是同样的问题。我得到了类似的东西。

folly::EventBase* eventBase = folly::EventBaseManager::get()->getExistingEventBase();
thread t([&, eventBase]() {
    while( chunks exist ) {
        auto chunk = getChunk();    
        eventBase->runInEventBaseThread([&, chunk=chunk]() mutable {
            ResponseBuilder(downstream_).body(move(chunk)).send();
        });
    }
});
// sendWithEOM ...
t.detach();

答案 1 :(得分:0)

using namespace folly;
using namespace proxygen;

//Get Event Base in worker thread and pass it to new thread. If you call this inside new thread then you won't get worker thread's event base.
EventBase* evb = EventBaseManager::get()->getExistingEventBase();   
std::thread t([&, evb](){

// send headers ...
while ( chunks avail. ) {
    //...
    evb->runInLoop([&](){
        ResponseBuilder(downstream_)
                 .body(std::move(chunk))
                 .send();
    });
    //... 
}
// sendWithEOM ...
});
t.detach();

因此无需在EventBase源代码中评论断言。