AVPlayer视频播放的使用简介

首先我们定义变量:

    NSTimeInterval totalDration;
@property (strong, nonatomic) AVPlayer *player;
@property (retain, nonatomic) AVPlayerItem *playerItem;
@property (retain, nonatomic) id playbackTimeObserver;

而AVPlayer的使用离不开AVPlayerLayer,因此我们需要设置如下:

+ (Class)layerClass {
    return [AVPlayerLayer class];
}

- (AVPlayer *)player {
    return [(AVPlayerLayer *)[self layer] player];
}

- (void)setPlayer:(AVPlayer *)player {
    [(AVPlayerLayer *)[self layer] setPlayer:player];
}

视频播放的初始化

        self.playerItem = [[[AVPlayerItem alloc]initWithURL:_videoURL] autorelease];

        [self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
        [self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];

        self.player = [[[AVPlayer alloc]initWithPlayerItem:self.playerItem] autorelease];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoPlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];

        [(AVPlayerLayer*)[self layer] setVideoGravity:AVLayerVideoGravityResizeAspect];

添加的observer可以监控缓存进度及播放进度

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    AVPlayerItem *playerItem = (AVPlayerItem *)object;

    if ([keyPath isEqualToString:@"status"]) {

        if ([playerItem status] == AVPlayerStatusReadyToPlay) {
            // ready to play
            NSLog(@"AVPlayerStatusReadyToPlay");
            CMTime duration = self.playerItem.duration;// 获取视频总长度
            totalDration = playerItem.duration.value / playerItem.duration.timescale;// 转换成秒
            // 可以更新视频总长度

            if (_didEnterFullScreenMode  && !_is_s_video) {
                [self monitoringPlayback:self.playerItem];// 监听播放状态
            }

        }
        else if ([playerItem status] == AVPlayerStatusFailed) {

            NSLog(@"AVPlayerStatusFailed");
                // 播放失败的处理
        }

    }
    else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {

        NSTimeInterval timeInterval = [self availableDuration];// 计算缓冲进度
        CMTime duration = self.playerItem.duration;
        CGFloat totalDuration = CMTimeGetSeconds(duration);
        // 更新缓存进度

    }
}
- (void)monitoringPlayback:(AVPlayerItem *)playerItem {
    self.playbackTimeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:NULL usingBlock:^(CMTime time) {
        CGFloat currentSecond = playerItem.currentTime.value/playerItem.currentTime.timescale;// 计算当前在第几秒
       // 更新播放进度

    }];

}

需要注意的是playerItem销毁前一定先移除observer

        [self.playerItem removeObserver:self forKeyPath:@"status"];
        [self.playerItem removeObserver:self forKeyPath:@"loadedTimeRanges"];

通过slide或者其他方式改变播放进度:

    CGFloat value = progressView.progressValue;
    CGFloat curTime = value * totalDration;
    CMTime time = CMTimeMake(curTime, 1);
    [self.player pause];
    [self.player seekToTime:time completionHandler:^(BOOL f){
        [self.player play];
    }];

在完成了视频播放,经过尝试需要设置如下才可以继续播放:

    // 初始化值
    [self.playerItem setReversePlaybackEndTime:kCMTimeZero];
    [self.playerItem seekToTime:kCMTimeZero];

关于视频播放音量的设置,如下:

- (void) setVolome:(CGFloat) volome {
    if (self.playerItem == nil) {
        return;
    }
    if (volome > 1) {
        volome = 1;
    }
    if (volome < 0) {
        volome = 0;
    }
    NSArray *audioTracks = [_playerItem.asset tracksWithMediaType:AVMediaTypeAudio];

    NSMutableArray *allAudioParams = [NSMutableArray array];

    for (AVAssetTrack *track in audioTracks) {
        AVMutableAudioMixInputParameters *audioInputParams =
        [AVMutableAudioMixInputParameters audioMixInputParameters];
        [audioInputParams setVolume:volome atTime:kCMTimeZero];
        [audioInputParams setTrackID:[track trackID]];
        [allAudioParams addObject:audioInputParams];
    }

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
    [audioMix setInputParameters:allAudioParams];
    [_playerItem setAudioMix:audioMix];
}

转载于:https://www.cnblogs.com/skyry/p/5114487.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸿蒙AVPlayer是一款功能强大的音视频播放器,它可以用于播放各种格式的音频和视频文件,包括字节流视频。要在鸿蒙AVPlayer播放字节流视频,可以按照以下步骤进行: 1. 获取字节流视频数据:首先需要从某个来源获取字节流视频数据,可以是网络请求、本地文件读取或其他方式获取。 2. 创建AVPlayer对象:使用AVPlayer类创建一个AVPlayer对象,用于管理视频播放控制和状态。 3. 创建AVDataSource:根据获取到的字节流视频数据,创建AVDataSource对象,用于提供数据源给AVPlayer使用。可以使用AVMemoryDataSource或AVStreamDataSource来创建。 4. 设置AVPlayer的数据源:将创建的AVDataSource对象设置给AVPlayer,用于播放器解析和播放字节流视频数据。 5. 设置AVPlayer的Surface:在鸿蒙系统中,AVPlayer需要一个Surface控件来展示视频画面。可以通过创建一个SurfaceView或SurfaceBridge对象,并将其与AVPlayer关联起来。 6. 开始播放:调用AVPlayer的start方法,开始播放字节流视频。 7. 监听播放器状态:可以监听播放器的状态变化,如播放结束、错误等,以便及时处理相应的操作或提示用户。 8. 播放控制:可根据需要添加一些播放控制功能,如暂停、继续播放、快进、快退等。 总结:通过以上步骤,可以在鸿蒙AVPlayer中成功播放字节流视频。需要获取字节流视频数据,创建AVDataSource对象并设置给AVPlayer,设置Surface用于展示画面,然后调用start方法开始播放即可。同时,还可以根据需求监听和控制播放器的状态和行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值