最近在做视频解码相关的工作,有一个功能需要将整个视频解码之后放到内存里面,经测试,一分钟的视频解码需要20s,不算太理想,考虑用多线程来实现。
基本思路是获取所有关键帧信息,然后开启不同的线程来从不同的关键帧开始解码。
1,获取所有关键帧信息,获取所有的关键帧时间戳,大约会花费0.2s:
2,根据关键帧信息开启多个队列(这里为每5个关键帧开启一个队列,可以适当调整):
3,那么我们就需要一个有开始和结束时间戳的方法来实现区间解码:
这样就可以实现多线程的解码了,由于机器为双核,经测最后多线程解码的时间缩减为11s,还是很可观的。鉴于大部分视频长度都在30s左右,解码时间可以控制在五六秒的范围能,对于用户体验有不少的提升。
或者直接:av_dict_set(&opt, “threads”, “auto”, 0);
也可以实现多线程解码,当然这个是ffmpeg内部实现的。