avfoundation @ tacow 2013 05 14

33
Neat things to do on a rainy day with AVFoundation Ryder Mackay @rydermackay TACOW May 14, 2013

Upload: ryder-mackay

Post on 13-Jan-2015

1.131 views

Category:

Technology


1 download

DESCRIPTION

Some of my favourite bits of AVFoundation. Topics include capture, composition, a custom player and scrubber interface, synchronized CAAnimations, and real-time VFX.

TRANSCRIPT

Page 1: AVFoundation @ TACOW 2013 05 14

Neat things to do on a rainy day with

AVFoundation

Ryder Mackay@rydermackay

TACOWMay 14, 2013

Page 2: AVFoundation @ TACOW 2013 05 14

Don’t worry, I’m an “expert”

Page 3: AVFoundation @ TACOW 2013 05 14

AVFoundation• Mid-level Objective-C framework for playing,

recording and editing time-based media

• Available on iOS 4.0+ and Mac OS X 10.7+

AV Foundation

Core Audio Core Media Core Animation

Media Player

UIKit

Page 4: AVFoundation @ TACOW 2013 05 14

Additional Frameworks

• QuartzCore

• Layer trees, animation

• Core Media

• CMTime, CMTimeRange, etc.

• Core Video

• CVPixelBufferRef, kCVPixelFormatTypes

Page 5: AVFoundation @ TACOW 2013 05 14

A Brief HistoryiOS AVFoundation Features

2.2 AVAudioPlayer

3.0 AVAudioRecorder, AVAudioSession

4.0 Capture, playback and editing

4.1 Read/write sample buffers, queue player

5.0 OpenGLES compatibility, AirPlay

Page 6: AVFoundation @ TACOW 2013 05 14

New in iOS 6.0

• Real-time access to video buffers

• Face tracking during capture

• Better support for encrypted streams

• Advanced synchronization features

Page 7: AVFoundation @ TACOW 2013 05 14

AVAsset (abstract base class)

• AVURLAsset: local or remote

• AVComposition

• AVMutableComposition

AVAsset

AVAssetTrack

AVAssetTrackSegment

audio

video

Page 8: AVFoundation @ TACOW 2013 05 14

@protocol AVAsynchronousKeyValueLoading

• Handler invoked on arbitrary thread; dispatch_async to main queue

- (void)loadValuesAsynchronouslyForKeys:(NSArray *)keys completionHandler:(void (^)())handler;

- (AVKeyValueStatus)statusOfValueForKey:(NSString *)key error:(NSError **)outError;

Page 9: AVFoundation @ TACOW 2013 05 14

AVURLAsset+ (AVURLAsset *)assetWithURL:(NSURL *)URL options:(NSDictionary *)options;- (CMTime)duration;

- (NSArray *)tracks;- (BOOL)isPlayable;

- (BOOL)isExportable;- (BOOL)isReadable;

- (BOOL)isComposable;

AVURLAssetPreferPreciseDurationAndTimingKey

Page 10: AVFoundation @ TACOW 2013 05 14

CMTime

• C struct representing rational number

• numerator: value, denominator: scale

• time in seconds = value / scale

• Flags: valid, +/-ve infinity, has been rounded

• Time scale of 600 can conveniently represents 24, 25 and 30 fps exactly

Page 11: AVFoundation @ TACOW 2013 05 14

Playback

Page 12: AVFoundation @ TACOW 2013 05 14

AVPlayerItem

AVPlayerItemTrack

AVPlayerItemTrack

AVAsset

AVAssetTrack

AVAssetTrack

AVPlayerLayer

AVPlayer

AVPlayerItem

AVPlayerItemTrack

AVPlayer & item manage asset presentation state

Page 13: AVFoundation @ TACOW 2013 05 14

AVPlayer

@property (nonatomic) float rate;- (void)play;- (void)seekToTime:(CMTime)time;- (CMTime)currentTime;- (AVPlayerStatus)status;- (NSError *)error;

Page 14: AVFoundation @ TACOW 2013 05 14

Playback Notifications– (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime))block;

-(id)addBoundaryTimeObserverForTimes:(NSArray *)times queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime))block;

– (void)removeTimeObserver:(id)observer;

typedef NSInteger AVPlayerActionAtItemEnd;

NSString * const AVPlayerItemDidPlayToEndNotification;

Page 15: AVFoundation @ TACOW 2013 05 14

AVPlayerLayer

+ (AVPlayerLayer *)playerLayerWithPlayer:(AVPlayer *)player;

@property (copy) NSString *videoGravity;

@property (nonatomic,readonly, getter = isReadyForDisplay) BOOL readyForDisplay;

Page 16: AVFoundation @ TACOW 2013 05 14

