首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >avcodec_receive_frame和avcodec_send_packet是否阻塞/如何设计ffmpeg解码循环?

avcodec_receive_frame和avcodec_send_packet是否阻塞/如何设计ffmpeg解码循环?
EN

Stack Overflow用户
提问于 2020-09-29 15:01:05
回答 1查看 371关注 0票数 2

我正在考虑如何设计一个循环,从互联网读取帧,输入到ffmpeg解码器,然后从ffmpeg接收并发送到渲染器。

考虑这个伪代码循环:

代码语言:javascript
复制
while true {
    auto packet = receive_packet_from_network();
    avcodec_send_packet(packet);
    auto frame = alloc_empty_frame();
    int r = avcodec_receive_frame(&frame);
    if (r==0) {
        send_to_render(frame);
    }
}

avcodec_send_packetavcodec_receive_frame是否阻塞或ffmpeg是否有内部线程?我担心这个循环,因为它等待来自网络的数据包,所以它有一些延迟。我想做一些类似这样的事情:

代码语言:javascript
复制
//thread 1
while true {
    auto packet = receive_packet_from_network();
    avcodec_send_packet(packet);
}
//thread 2
while true {
    auto frame = alloc_empty_frame();
    int r = avcodec_receive_frame(&frame);
    if (r==0) {
        send_to_render(frame);
    }
}

然而,现在,如果avcodec_receive_frame不阻塞,那么这个循环将运行得太快,每秒数百万次。

那么,我应该如何以最有效的方式设计ffmpeg中数据包的发送/接收呢?我不想像在thread2循环中那样花费cpu周期。

EN

回答 1

Stack Overflow用户

发布于 2020-09-29 16:12:28

事件驱动,如下所示:

代码语言:javascript
复制
while true {
auto packet = receive_packet_from_network();
std::async(std::launch::async, [packet]() {
    avcodec_send_packet(packet);
    auto frame = alloc_empty_frame();
    do{
       int r = avcodec_receive_frame(&frame);
       if (r == 0) {
        send_to_render(frame);
      }
    }while(r == 0)
   
});}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64114447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档