iOS视频播放(AVFoundation)

关于iOS平台的音视频处理,苹果官方提供了OC和swift接口的AVFoundation框架,可以进行各种音频播放和剪辑,底层实现使用了GPU加速,编解码效率比软编软解提高很多。所以在iOS平台音视频方面的操作,AVFoundation是不二之选。iOS音视频处理库结构如下图:



可以看到AVFoundation处于中间,它封装了底层的一些C接口,抽象了一层面向对象的OC接口调用,比如视频编解码我们可以直接调用VideoToolBox的c接口,也可以使用AVAssertWriter和AVAssertReader类,它们进行了较好的封装,便于使用。苹果推荐我们使用后者。


1.1音视频播放

AVKit框架提供了简单易用的调用,直接封装的一个播放器,而且控制UI都提供了。这个很简单不用说了。主要介绍一下AVPlayer和AVPlayerItem。AVAssert是作为音视频文件的一个抽象,AVPlayer不直接对接AVAssert,通过AVPlayerItem控制播放源的状态,代码如下:


AVAsset *assert = [AVAsset assetWithURL:[NSURL URLWithString:@"example.mp4"]];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:assert];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];

1.2使用AVPlayerlayer播放

视频图像要播放出来需要绘制在窗口上面,AVPlayer配套使用AVPlayerlayer。

代码:

// PlayerView.h
@interface PlayerView : UIView
@property AVPlayer *player;
@property (readonly) AVPlayerLayer *playerLayer;
@end // PlayerView.m
@implementation PlayerView
- (AVPlayer *)player {
return self.playerLayer.player;
} - (void)setPlayer:(AVPlayer *)player {
self.playerLayer.player = player;
} // Override UIView method
+ (Class)layerClass {
return [AVPlayerLayer class];
} - (AVPlayerLayer *)playerLayer {
return (AVPlayerLayer *)self.layer;
}
@end

1.3使用AVPlayerItemVideoOutput

有时候我们需要进一步对输出的图像进行处理,然后中绘制到view上面。这个时候就需要AVPlayerItemVideoOutput,它相当于在一个视频播放源上安装一个水龙头,然后解码后的视频数据就从里面出来,我们还可以指定输出数据的格式,便于下一步处理。代码如下:

//输出yuv 420格式
NSDictionary *pixBuffAttributes = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)};
AVPlayerItemVideoOutput *output = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes];
[playerItem addOutput:output]; //put output to item

使用CADisplayLink开启定时回调方法,从output中获取图像数据进行处理,代码如下:


- (void)displayLinkCallback:(CADisplayLink *)sender
{ CMTime outputItemTime = kCMTimeInvalid;
CFTimeInterval nextVSync = ([sender timestamp] + [sender duration]);
outputItemTime = [[self videoOutput] itemTimeForHostTime:nextVSync];
if ([[self videoOutput] hasNewPixelBufferForItemTime:outputItemTime]) {
CVPixelBufferRef pixelBuffer = NULL;
pixelBuffer = [[self videoOutput] copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:NULL];
// ..... do something with pixbuffer
if (pixelBuffer != NULL) {
CFRelease(pixelBuffer);
}
}
}

CADisplayLink的回调次数是根据屏幕刷新频率来的,它的timestamp方法可以获取上次的刷新时间戳,然后加上刷新间隔,获得当前时间戳,从output获得相应数据数据,进行处理。


参考:

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW4

https://developer.apple.com/library/archive/samplecode/AVBasicVideoOutput/Introduction/Intro.html#//apple_ref/doc/uid/DTS40013109