Playback Summary

• Load asset tracks

• Create player and player item

• Create player layer

• Observe “readyForDisplay” property

• Insert layer into subtree

Page 17: AVFoundation @ TACOW 2013 05 14

Generating Thumbnails

Page 18: AVFoundation @ TACOW 2013 05 14

AVAssetImageGenerator

- (id)initWithAsset:(AVAsset *)asset;

- (CGImageRef)copyCGImageAtTime:(CMTime)requestedTime actualTime:(CMTime *)actualTime error:(NSError **)outError;

- (void)generateCGImagesAsynchronouslyForTimes:(NSArray *)requestedTimes completionHandler:(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error)handler;

- (void)cancelAllCGImageGeneration;

Page 19: AVFoundation @ TACOW 2013 05 14

Demo:Custom Player

Page 20: AVFoundation @ TACOW 2013 05 14

Editing

Page 21: AVFoundation @ TACOW 2013 05 14

AVAsset

AVAssetTrack AVAssetTrackSegment

AVComposition

AVCompositionTrack AVCompositionTrackSegment

Page 22: AVFoundation @ TACOW 2013 05 14

AVMutableComposition

- (BOOL)insertTimeRange:(CMTimeRange)timeRange ofAsset:(AVAsset *)asset atTime:(CMTime)startTime error:(NSError **)outError;

- (void)scaleTimeRange:(CMTimeRange)timeRange toDuration:(CMTime)duration;

- (void)removeTimeRange:(CMTimeRange)timeRange;

timeRange must be valid or you’re gonna have a bad time

Page 23: AVFoundation @ TACOW 2013 05 14

Demo:Capture, Compose & Export

Page 24: AVFoundation @ TACOW 2013 05 14

AVSynchronizedLayer

• Confers timing state upon sublayers

• Timing synced with AVPlayerItem instance

• +synchronizedLayerWithPlayerItem:

• When creating CAAnimations:

• Use AVCoreAnimationBeginTimeAtZero

• -setRemovedOnCompletion:NO

Page 25: AVFoundation @ TACOW 2013 05 14

Demo:AVSynchronizedLayer

Page 26: AVFoundation @ TACOW 2013 05 14

Real-time Processing

Page 27: AVFoundation @ TACOW 2013 05 14

Now Playing in 3D

• iOS 5:

• CVOpenGLESTextureCacheRef

• CVOpenGLESTextureRef

• +[CIImage imageWithCVPixelBuffer:options:]

• Binding between CVPixelBufferRef and GL textures

• Bypasses copying to/from CPU-controlled memory

• iOS 6:

• +[CIImage imageWithTexture:size:flipped:colorSpace:]

Page 28: AVFoundation @ TACOW 2013 05 14

CVOpenGLESTextureCacheCreate( CFAllocatorRef allocator, CFDictionaryRef cacheAttributes, CVEAGLContext eaglContext, CFDictionaryRef textureAttributes, CVOpenGLESTextureCacheRef *cacheOut)

CVOpenGLESTextureCacheCreateTextureFromImage( CFAllocatorRef allocator, CVOpenGLESTextureCacheRef textureCache, CVImageBufferRef sourceImage, CFDictionaryRef textureAttributes, GLenum target, // GL_TEXTURE_2D GLint internalFormat, // GL_RGBA GLsizei width, GLsizei height, GLenum format, // GL_BGRA GLenum type, // GL_UNSIGNED_BYTE size_t planeIndex, // 0 CVOpenGLESTextureRef *textureOut)

Page 29: AVFoundation @ TACOW 2013 05 14

Obtaining Pixel Buffers

Real-time:

• AVCaptureVideoDataOutput

• AVPlayerItemVideoOutput iOS 6

Offline:

• AVAssetReaderTrackOutput

• AVAssetReaderVideoCompositionOutput

Page 30: AVFoundation @ TACOW 2013 05 14

AVPlayerItemVideoDataOutput• Access pixel buffers during playback

• Request wakeup, poll w/ display link

running pausedCADisplayLink

request change notification

media datawill change

buffer for time?

NO

YES

process & display

entrypoint

Page 31: AVFoundation @ TACOW 2013 05 14

Demo:Real-time VFX

Page 32: AVFoundation @ TACOW 2013 05 14

Sample CodeApple:

AVBasicVideoOutput

AVSimpleEditor

RosyWriter

Bob McCune – AVFoundationEditor:

https://github.com/tapharmonic/AVFoundationEditor

Bill Dudney – AVCoreImageIntegration:

https://github.com/bdudney/Experiments

Page 33: AVFoundation @ TACOW 2013 05 14

Twitter: @rydermackayADN: @rydergithub.com/rydermackay

while (self.retainCount > 0) { [self release];}