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 ...
随机推荐
- 00HTML
一.概述 超文本标记语言(Hyper Text Markup Language),HTML是一门描述性的语言.基本语法: <标签> 内容 </标签>** 在一个网页中,HTML ...
- mysql if函数使用例子
1.场景一 有时查询数量a 同时查询过滤后的数量b 2. 代码 SELECT count(id) as total_count, count( IF ( date(order_time) = DATE ...
- react+javascript前端进阶
组合1: react技术栈(react(阮一峰react入门,官网教程).redux(阮一峰redux入门,官网教程).saga)+JS(ES6)+antd+you don`t know JS(上中下 ...
- 21_ConcurrentHashMap和ConcurrentSkipListMap
[简述] ConcurrentHashMap内部使用段(Segment)来表示这些不用的部分,每个段其实就是一个小的HashTable,他们有自己的锁,只要多个修改操作发生在不同的段上,他们就可以并发 ...
- C# Winform DataGridView获取单元格的值
1,可以直接通过DataGridView的重载运算符[]直接获取 使用方法: dataGridView[columnIndex][rowsIndex].Value.ToString().//colum ...
- configure配置安装详解
使用 ./configure --help 就可以查看到所有的配置选项. 1.--host=HOST指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.--host 指定 ...
- javascript面向对象的写法02
面向对象特性的初步实现 1.封装 利用作用域封装变量 作用域的概念是一样的,for语句,if语句等这些作用域内定义的变量只能作用域内访问,函数内定义的变量只能函数内访问. function Class ...
- [原]Linux 修改时区
1.查看当前时区 date -R 2.修改当前时区 tzselect 之后会出来一个选项菜单,选择你想要的时区就OK了 3.替换系统时区文件 cp /usr/share/zoneinfo/XXX/YY ...
- sublime text html5开发学习 插件篇记录
1.第一步先按照 Package Control,具体步骤自行百度,Google. 2. view in browser 默认的快捷键应该是这样的,我用的是IE浏览器.所以ctrl+alt+i 即可让 ...
- AngularJs学习笔记--Scope
原版地址:http://code.angularjs.org/1.0.2/docs/guide/scope 一.什么是Scope? scope(http://code.angularjs.org/1. ...