Skip to content

decoderMode

mayudong1 edited this page Nov 16, 2017 · 6 revisions

解码模式

金山云播放器提供了软解、硬解等多种视频解码方式, 可满足不同层次的需求。

一、解码方式

typedef NS_ENUM(NSUInteger, MPMovieVideoDecoderMode) {
    MPMovieVideoDecoderMode_Software = 0,
    MPMovieVideoDecoderMode_Hardware,
    MPMovieVideoDecoderMode_AUTO,
    MPMovieVideoDecoderMode_DisplayLayer,
};

v2.3.0及以上版本支持MPMovieVideoDecoderMode_DisplayLayer解码方式

  • MPMovieVideoDecoderMode_Software — 软件解码
  • MPMovieVideoDecoderMode_Hardware — 使用VideoToolBox进行硬件解码,目前只支持h.264视频格式,对于不支持的格式,则采用软解方式
  • MPMovieVideoDecoderMode_AUTO — 自动选择,对于iOS 8.0及以上的系统,优先采用硬解,不支持的情况下使用软解
  • MPMovieVideoDecoderMode_DisplayLayer — 使用AVSampleBufferDisplayLayer进行解码渲染,目前只支持h.264视频格式,对于不支持的格式或iOS8.0以下的系统,采用软解方式

二、说明

  1. 通过videoDecoderMode属性来设置/获取当前配置的解码方式,只在播放前配置生效;

  2. 当videoDecoderMode设置为MPMovieVideoDecoderMode_AUTO时,播放器只会在MPMovieVideoDecoderMode_Hardware和MPMovieVideoDecoderMode_Software两者中选择,如果希望使用MPMovieVideoDecoderMode_DisplayLayer模式,需要设置videoDecoderMode为MPMovieVideoDecoderMode_DisplayLayer方可生效;

  3. 实际采用的视频解码方式不一定就是配置的解码方式,真正使用的解码方式会通过MPMoviePlayerPlaybackStatusNotification消息发送出来,可从userInfo中获取实际使用的方式,若MPMoviePlayerPlaybackStatusUserInfoKey对应的值为MPMovieStatusHWCodecUsed,说明实际采用VideoToolBox硬件解码;若MPMoviePlayerPlaybackStatusUserInfoKey对应的值为MPMovieStatusSWCodecUsed,说明实际采用软件解码;若MPMoviePlayerPlaybackStatusUserInfoKey对应的值为MPMovieStatusDLCodecUsed,说明实际采用AVSampleBufferDisplayLayer解码渲染;

  4. 目前iOS在VideoToolBox和AVSampleBufferDisplayLayer解码时只支持h.264视频格式,如果播放非h.264格式的视频,则自动使用软解;

  5. 在使用VideoToolBox和AVSampleBufferDisplayLayer解码h.264视频格式时,如果无法正确解出视频帧,则会自动切换到软解;

  6. 使用AVSampleBufferDisplayLayer解码时,seek时请勿使用精准seek功能

三、性能及功能对比

性能 软解 VideoToolBox AVSamleBufferDisplayLayer
内存占用 最高 居中 最低
CPU占用 最高 居中 最低
温度 最高 居中 最低
耗电量 最高 居中 最低
功能 软解 VideoToolBox AVSamleBufferDisplayLayer
视频格式 全格式 H.264 H.264
双指缩放/旋转 支持 支持 支持
填充模式 支持 支持 支持(开始播放前配置生效)
画面旋转/镜像 支持 支持 不支持
截图 支持 支持 不支持
回调原始数据 支持 支持 不支持
录屏 支持 支持 不支持

四、示例代码

_player.videoDecoderMode = MPMovieVideoDecoderMode_Hardware;
Clone this wiki locally