iOS视频播放(AVFoundation)
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获得相应数据数据,进行处理。
参考:
iOS视频播放(AVFoundation)的更多相关文章
- iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)
介绍: 和音频播放一样,ios也提供个很多的API.如mediaPlayer.framework下的MPMediaPlayerController.AVFounditon.framework下的AVP ...
- iOS基于AVFoundation实现朗读文字
iOS基于AVFoundation实现朗读文字 1.心理建设 众所周知AVFoundation的朗读是个智障语气,所以想不花钱就只能忍着. 2.speechManager @import AVFoun ...
- 浅谈iOS视频播放的N种解决方案
简 注册登录 添加关注 作者 Maru2016.03.22 20:46* 写了4349字,被135人关注,获得了207个喜欢 字数1621 阅读2895 评论43 喜欢159 header ...
- iOS 视频播放方式整理
初衷 多媒体这整个系列的文章自己也准备好开始整理了,先从视频音频最简单也是最常用的播放出发慢慢的往下深究,探索到底层的编码解码等等,这篇文章就从视频的播放这个最简单的说起. iOS的视频播放方式有几种 ...
- iOS开发--AVFoundation自定义相机
首先导入一个头文件 #import <AVFoundation/AVFoundation.h> 由于后面我们需要将拍摄好的照片写入系统相册中,所以我们在这里还需要导入一个相册需要的头文件 ...
- iOS 视频播放的简单使用
最近工作中有用到视频播放的内容,分享一些简单的用法给大家(由于网速问题,本例中使用的是本地的资源进行播放,要播放网络上的修改一些URL即可) 1.iOS9之前的视频播放 首先需要导入MediaPlay ...
- ios视频播放器,代码和界面分离
最近业余时间整理的一个ios播放器,界面采用storyboard,以前几乎都是用代码布局,但是用过一个项目storyboard后,就感觉storyboard很靠谱,团队合作版本控制的问题解决其实很简单 ...
- iOS视频播放器
用AVPlayer写的一个简单的播放器,支持横竖屏旋转! https://github.com/shumingli/module 欢迎加iOS开发交流群:516318591
- iOS 视频播放 - YVideoPlayer - UIView
这是一个使用简便的视频播放框架,它基于UIView,它可以是一个小窗口,也可以是一个全屏的窗口 简单的方式加载Video框架: 一行代码加载! 一行代码更新! 下载链接 : https://githu ...
随机推荐
- 配置centos7 网卡
进入root模式,输入 cd /etc/sysconfig/network-scripts/ 按Tab键查看网卡配置文件名称,然后进入编辑: 如: cd /etc/sysconfig/network- ...
- 【小记录】关于dojo中的on事件
今天碰到一个现象,若是一个函数中存在一个on事件(例如点击事件),在该函数连续触发两次之后在去触发里面的on事件,会发现改时间所对应的函数被调用了两次,若父函数被连续触发N次后再取触发on事件,其对应 ...
- Tomcat启动报错java.net.AbstractPlainSocketImpl(java/net/AbstractPlainSocketImpl.java:178:-1)Struts在网络复杂情况下启动报错解决办法
SSH项目 在网络复杂的情况(具体规律未知)下,Tomcat启动时,报如下错误: [ERROR] 2014-08-12 14:52:58,484 [org.apache.struts2.dispatc ...
- Opencv2.4.13与Visual Studio2013环境搭建配置教程
转载:http://www.jb51.net/article/108943.htm 一.安装包的下载与安装 Opencv可免费到官网上去下载,opencv是国外软件,在下载是由于受资源的限制,可能会出 ...
- restful知识点之二restframework视图
restful协议理解:面向资源开发 restful协议 ---- 一切皆是资源,操作只是请求方式 ----book表增删改查 /books/ books /books/add/ addbook /b ...
- C# 中重载自增自减操作符的具体运算原理 ----从C++程序员的角度看C#自增操作符重载的实质
看了看C#的运算符重载,发现与C++打不相同.刚刚被C#的自增操作符坑了,现在来分享一下. 先定义一个类 class A { public int i; public A(int I) { i = I ...
- gitattributes中的filter
.gitattributes文件就是一个简单的text文本文件,它的作用是gives attributes to pathnames. 该文件中的一些配置可以为某些特定目录或者文件来设置,这样Git就 ...
- 修改Tomcat8w.exe可执行路径:Path to executable
学习java web时,先下载了Tomcat8.5,在Eclipse中配置了Tomcat的相关环境后,出现了个别版本不兼容问题,就打算换成8.0版本.但是删除整个8.5的文件夹后,运行8.0bin中的 ...
- Infragist ics Ult imate 2015 Vol.1 - Product Keys
Ultimate ProductKeys 2015 Vol.1: 9122-1900164-4504144 9122-9300855-3994197 9122-7600717-4579130 9122 ...
- QT的组合键
https://www.cnblogs.com/Jace-Lee/p/5859293.html