Академический Документы
Профессиональный Документы
Культура Документы
Eric Lee
iPhone Engineering
2
What You’ll Learn
3
Sample Code for This Session
• AVPlayerDemo
• AVEditDemo
4
Technology Framework
MediaPlayer
UIKit
AVFoundation
5
Editing in iPhone OS 3.x
A user feature
Trim UI
Thumbnails
6
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
7
Fundamentals
MediaPlayer
UIKit
AVFoundation
8
CMTime
Struct type for rational time
• CMTime t = CMTimeMake( time value, time scale );
• kCMTimeZero, kCMTimeInvalid
• x = CMTimeAdd( y, z );
• if( CMTIME_COMPARE_INLINE( t1, <=, t2 ) ) { ... }
9
Moving Up
MediaPlayer
UIKit
AVFoundation
10
Movies and AVAssets
Movie
AVAsset
AVAssetTracks
11
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
12
Demo
Custom playback UI
AVPlayerDemo
13
Grab Image at Time
Grab images from an AVAsset using AVAssetImageGenerator
AVAssetImageGenerator *imageGenerator =
[AVAssetImageGenerator
assetImageGeneratorWithAsset:myAsset];
[imageGenerator generateCGImagesAsynchronouslyForTimes:timeArray
completionHandler:handlerBlock];
14
Image Generation Completion Block
Check the result
AVAssetImageGeneratorCompletionHandler handlerBlock =
^(CMTime requestedTime, CGImageRef image, CMTime actualTime,
AVAssetImageGeneratorResult result, NSError *error){
switch (result) {
case AVAssetImageGeneratorSucceeded:
! ! /* image is valid */
break;
case AVAssetImageGeneratorFailed:
/* error */
break;
! case AVAssetImageGeneratorCancelled:
/* cancelled */
break;
}
}
15
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
16
Export and Trimming
Export an AVAsset to a new file using AVAssetExportSession
• Presets for different sizes, bitrates, etc.
• Optionally set timeRange to trim
• Optionally add metadata
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
exportSession.outputURL = ...;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
exportSession.metadata = ...;
[exportSession exportAsynchronouslyWithCompletionHandler:handlerBlock];
17
Export Completion Block
Check the status
void (^handlerBlock)(void) = ^{
! switch (exportSession.status) {
! case AVAssetExportSessionStatusCompleted:
/* export complete */
break;
case AVAssetExportSessionStatusFailed:
/* export error (see exportSession.error) */
break;
case AVAssetExportSessionStatusCancelled:
/* export cancelled */
break;
}
}
18
A Word on Error Handling
Handle failures gracefully
• AVAssetExportSession will not overwrite files
• AVAssetExportSession will not write files outside of your sandbox
19
Export and Multitasking
Handle failures gracefully
• Other apps that start playback will interrupt a background export
• Even in the foreground, an incoming phone call will interrupt export
20
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
21
AVAsset and AVComposition
Cornerstones of editing
22
AVAsset as a Source Object
AVPlayerItem
AVAsset AVAssetImageGenerator
Movie File
AVAssetExportSession
23
AVComposition
AVPlayerItem
AVComposition AVAssetImageGenerator
a subclass of AVAsset
AVAssetExportSession
Movie Files
24
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
25
Demo
Cutting together movie clips
26
Composing a Timeline
27
AVComposition
AVComposition assembles asset segments on a timeline
AVComposition
AVCompositionTrack (video)
AVCompositionTrack (audio)
28
AVMutableComposition
29
AVEditDemo
See buildSequenceComposition in SimpleEditor.m
AVMutableCompositionTrack *compositionVideoTrack =
[composition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:...];
[compositionVideoTrack insertTimeRange:...
ofTrack:clipVideoTrack atTime:... error:...];
30
When Not to Mutate Compositions
Don’t modify an AVMutableComposition during
playback, image generation, or export
• Make a copy for these tasks; then it’s safe to modify the original:
AVPlayerItem *playerItem =
[AVPlayerItem playerItemWithAsset:
[[mutableComposition copy] autorelease]];
31
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
32
Demo
Mixing in additional audio
33
Adding a Commentary Track
Empty segment
34
AVComposition and AVAudioMix
AVComposition
AVAudioMix
35
AVAudioMix
Tool for adding volume adjustments
• Has array of AVAudioMixInputParameters
■ Each adjusts the volume level of one track
■ Tracks without AVAudioMixInputParameters get default volume
36
AVMutableAudioMix
AVMutableAudioMixInputParameters *trackMix =
[AVMutableAudioMixInputParameters
audioMixInputParametersWithTrack:mainAudioTrack];
37
Using AVAudioMix
38
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
39
Demo
Video transitions
40
AVComposition and AVVideoComposition
AVComposition
AVVideoComposition
A A/B B B/A A
41
AVVideoComposition
AVVideoComposition
A B
A B
B A
A
42
AVVideoCompositionInstruction
AVVideoComposition
A B
A B
B A
A
AVMutableVideoCompositionInstruction *transition =
[AVMutableVideoCompositionInstruction videoCompositionInstruction];
transition.timeRange = ...;
AVMutableVideoCompositionLayerInstruction *fromLayer =
[AVMutableVideoCompositionLayerInstruction
videoCompositionLayerInstructionWithAssetTrack:trackA];
43
AVVideoComposition
AVMutableVideoComposition *videoComposition =
[AVMutableVideoComposition videoComposition];
44
Using AVVideoComposition
• For playback:
■ playerItem.videoComposition = videoComposition;
• For export:
■ assetExportSession.videoComposition = videoComposition;
45
Pitfalls
• AVVideoCompositionInstructions must not overlap or contain gaps
AVComposition
AVVideoComposition
AVComposition
AVVideoComposition
46
Hardware Requirements
for Video Composition
47
Temporal Video Compression
• Not restricted to editing at key frames
• Use AVVideoComposition and alternating segments between two video
tracks to give AV Foundation more time for catchup decoding
I P P P P I P P P P I P P P P I P P P P ...
AVComposition
IPPPPIPPP
IPPPP IPPPPIP
AVVideoComposition
B A B
48
Other Uses for AVVideoComposition
■ Add an AVVideoComposition
49
Editing APIs in AV Foundation
Scenarios
• Create an image for a time
• Trim a movie to a time range
• Cutting together multiple clips
• Audio mixing
• Video transitions
• Incorporating Core Animation in movies
50
Demo
Core Animation in Movies
51
Core Animation in Movies
AVComposition
CALayers CAAnimations
fade out
Magic! spin stars after 10 sec
52
AVEditDemo: Core Animation
animatedTitleLayer CABasicAnimation
Fade out after 10 sec
Magic!
Attend Sessions 424 and 425 for more information on Core Animation
53
Animation, Video, and Time
UIView
real time
AVPlayerLayer
“seconds since boot”
5000 5001 5002 5003 5004 5
movie time
Video AVSynchronizedLayer “seconds since start of movie”
0123456789
Magic!
54
Playback with Core Animation
55
Export with Core Animation
• Use AVVideoCompositionCoreAnimationTool to integrate
Core Animation as a “post-processing” video stage
AVVideoCompositionCoreAnimationTool
parentLayer
videoLayer animationTitleLayer
Magic!
56
Multitasking
• Core Animation use in the background will cause the export to fail
57
Core Animation Gotchas
Core Animation features that are convenient for
real-time animation but don’t work well in movies
• Zero beginTime is automatically translated to CACurrentMediaTime()
• Use a small nonzero number: e.g., 1e-100 or -1e-100
(AVCoreAnimationBeginTimeZero)
58
Core Animation Gotchas
Core Animation features that are convenient for
real-time animation but don’t work well in movies
• Disable implicit animations
[CATransaction begin];
[CATransaction setDisableActions:YES];
// your layer code here
[CATransaction commit];
59
Stretch It Out
AVComposition
60
Summary
61
More Information
Eryk Vershen
Media Technologies Evangelist
evershen@apple.com
Documentation
AV Foundation Framework Reference
http://developer.apple.com/iphone
62
Related Sessions
Nob Hill
Discovering AV Foundation (Repeat) Thursday 4:30PM
Presidio
Using the Camera with AV Foundation Tuesday 4:30PM
Nob Hill
Core Animation in Practice, Part 1 Thursday 11:30AM
Nob Hill
Core Animation in Practice, Part 2 Thursday 2:00PM
Russian Hill
Introducing Blocks and Grand Central Dispatch on iPhone Wednesday 11:30AM
63
Labs
64
65
66
67