AVPlayer进行视频播放

使用AVPlayer播放本地,或网络音频文件 导入录音头文件(注意添加framework:AVFoundation.framework、AudioToolbox.framework) #import <AVFoundation/AVFoundation.h> #import <AVKit/AVKit.h> @property (nonatomic, strong) AVPlayer *player; @pr... 阅读详情

一、说明

AVPlayer是AVFoundation框架中的一个类,它比较接近于底层,可以利用该类进行自定义样式的视频播放。AVPlayer本身并不能显示视频,如果AVPlayer要显示视频,则它必须要创建一个播放器层AVPlayerLayer来用于展示视频,播放器层继承了CALayer,我们只需要把AVPlayerLayer添加到控制器view的layer中即可。我们在了解AVPlayer之前,首先需要了解以下几个常用类:
AVAsset : 用于获取多媒体信息,是一个抽象类。
AVURLAsset : 媒体资源管理类,管理视频的一些基本信息和状态,一个AVPlayerItem对应着一个视频资源。

eg:一个视频播放的例子
这里写图片描述

//
//  ViewController.m
//  AVPlayerDemo
//

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
@property (nonatomic,strong) AVPlayer *player;  // 播放器对象
@property (nonatomic,strong) AVPlayerLayer *playerLayer;

@property (weak, nonatomic) IBOutlet UIView *container;
@property (weak, nonatomic) IBOutlet UIButton *playOrPause;
@property (weak, nonatomic) IBOutlet UIProgressView *progress;

@end

@implementation ViewController

- (AVPlayer *)player
{
    if (!_player) {
        AVPlayerItem *playerItem = [self getPlayItem:1];
        _player = [AVPlayer playerWithPlayerItem:playerItem];
        [self addProgressObserver];
        [self addobserToPlayerItem:playerItem];
        [self addNotification];
    }
    return _player;
}

- (AVPlayerLayer *)playerLayer
{
    if (!_playerLayer) {
        _playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
        _playerLayer.frame = self.container.bounds;
    }
    return _playerLayer;
}

- (void)setupUI
{
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    playerLayer.frame = self.container.bounds;
    [self.container.layer addSublayer:playerLayer];

    [self.playOrPause setTitle:@"Pause" forState:UIControlStateNormal];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建播放器层
    [self setupUI];
    [self.player play];
}

#pragma mark -UI事件
- (IBAction)playClick:(UIButton *)btn {
    if (self.player.rate == 0)  // 如果当前是暂停状态
    {
        [btn setTitle:@"Pause" forState:UIControlStateNormal];
        [self.player seekToTime:CMTimeMake(playCurrent, 1.0)];
        [self.player play];
    }
    if (self.player.rate == 1)  // 如果当前是正在播放状态
    {
        [self.player pause];
        [btn setTitle:@"Play" forState:UIControlStateNormal];
    }
}

- (IBAction)navigationButtonClick:(UIButton *)sender {
        [self removeNotification];
        [self removeObserverFromPlayerItem:self.player.currentItem];
        AVPlayerItem *playerItem = [self getPlayItem:(int)sender.tag];
        [self addobserToPlayerItem:playerItem];
        // 切换视频
        [self.player replaceCurrentItemWithPlayerItem:playerItem];
        [self initUI];
        [self addNotification];

}

- (void)initUI
{
    [self.progress setProgress:0.0];
    [self.playOrPause setTitle:@"Pause" forState:UIControlStateNormal];
    [self.player seekToTime:CMTimeMake(0, 1)];
}



- (AVPlayerItem *)getPlayItem:(int)videoIndex
{
    NSURL *url = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i",videoIndex] ofType:@"mp4"]];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
    return playerItem;
}

- (void)playbackFinished:(NSNotification *)notification
{
    [self.player seekToTime:CMTimeMake(0, 1)];  // 视频播放完成以后,从新设置到起点
    NSLog(@"视频播放完成");
    [self removeNotification];
}

