ijkplayer源码阅读02-播放协议

作者: 秦明Qinmin | 来源:发表于2017-06-06 19:41 被阅读484次

    概述

    ijkplayer 是Bilibili开发并开源的轻量级视频播放器,支持本地网络视频播放以及流媒体播放,支持iOS和Android平台。ijkplayer基于 FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。 FFmpeg 采用LGPL或GPL许可证,提供了录制、转换以及流化音视频的完整解决方案,包括了领先的音、视频编码库libavcodec等。

    特性

    platform | version | CPU| video-output|audio-output|hw-decoder
    :---:|:---:|:---:|:---:|:---:
    iOS | iOS 7.0+ | armv7, arm64, i386, x86_64|OpenGL ES 2.0|AudioQueue, AudioUnit|VideoToolbox (iOS 8+)
    Android | API 9+ | ARMv7a, ARM64v8a, x86 |NativeWindow, OpenGL ES 2.0|AudioTrack, OpenSL ES|MediaCodec (API 16+, Android 4.1+)

    IJKMediaPlayback

    IJKMediaPlayback是 ijkplayer 中最重要的协议。由于 ijkplayer 中有几种不同类型的播放器实现(如:基于AVPlayer实现的IJKAVMoviePlayerController,基于MPMoviePlayerController实现的IJKMPMoviePlayerController,基于FFmpeg实现的IJKFFMoviePlayerController)。为了统一播放行为,ijkplayer 使用了一套基本协议,使每种底层不同实现的播放器能为使用者提供统一的接口。

    @protocol IJKMediaPlayback <NSObject>
    
    - (void)prepareToPlay;
    - (void)play;
    - (void)pause;
    - (void)stop;
    - (BOOL)isPlaying;
    - (void)shutdown;
    - (void)setPauseInBackground:(BOOL)pause;
    
    // 视频画面
    @property(nonatomic, readonly)  UIView *view;
    // 重播次数
    @property(nonatomic)            NSTimeInterval currentPlaybackTime;
    @property(nonatomic, readonly)  NSTimeInterval duration;
    @property(nonatomic, readonly)  NSTimeInterval playableDuration;
    @property(nonatomic, readonly)  NSInteger bufferingProgress;
    
    @property(nonatomic, readonly)  BOOL isPreparedToPlay;
    @property(nonatomic, readonly)  IJKMPMoviePlaybackState playbackState;
    // 加载状态
    @property(nonatomic, readonly)  IJKMPMovieLoadState loadState;
    
    @property(nonatomic, readonly) int64_t numberOfBytesTransferred;
    // 视频原始尺寸
    @property(nonatomic, readonly) CGSize naturalSize;
    // 画面填充模式
    @property(nonatomic) IJKMPMovieScalingMode scalingMode;
    @property(nonatomic) BOOL shouldAutoplay;
    
    @property (nonatomic) BOOL allowsMediaAirPlay;
    @property (nonatomic) BOOL isDanmakuMediaAirPlay;
    @property (nonatomic, readonly) BOOL airPlayMediaActive;
    
    @property (nonatomic) float playbackRate;
    @property (nonatomic) float playbackVolume;
    
    // 视频截图
    - (UIImage *)thumbnailImageAtCurrentTime;
    
    #pragma mark Notifications
    
    #ifdef __cplusplus
    #define IJK_EXTERN extern "C" __attribute__((visibility ("default")))
    #else
    #define IJK_EXTERN extern __attribute__((visibility ("default")))
    #endif
    
    // -----------------------------------------------------------------------------
    //  MPMediaPlayback.h
    
    // Posted when the prepared state changes of an object conforming to the MPMediaPlayback protocol changes.
    // This supersedes MPMoviePlayerContentPreloadDidFinishNotification.
    IJK_EXTERN NSString *const IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification;
    
    // -----------------------------------------------------------------------------
    //  MPMoviePlayerController.h
    //  Movie Player Notifications
    
    // Posted when the scaling mode changes.
    IJK_EXTERN NSString* const IJKMPMoviePlayerScalingModeDidChangeNotification;
    
    // Posted when movie playback ends or a user exits playback.
    IJK_EXTERN NSString* const IJKMPMoviePlayerPlaybackDidFinishNotification;
    IJK_EXTERN NSString* const IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey; // NSNumber (IJKMPMovieFinishReason)
    
    // Posted when the playback state changes, either programatically or by the user.
    IJK_EXTERN NSString* const IJKMPMoviePlayerPlaybackStateDidChangeNotification;
    
    // Posted when the network load state changes.
    IJK_EXTERN NSString* const IJKMPMoviePlayerLoadStateDidChangeNotification;
    
    // Posted when the movie player begins or ends playing video via AirPlay.
    IJK_EXTERN NSString* const IJKMPMoviePlayerIsAirPlayVideoActiveDidChangeNotification;
    
    // -----------------------------------------------------------------------------
    // Movie Property Notifications
    
    // Calling -prepareToPlay on the movie player will begin determining movie properties asynchronously.
    // These notifications are posted when the associated movie property becomes available.
    IJK_EXTERN NSString* const IJKMPMovieNaturalSizeAvailableNotification;
    
    // -----------------------------------------------------------------------------
    //  Extend Notifications
    
    IJK_EXTERN NSString *const IJKMPMoviePlayerVideoDecoderOpenNotification;
    IJK_EXTERN NSString *const IJKMPMoviePlayerFirstVideoFrameRenderedNotification;
    IJK_EXTERN NSString *const IJKMPMoviePlayerFirstAudioFrameRenderedNotification;
    
    IJK_EXTERN NSString *const IJKMPMoviePlayerDidSeekCompleteNotification;
    IJK_EXTERN NSString *const IJKMPMoviePlayerDidSeekCompleteTargetKey;
    IJK_EXTERN NSString *const IJKMPMoviePlayerDidSeekCompleteErrorKey;
    IJK_EXTERN NSString *const IJKMPMoviePlayerDidAccurateSeekCompleteCurPos;
    IJK_EXTERN NSString *const IJKMPMoviePlayerAccurateSeekCompleteNotification;
    
    @end
    

    IJKMediaUrlOpenDelegate

    IJKMediaUrlOpenDelegate 在 IJKFFMoviePlayerController 使用,当 ijkplayer 打开HTTP、TCP等相关URL的时候会回调 - (void)willOpenUrl:(IJKMediaUrlOpenData*) urlOpenData 方法。

    @protocol IJKMediaUrlOpenDelegate <NSObject>
    - (void)willOpenUrl:(IJKMediaUrlOpenData*) urlOpenData;
    @end
    

    IJKMediaNativeInvokeDelegate

    IJKMediaNativeInvokeDelegate 在 IJKFFMoviePlayerController 使用,当FFmpeg 在处理相关事件(如:AVAPP_EVENT_WILL_HTTP_OPENAVAPP_EVENT_DID_HTTP_OPENAVAPP_EVENT_WILL_HTTP_SEEKAVAPP_EVENT_DID_HTTP_SEEK)的时候回调代理的 - (int)invoke:(IJKMediaEvent)event attributes:(NSDictionary *)attributes 方法。

    @protocol IJKMediaNativeInvokeDelegate <NSObject>
    - (int)invoke:(IJKMediaEvent)event attributes:(NSDictionary *)attributes;
    @end
    

    总结

    ijkplayer 里面的协议比较简单,协议的数量也不是很多。ijkplayer 提供了几种不同实现的播放器,虽然这几种播放器的实现不同,但都提供了统一的接口。因此,我们并不需要关心实现细节。

    Demo地址 : https://github.com/QinminiOS/ijkplayer

    相关文章

      网友评论

        本文标题:ijkplayer源码阅读02-播放协议

        本文链接:https://www.haomeiwen.com/subject/oheufxtx.html