gpt4 book ai didi

c++ - 是否 avcodec_receive_frame 和 avcodec_send_packet block /如何设计 ffmpeg 解码循环?

转载 作者:行者123 更新时间:2023-12-04 22:50:09 29 4
gpt4 key购买 nike

我正在考虑如何设计一个循环,从互联网读取帧,馈送到 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 block 或 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)

});}




关于c++ - 是否 avcodec_receive_frame 和 avcodec_send_packet block /如何设计 ffmpeg 解码循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64114447/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com