Ijkplayer skip_frame 什么意思?
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter",0);
// for codec option 'skip_loop_filter' and 'skip_frame' typedef enum IJKAVDiscard { /* We leave some space between them for extensions (drop some * keyframes for intra-only or drop just some bidir frames). */ IJK_AVDISCARD_NONE =-16, ///< discard nothing IJK_AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi IJK_AVDISCARD_NONREF = 8, ///< discard all non reference IJK_AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames IJK_AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes IJK_AVDISCARD_ALL = 48, ///< discard all } IJKAVDiscard;
IJKAVDiscard
是一个枚举类型,定义了在视频解码过程中不同的帧丢弃策略。通过这些策略,可以控制在播放或处理视频时哪些帧需要被丢弃。这通常用于优化性能和减少内存使用,尤其是 在 需要实时播放或流媒体传输时。
枚举值解释:
-
IJK_AVDISCARD_NONE = -16
- 描述:不丢弃任何帧,所有的帧都会被解码和处理。
- 用途:这是默认行为,表示不丢弃任何帧,所有帧都进行解码处理。
-
IJK_AVDISCARD_DEFAULT = 0
- 描述:丢弃一些“无用”的数据包,例如AVI格式中的零大小数据包。
- 用途:适用于丢弃一些不必要或空的数据包,确保只处理有用的有效视频数据。
-
IJK_AVDISCARD_NONREF = 8
- 描述:丢弃所有非参考帧(即不是关键帧或不对最终视频序列有贡献的帧)。
- 用途:只保留参考帧(如关键帧),丢弃那些依赖于其他帧的帧,例如P帧和B帧。
-
IJK_AVDISCARD_BIDIR = 16
- 描述:丢弃所有双向帧(即依赖于前后帧的帧,通常是B帧)。
- 用途:在视频编码中,双向帧(B帧)可以提高压缩率,但它们需要前后帧的参考。使用这个选项可以丢弃所有B帧,只保留I帧和P帧。
-
IJK_AVDISCARD_NONKEY = 32
- 描述:丢弃所有非关键帧(即仅保留I帧)。
- 用途:通常用于丢弃所有P帧和B帧,只保留自包含的I帧(关键帧),这样的视频解码可以提高性能,尤其是在需要快速跳转或低延迟的场景下。
-
IJK_AVDISCARD_ALL = 48
- 描述:丢弃所有帧,包括关键帧(I帧)。
- 用途:这是最极端的丢弃策略,会跳过整个视频流,通常用于某些不需要视频内容的场景,例如快速跳过视频或只关注音频流。
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_frame", 1);
2个设置常在一起使用,
skip_frame 设置选项如下:
-
0 (DEFAULT)
- 不跳帧,解码所有帧
默认值,解码所有的帧,包括关键帧和非关键帧。适用于需要完整视频内容的场景。 -
1 (NOKEY)
- 跳过非关键帧,只解码关键帧 (I 帧)
仅解码关键帧 (I 帧),跳过其他帧(如 P 帧和 B 帧)。这种模式适用于缩略图预览或实时回放场景。此模式下,跳过了大量依赖其他帧的复杂解码过程,因此能减少 CPU 和内存占用。 -
8 (ALL)
- 跳过所有帧,不进行解码
完全跳过所有帧,不解码任何视频内容。这种设置一般用于只需获取视频元数据而不需播放视频的情况。