- (void)addNotification
{
    //给AVPlayerItem添加播放完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}

-(void)removeNotification{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

static float playCurrent = 0;

- (void)addProgressObserver
{
    AVPlayerItem *playerItem = self.player.currentItem;
    UIProgressView *progress = self.progress;

    // 设置每秒执行一次
    [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
        float current = CMTimeGetSeconds(time);

        playCurrent = current;

        float total = CMTimeGetSeconds([playerItem duration]);
        NSLog(@"当前已经播放了%.2fs",current);
        if (current) {
            [progress setProgress:(current/total) animated:YES];
        }
    }];
}

// 为AVPlayerItem添加监控
- (void)addobserToPlayerItem:(AVPlayerItem *)playerItem
{
    //监控状态属性,注意AVPlayer也有一个status属性,通过监控它的status也可以获得播放状态
    [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
    // 监控网络加载情况
    [playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
}

-(void)removeObserverFromPlayerItem:(AVPlayerItem *)playerItem{
    [playerItem removeObserver:self forKeyPath:@"status"];
    [playerItem removeObserver:self forKeyPath:@"loadedTimeRanges"];
}

/**
 *  通过KVO监控播放器的状态
 *
 *  @param keyPath 监控属性
 *  @param object  监控器
 *  @param change  状态改变
 *  @param context 上下文
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    AVPlayerItem *playerItem = object;
    if ([keyPath isEqualToString:@"status"]) {
        AVPlayerStatus status = [[change objectForKey:@"new"] intValue];
        if (status == AVPlayerStatusReadyToPlay) {
            NSLog(@"正在播放...视频总长度:%.2f",CMTimeGetSeconds(playerItem.duration));
        }
    }else if([keyPath isEqualToString:@"loadedTimeRanges"]){
        NSArray *array = playerItem.loadedTimeRanges;
        CMTimeRange timeRange = [array.firstObject CMTimeRangeValue]; // 本次缓冲时间范围
        float startSeconds = CMTimeGetSeconds(timeRange.start);
        float durationSeconds = CMTimeGetSeconds(timeRange.duration);
        NSTimeInterval totalBuffer = startSeconds + durationSeconds; // 缓冲总长度
        NSLog(@"共缓冲:%.2f",totalBuffer);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
【iOS】视频播放之AVPlayer 【iOS】视频播放之AVPlayer iOS平台使用播放视频,可用的选项一般有这四个,他们各自的作用和功能如下: 使用环境 优点 缺点 AVPlayerViewController AVKit 简单易用 不可定制 MPMoviePlayerController MediaPlayer 简单易用 不可定制 IJKPlayer IJKMediaFrameWork 定制度高,可支持流媒体播放 使用复杂 AVPlayer AVFoundation 可定制度高,功能强大 不支持流媒体 阅读详情

相关推荐

【iOS开发进阶】-AVPlayer视频播放

1.AVPlayer介绍 iOS提供了多种方法来实现视频播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlayerViewController等。其中MPMoviePlayerController,MPMoviePlayerViewController在iOS9.0之后被弃用。四种播放方式的区别如下: 其中公司内项目使用的是AVPlayer实现视频播放,AVPlayer使用十分灵活,也更加接近底层,但是AVPl

qq_41843697的博客 8710

基于AVpro视频播放器的展馆视频播放

using System.Collections; using System.Collections.Generic; using UnityEngine; using RenderHeads.Media.AVProVideo; 脚本不需要赋值,挂在物体上即可 public class VideoShowOne : MonoBehaviour { public static VideoShowOne showOne;bool IsPlay = false; private void Awa

kvkZzzz的博客 24万+

HarmonyOS 实战开发 —— 基于AVPlayer的视频播放

AVPlayer:功能较完善的音视频播放ArkTS API,集成了流媒体和本地资源解析,媒体资源解封装,视频解码和渲染功能,适用于对媒体资源进行端到端播放的场景,可直接播放mp4、mkv等格式的视频文件。本示例就是使用avplayer进行视频播放的实现,功能包括多种方式播放视频,以及对于视频播放的控制。示例场景:AVPlayer播放视频ArkTS实现,创建AVPlayer,设置播放资源和窗口,设置播放参数,播放控制(播放/暂停/跳转),重置,销毁资源,播放完成后切换视频。

CTrup的博客 1265

AVPlayer 播放在线视频和本地文件的设置区别

依赖框架都是AVFoundation 需要da

Mr.xiaoma.wen 343万+

HarmonyOS 开发实践——基于AVPlayer的视频播放

AVPlayer:功能较完善的音视频播放ArkTS API,集成了流媒体和本地资源解析,媒体资源解封装,视频解码和渲染功能,适用于对媒体资源进行端到端播放的场景,可直接播放mp4、mkv等格式的视频文件。本示例就是使用avplayer进行视频播放的实现,功能包括多种方式播放视频,以及对于视频播放的控制。示例场景:AVPlayer播放视频ArkTS实现,创建AVPlayer,设置播放资源和窗口,设置播放参数,播放控制(播放/暂停/跳转),重置,销毁资源,播放完成后切换视频。

liuhaojiabin的博客 785

鸿蒙5.0实战案例:基于AVPlayer的视频播放

stopped:停止状态,在prepared/playing/paused/completed状态调用stop()方法,AVPlayer会进入stopped状态,此时播放引擎只会保留属性,但会释放内存资源,可以调用prepare()重新准备,也可以调用reset()重置,或者调用release()彻底销毁。示例场景:AVPlayer播放视频ArkTS实现,创建AVPlayer,设置播放资源和窗口,设置播放参数,播放控制(播放/暂停/跳转),重置,销毁资源,播放完成后切换视频。

Maniu_666的博客 1491

基于AVPlayer的视频播放

hongxiaomeng的博客 5万+

ios 使用AVPlayer自定义视频播放器

iOS有一个类MPMoviePlayer可以用来实现视频的播放,但是用这个类不能对视频播放器对样式和功能做自定义。所以用AVplayer类来做自定义的视频播放器。 视频是在一个view上显示的,我自定义了一个View,基于UIView #import #import #import @interface VideoPlayerView : UIView @

闪亮的的Bug写手 4687

AVPlayer视频播放的使用简介

首先我们定义变量: NSTimeInterval totalDration; @property (strong, nonatomic) AVPlayer *player; @property (retain, nonatomic) AVPlayerItem *playerItem; @property (retain, nonatomic) i...

anshansui2885的博客 4021

鸿蒙开发实践——基于AVPlayer的视频播放

关注小编,不定期分享技术知识同时请期待后续文章ing🚀。

android__bye的博客 1799

OpenHarmony实战开发-如何使用AVPlayer开发视频播放功能

当前提供两种视频播放开发的方案:

m0_70749039的博客 1152

iOS视频播放之AVPlayer

AVFoundation 框架中的AVPlayer 也可以完成视频的播放,相较于强大及简单的MPMoviePlayerController,AVPlayer使用起来更加灵活,且偏近于底层。 AVPlayer本身不能显示视频,它需要通过播放器层AVPlayerLayer来展示视频,使用时将AVPlayerLayer添加到视图控制器的layer中。 AVPlayer播放视频的

叶阳的博客 3026

iOS开发实战:AVPlayer实现视频播放与动画融合

在深入探讨AVPlayer初始化之前,我们需要先了解它所依赖的底层框架——AVFoundation。这个框架不仅提供了基础的音视频播放能力,还支持录制、编辑和合成等多种高级功能。

weixin_28771751的博客 1272

iOS 视频播放(AVPlayer)

文章目录 一、AVPlayer 1、简介 2、视频播放的解决方案 二、AVPlayer中的MVC 1、v层 :AVPlayerLayer 2、m层 :AVPlayerItem 3、c层 :AVPlayer 三、实现简单的播放、暂停功能 1、播放 2、暂停 3、视频播放暂停实现一、AVPlayer1、简介 OC 提供了三种视频播放解决方案,分别是

风中的劲草 3万+

AVPlayer 实现视频播放

利用avfundation框架实现原生视屏播放功能

AVPlayer监控视频播放器

很多监控器使用的是特定的播放器,这里发表一款AVPlayer播放器,供需要的人使用。

系统视频播放器——AVPlayerItem AVPlayer AVPlayerLayer

使用AVPlayerItem AVPlayer AVPlayerLayer实现视频播放功能 需要导入头文件#import &lt;AVKit/AVKit.h&gt; 效果图 代码示例 // 定义 @property (nonatomic, strong) AVPlayer *avPlayer; @property (nonatomic, strong) UILabel *timeLabel; ...

番薯大佬的专栏 7972

关于Nuttx操作系统

NuttX是一个成熟的实时操作系统

qq_28576837的博客 4092

AVPlayer实现视频播放

Demo实现功能: 1.视频的播放/暂停 2.播放进度前进后退ViewController import AVFoundation/AVFoundation.h import “TQPlayView.h”@interface ViewController ()@property (nonatomic,strong) AVPlayer *player;@property (nonatomic,

weixin_35966617的博客 5163

Fluent基于低氧舱气体交换仿真(氮气与空气混合)

一、背景概述 模拟低氧舱充氮气和排除混合气体的过程,假设注入95%的氮气,舱内原有气体为空气,压力为标准大气压,温度为300K。观察气体注入过程中,舱内平均氮气和氧气浓度的变化。 二、Fluent设置 Setup 1、General type选择压力基 绝对速度 瞬态 重力勾选 2、Model 能量方程开启 组分运输开启,设置方法如下: 选择后OK,view就会变成Edit,点击Edit。然后再次点击Edit。 将组分中的非氮气氧气和空气的气体移除,右边选项需要将空气放在最后一位。 3、Materi

qq_35535616的博客 1万+

可食用野生植物检测实战:基于YOLOv11的智能识别系统全流程指南

本文介绍了一种基于YOLOv11的可食用野生植物智能识别系统。该系统通过深度学习技术,能在0.2秒内精准识别植物是否可食用,准确率高达92%。文章详细阐述了从数据采集、标注到模型训练、验证的全流程,并开发了用户友好的Tkinter交互界面。该系统解决了户外探险和植物研究中植物识别的痛点,具有高精度、实时性和强泛化能力的特点,为户外安全提供了智能化解决方案。

FJN110的博客 164
上一篇: IOS应用中的数据存储
下一篇: IOS中的多线程
mediaios
博客等级 码龄12年 12粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值