WWDC14 Media

WWDC14 Media

Media #WWDC14 Harnessing Metadata in Audiovisual Media Session 505 Adam Sonnanstine AVFoundation Engineer © 2014 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. What Is Metadata? Data that describes audio, video, etc. in a movie file or stream iTunes Metadata Location Location Dynamic Location Your Metadata Agenda Metadata in AVFoundation • Inspection • Authoring Timed Metadata • Reading and playback • Authoring Privacy Authoring best practices Metadata in AVFoundation Timed Metadata Privacy Authoring Best Practices Model Objects AVFoundation AVAsset Model Objects AVFoundation AVMetadataItem ! Title: “Bridge Song” AVMetadataItem ! AVAsset AVMetadataItem ! 38.44°N 122.71°W AVMetadataItem <AVFoundation/AVMetadataItem.h> AVMetadataItem ! AVMetadataItem <AVFoundation/AVMetadataItem.h> AVMetadataItem ! AVMetadataIdentifieriTunesMetadataSongName identifier: NSString @“Bridge Song” value: id <NSObject, NSCopying> ! ! ! ! ! ! ! ! AVMetadataItem <AVFoundation/AVMetadataItem.h> AVMetadataItem ! AVMetadataIdentifieriTunesMetadataCoverArt identifier: NSString ! value: id <NSObject, NSCopying> ! ! ! !Identifier = key space + key ! ! ! Metadata Identifiers <AVFoundation/AVMetadataIdentifiers.h> Metadata Identifiers <AVFoundation/AVMetadataIdentifiers.h> AVMetadataIdentifieriTunesMetadataSongName AVMetadataIdentifieriTunesMetadataCopyright AVMetadataIdentifieriTunesMetadataCoverArt … AVMetadataIdentifierQuickTimeMetadataTitle AVMetadataIdentifierQuickTimeMetadataCopyright AVMetadataIdentifierQuickTimeMetadataLocationISO6709 … AVMetadataIdentifier3GPUserDataTitle AVMetadataIdentifier3GPUserDataCopyright AVMetadataIdentifier3GPUserDataAuthor … AVMetadataItem Payload data type AVMetadataItem ! AVMetadataIdentifieriTunesMetadataSongName @“Bridge Song” kCMMetadataBaseDataType_UTF8 dataType: NSString ! ! !<CoreMedia/CMMetadata.h> AVMetadataItem Payload data type AVMetadataItem ! AVMetadataIdentifieriTunesMetadataSongName @“Bridge Song” stringValue: NSString @“Bridge Song” kCMMetadataBaseDataType_UTF8 ! ! ! AVMetadataItem Payload data type AVMetadataItem ! AVMetadataIdentifieriTunesMetadataSongName @“Bridge Song” stringValue: NSString @“Bridge Song” kCMMetadataBaseDataType_UTF8 numberValue: NSNumber nil ! ! ! AVMetadataItem Payload data type AVMetadataItem ! AVMetadataIdentifieriTunesMetadataSongName @“Bridge Song” stringValue: NSString @“Bridge Song” kCMMetadataBaseDataType_UTF8 numberValue: NSNumber nil ! dateValue: NSDate nil ! ! AVMetadataItem Payload data type AVMetadataItem ! AVMetadataIdentifieriTunesMetadataSongName @“Bridge Song” stringValue: NSString @“Bridge Song” kCMMetadataBaseDataType_UTF8 numberValue: NSNumber nil ! dateValue: NSDate nil ! dataValue: NSData nil ! AVMetadataItem Payload data type AVMetadataItem ! AVMetadataIdentifieriTunesMetadataCoverArt stringValue: NSString ! nil numberValue: NSNumber ! nil ! dateValue: NSDate nil kCMMetadataBaseDataType_JPEG dataValue: NSData FF D8 FF E0 00 ... ! ! ! AVMetadataItem Payload data type AVMetadataItem ! AVMetadataIdentifierQuickTimeMetadataCreationDate @“2014-06-03” stringValue: NSString @“2014-06-03” kCMMetadataBaseDataType_UTF8 numberValue: NSNumber nil ! dateValue: NSDate June 3, 2014 ! dataValue: NSData nil ! Model Objects AVFoundation AVMetadataItem ! Title: “Bridge Song” AVMetadataItem ! AVAsset AVMetadataItem ! 38.44°N 122.71°W Read iTunes Metadata <AVFoundation/AVAsset.h> @property (nonatomic, readonly) NSArray *metadata; ! @property (nonatomic, readonly) NSArray *availableMetadataFormats; - (NSArray *)metadataForFormat:(NSString *)format; ! Get all iTunes metadata: iTunesArray = [asset metadataForFormat: AVMetadataFormatiTunesMetadata]; ! Get title(s) (AVMetadataItem.h, AVMetadataItemArrayFiltering protocol): titleArray = [AVMetadataItem metadataItemsFromArray: iTunesArray filteredByIdentifier: AVMetadataIdentifieriTunesMetadataSongName]; Read iTunes Metadata <AVFoundation/AVAsset.h> @property (nonatomic, readonly) NSArray *metadata; ! @property (nonatomic, readonly) NSArray *availableMetadataFormats; - (NSArray *)metadataForFormat:(NSString *)format; ! Get all iTunes metadata: iTunesArray = [asset metadataForFormat: AVMetadataFormatiTunesMetadata]; ! Get title(s) (AVMetadataItem.h, AVMetadataItemArrayFiltering protocol): titleArray = [AVMetadataItem metadataItemsFromArray: iTunesArray filteredByIdentifier: AVMetadataIdentifieriTunesMetadataSongName]; Read iTunes Metadata <AVFoundation/AVAsset.h> @property (nonatomic, readonly) NSArray *metadata; ! @property (nonatomic, readonly) NSArray *availableMetadataFormats; - (NSArray *)metadataForFormat:(NSString *)format; ! Get all iTunes metadata: iTunesArray = [asset metadataForFormat: AVMetadataFormatiTunesMetadata]; ! Get title(s) (AVMetadataItem.h, AVMetadataItemArrayFiltering protocol): titleArray = [AVMetadataItem metadataItemsFromArray: iTunesArray filteredByIdentifier: AVMetadataIdentifieriTunesMetadataSongName]; Read iTunes Metadata <AVFoundation/AVAsset.h> @property (nonatomic, readonly) NSArray *metadata; ! @property (nonatomic, readonly) NSArray *availableMetadataFormats; - (NSArray *)metadataForFormat:(NSString *)format; ! Get all iTunes metadata: iTunesArray = [asset metadataForFormat: AVMetadataFormatiTunesMetadata]; ! Get title(s) (AVMetadataItem.h, AVMetadataItemArrayFiltering protocol): titleArray = [AVMetadataItem metadataItemsFromArray: iTunesArray filteredByIdentifier: AVMetadataIdentifieriTunesMetadataSongName]; Read iTunes Metadata <AVFoundation/AVAsynchronousKeyValueLoading.h> AVMetadataItem *title = [titleArray firstObject]; ! [title loadValuesAsynchronouslyForKeys: @[ @“value” ] completionHandler: ^{ NSError *error = nil; ! if ([title statusOfValueForKey: @“value” error: &error] == AVKeyValueStatusLoaded) { NSString *title = [title stringValue]; // use title string } else { // handle error } }]; Read iTunes Metadata <AVFoundation/AVAsynchronousKeyValueLoading.h> AVMetadataItem *title = [titleArray firstObject]; ! [title loadValuesAsynchronouslyForKeys: @[ @“value” ] completionHandler: ^{ NSError *error = nil; ! if ([title statusOfValueForKey: @“value” error: &error] == AVKeyValueStatusLoaded) { NSString *title = [title stringValue]; // use title string } else { // handle error } }]; Read iTunes Metadata <AVFoundation/AVAsynchronousKeyValueLoading.h> AVMetadataItem *title = [titleArray firstObject]; ! [title loadValuesAsynchronouslyForKeys: @[ @“value” ] completionHandler: ^{ NSError *error = nil; ! if ([title statusOfValueForKey: @“value” error: &error] == AVKeyValueStatusLoaded) { NSString *title = [title stringValue]; // use title string } else { // handle error } }]; Read iTunes Metadata <AVFoundation/AVAsynchronousKeyValueLoading.h> AVMetadataItem *title = [titleArray firstObject]; ! [title loadValuesAsynchronouslyForKeys: @[ @“value” ] completionHandler: ^{ NSError *error = nil; ! if ([title statusOfValueForKey: @“value” error: &error] == AVKeyValueStatusLoaded) { NSString *title = [title stringValue]; // use title string } else { // handle error } }]; AVMetadataItem Localization An asset can have the same metadata in multiple languages ! AVMetadataItem Localization An! asset can have the same metadata in multiple languages Example:! AVMetadataIdentifierQuickTimeUserDataFullName ! AVMetadataItem Localization An! asset can have the same metadata in multiple languages Example:! AVMetadataIdentifierQuickTimeUserDataFullName ! AVMetadataItem Localization An! asset can have the same metadata in multiple languages Example:! AVMetadataIdentifierQuickTimeUserDataFullName ! AVMetadataItem Localization An! asset can have the same metadata in multiple languages Example:! AVMetadataIdentifierQuickTimeUserDataFullName ! AVMetadataItem Localization ! ! ! ! ! AVMetadataItem ! ! English, US locale: NSLocale ! @“en-US” extendedLanguageTag: NSString ! Accessibility Support Tagged characteristics WWDC 2013 Session 608—Preparing and Presenting Media for Accessibility Accessibility Support Tagged characteristics WWDC 2013 Session 608—Preparing and Presenting Media for Accessibility Read Tagged Characteristics <AVFoundation/AVAssetTrack.h> @property (nonatomic, readonly) NSArray *metadata; ! @property (nonatomic, readonly) NSArray *availableMetadataFormats; - (NSArray *)metadataForFormat:(NSString *)format; ! Get all QuickTime user data: userData = [track metadataForFormat: AVMetadataFormatQuickTimeUserData]; ! Get tagged characteristics: characteristics = [AVMetadataItem metadataItemsFromArray: userData filteredByIdentifier: AVMetadataIdentifierQuickTimeUserDataTaggedCharacteristic]; Read Tagged Characteristics <AVFoundation/AVAssetTrack.h> @property (nonatomic, readonly) NSArray *metadata; ! @property (nonatomic, readonly) NSArray *availableMetadataFormats; - (NSArray *)metadataForFormat:(NSString *)format; ! Get all QuickTime user data: userData = [track metadataForFormat: AVMetadataFormatQuickTimeUserData]; ! Get tagged characteristics: characteristics = [AVMetadataItem metadataItemsFromArray: userData filteredByIdentifier: AVMetadataIdentifierQuickTimeUserDataTaggedCharacteristic]; Read Tagged Characteristics <AVFoundation/AVAssetTrack.h> @property (nonatomic, readonly) NSArray *metadata; ! @property (nonatomic, readonly) NSArray *availableMetadataFormats; - (NSArray *)metadataForFormat:(NSString *)format; ! Get all QuickTime user data: userData = [track metadataForFormat: AVMetadataFormatQuickTimeUserData]; ! Get tagged characteristics: characteristics = [AVMetadataItem metadataItemsFromArray: userData filteredByIdentifier: AVMetadataIdentifierQuickTimeUserDataTaggedCharacteristic];

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    143 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us