iOS视频播放(AVFoundation)的更多相关文章

  1. iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)

    介绍: 和音频播放一样,ios也提供个很多的API.如mediaPlayer.framework下的MPMediaPlayerController.AVFounditon.framework下的AVP ...

  2. iOS基于AVFoundation实现朗读文字

    iOS基于AVFoundation实现朗读文字 1.心理建设 众所周知AVFoundation的朗读是个智障语气,所以想不花钱就只能忍着. 2.speechManager @import AVFoun ...

  3. 浅谈iOS视频播放的N种解决方案

    简       注册登录 添加关注 作者 Maru2016.03.22 20:46* 写了4349字,被135人关注,获得了207个喜欢 字数1621 阅读2895 评论43 喜欢159 header ...

  4. iOS 视频播放方式整理

    初衷 多媒体这整个系列的文章自己也准备好开始整理了,先从视频音频最简单也是最常用的播放出发慢慢的往下深究,探索到底层的编码解码等等,这篇文章就从视频的播放这个最简单的说起. iOS的视频播放方式有几种 ...

  5. iOS开发--AVFoundation自定义相机

    首先导入一个头文件 #import <AVFoundation/AVFoundation.h> 由于后面我们需要将拍摄好的照片写入系统相册中,所以我们在这里还需要导入一个相册需要的头文件 ...

  6. iOS 视频播放的简单使用

    最近工作中有用到视频播放的内容,分享一些简单的用法给大家(由于网速问题,本例中使用的是本地的资源进行播放,要播放网络上的修改一些URL即可) 1.iOS9之前的视频播放 首先需要导入MediaPlay ...

  7. ios视频播放器,代码和界面分离

    最近业余时间整理的一个ios播放器,界面采用storyboard,以前几乎都是用代码布局,但是用过一个项目storyboard后,就感觉storyboard很靠谱,团队合作版本控制的问题解决其实很简单 ...

  8. iOS视频播放器

    用AVPlayer写的一个简单的播放器,支持横竖屏旋转! https://github.com/shumingli/module 欢迎加iOS开发交流群:516318591

  9. iOS 视频播放 - YVideoPlayer - UIView

    这是一个使用简便的视频播放框架,它基于UIView,它可以是一个小窗口,也可以是一个全屏的窗口 简单的方式加载Video框架: 一行代码加载! 一行代码更新! 下载链接 : https://githu ...

随机推荐

  1. c#开源项目收集

    1百度云高速下载c#开源: https://github.com/ResourceHunter/BaiduPanDownloadWinform 2.IdaCsharp http://idacsharp ...

  2. UNIX/Linux系统管理技术手册(1)----脚本和shell

    1. 管道和重定向 (i) 要让第二条命令只有在第一条命令成功完成之后才执行,可以用一个 && 符号把两条命令隔开.例如: $ > /dev/null && cd ...

  3. CentOS 7运维管理笔记(3)----Linux路由器配置

    当正在配置的Linux主机需要作为路由器使用时,通过以下步骤配置后,子网上的计算机就可以访问外网了: 1. 编辑 /etc/sysctl.conf 文件,添加 net.ipv4_ip_forward ...

  4. 07_dubbo_compiler

    [开始解析最后一行代码 ExtensionLoader.getAdaptiveExtension()] ExtensionLoader<Protocol> loader = Extensi ...

  5. 【统计学】英文概念之Mean和Average的区别

    通过专门检索和其他课本的比较,得到了如下结论.统计学在分析数据时,需要对数据进行最基础的描述性分析.在众多描述分析的指标中,平均数指标能够反映分布数列集中趋势.但是平均数指标包括两类:一类是数值平均数 ...

  6. DDMS 使用小结

    DDMS简介 DDMS功能详解 1 Devices面板 2 功能面板 3 LogCat and Console 1.DDMS简介 DDMS的全称是Dalvik Debug Monitor Servic ...

  7. Linux->ZooKeeper开机启动的俩种方式

    两种方式可以实现开机自启动 第一种:直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行, 其中export JAVA_HOME=/usr/jav ...

  8. 404错误 标签: servlet浏览器 2016-11-16 16:58 61人阅读 评论(0) 收藏

    404是资源没有找到,一般由于以下几个方面导致: 1.路径出错: a)检查web.xml中servlet的配置是否出错 b)浏览器访问是路径书写方式:http://localhost:8080/项目名 ...

  9. PHP:通过MVC,实现第三方登录(百度)

    这里,仓鼠将手把手记录下来实现第三方登录的流程,这里以百度为例 百度开发者中心-官方网址:传送门. 所有第三方接口都不支持本地调试,只有真实的项目和服务器才有可能申请成功. 所以申请的资料全部都要填写 ...

  10. 面试知识整理-Java基础

    三大特征:封装,继承,多态 多态:简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情. 抽象:抽象是将一类对象的共同特征总结出来构造类的过程 包装,可以讲基本类型当做对象来使用,抽象只关心对 ...