WMPlayer无侵入扩展每秒执行的代理

  1. 写一个继承WMPlayerDelegate代理
  2. 写一个 WMPlayer的子类,重写syncScrubber函数。 PS: 源码的内部实现是用了一个 1 秒轮训的计时器,所以重写syncScrubber就好了。
  3. 使用MDFPlayer子类来使用。

示例代码

  1. WMPlayerDeleg1ate
/// 扩展出一个视频更新代理
@protocol MDFPlayerDelegate <WMPlayerDelegate>
@optional
// 每秒更新一次此代理
-(void)wmplayerProgressPlay:(WMPlayer *)wmplayer currentTime:(long long)currentTime;
@end
  1. 创建子类MDFPlayer
//.h
@interface MDFPlayer : WMPlayer

@property (nonatomic, weak)id <MDFPlayerDelegate> delegate;

@end

//.m
#import <objc/runtime.h>

@implementation MDFPlayer

@dynamic delegate;

- (void)syncScrubber {
    
    SEL superSelector = @selector(syncScrubber); // 获取父类的方法签名
    Method superMethod = class_getInstanceMethod(self.superclass, superSelector); // 获取父类的方法实现
    IMP superImp = method_getImplementation(superMethod); // 获取父类方法的具体实现
    
    if ([self respondsToSelector:superSelector]) {
        // 调用父类的方法
        ((void(*)(id, SEL))superImp)(self, superSelector); // 调用父类的syncScrubber方法
    }
    
    AVPlayerItem *item = [self valueForKey:@"currentItem"]; // 获取当前播放的AVPlayerItem对象
    if (item) {
        if ([self.delegate respondsToSelector:@selector(wmplayerProgressPlay:currentTime:)]) {
            // 计算当前播放时间(单位:秒)
            long long nowTime = item.currentTime.value/item.currentTime.timescale;
            // 通过delegate更新播放进度
            [self.delegate wmplayerProgressPlay:self currentTime:nowTime];
        }
    }
}

@end
  1. 使用子类MDFPlayer
import WMPlayer
import SnapKit

class VideoViewController: UIViewController {
    
    var wmPlayer = MDFPlayer.init()
    let playerModel = WMPlayerModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupWMPlay()
    }
    
    func setupWMPlay() {
        
        let videoPath = Bundle.main.path(forResource: "1", ofType: "mp4")!
        playerModel.videoURL = URL(fileURLWithPath: videoPath)
        
        // 创建一个 WMPlayer 对象并添加到视图中
        wmPlayer = MDFPlayer.init(playerModel: playerModel)!
        wmPlayer.delegate = self
        self.view.addSubview(wmPlayer)
        
        // 设置布局约束
        wmPlayer.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        wmPlayer.isFullscreen = true
        // 播放视频
        wmPlayer.play()
    }
    
}

extension VideoViewController : MDFPlayerDelegate {
    
    func wmplayerProgressPlay(_ player: WMPlayer, currentTime: Int64) {
        print(currentTime)
    }
}

posted @ 2024-05-08 11:11  奔丶小康  阅读(7)  评论(0)    收藏  举报