繁体   English   中英

做 avcodec_receive_frame 和 avcodec_send_packet 块/如何设计 ffmpeg 解码循环?

[英]Do avcodec_receive_frame and avcodec_send_packet block / how to design ffmpeg decoding loop?

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

考虑这个伪代码循环:

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 有内部线程吗? 我担心这个循环,因为它等待来自网络的数据包,所以它有一些延迟。 我想做这样的事情:

//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 周期。

事件驱动,像这样:

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)
   
});}



      

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM