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 是一个枚举类型,定义了在视频解码过程中不同的帧丢弃策略。通过这些策略,可以控制在播放或处理视频时哪些帧需要被丢弃。这通常用于优化性能和减少内存使用,尤其是  在 需要实时播放或流媒体传输时。

  枚举值解释:

  1. IJK_AVDISCARD_NONE = -16

    • 描述:不丢弃任何帧,所有的帧都会被解码和处理。
    • 用途:这是默认行为,表示不丢弃任何帧,所有帧都进行解码处理。
  2. IJK_AVDISCARD_DEFAULT = 0

    • 描述:丢弃一些“无用”的数据包,例如AVI格式中的零大小数据包。
    • 用途:适用于丢弃一些不必要或空的数据包,确保只处理有用的有效视频数据。
  3. IJK_AVDISCARD_NONREF = 8

    • 描述:丢弃所有非参考帧(即不是关键帧或不对最终视频序列有贡献的帧)。
    • 用途:只保留参考帧(如关键帧),丢弃那些依赖于其他帧的帧,例如P帧和B帧。
  4. IJK_AVDISCARD_BIDIR = 16

    • 描述:丢弃所有双向帧(即依赖于前后帧的帧,通常是B帧)。
    • 用途:在视频编码中,双向帧(B帧)可以提高压缩率,但它们需要前后帧的参考。使用这个选项可以丢弃所有B帧,只保留I帧和P帧。
  5. IJK_AVDISCARD_NONKEY = 32

    • 描述:丢弃所有非关键帧(即仅保留I帧)。
    • 用途:通常用于丢弃所有P帧和B帧,只保留自包含的I帧(关键帧),这样的视频解码可以提高性能,尤其是在需要快速跳转或低延迟的场景下。
  6. 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) - 跳过所有帧,不进行解码
      完全跳过所有帧,不解码任何视频内容。这种设置一般用于只需获取视频元数据而不需播放视频的情况。

posted @ 2024-11-09 18:57  Fitz  阅读(35)  评论(0编辑  收藏  举报