使用的FFmpeg代码版本为3.2.
1、mov包括mov,mp4,m4a,3gp,3g2,mj2
2、ffplay播放mp4文件,seek之后发现seek_flags为0,在av_seek_frame的时候设置flags为1即AVSEEK_FLAG_BACKWARD。
3、seek_frame_internal调用av_find_default_stream_index得到index一般是视频index。
4、s->iformat->read_seek即mov_read_seek,其中mov_seek_stream得到sample。
5、mov_seek_stream中调用av_index_search_timestamp-> ff_index_search_timestamp
其中使用二分法得到与wanted_timestamp最邻近的两个entry a&b。
根据flags得到m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
如果不是AVSEEK_FLAG_ANY的情况,则从上面m的位置开始根据flag的方向找出最近的关键帧(entries[m].flags & AVINDEX_KEYFRAME)返回:
m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
若m==nb_entries则失败,返回-1.
6、在mov_read_seek中若VIDEO返回的sample为0,则再用AUDIO继续查找sample。
FFmpeg中mov/mp4 seek分析
最新推荐文章于 2023-08-05 14:28:48 发布