我正在考虑如何设计一个循环,从互联网读取帧,输入到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_packet或avcodec_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周期。
发布于 2020-09-29 16:12:28
事件驱动,如下所示:
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)
});}https://stackoverflow.com/questions/64114447
复制相似问题