元数据
先引入元数据概念
元数据可以理解为资源的基本描述数据,比如一个视频文件或者音频文件,它的时间,频率,声道等信息,其也可以表示更加详细的音视频流数据以及字幕等信息
在AVFoundation框架中,关于元数据的两个类
AVAsset
并不能被实例化,可通过URL实例化其子类
AVAsset *asset1 = [AVAsset assetWithURL:[NSURL URLWithString:@""]];
assets1是子类对象
AVURLAsset *URLAsset = [[AVURLAsset alloc]initWithURL:[NSURL URLWithString:@""] options:@{}];
因为资源文件多种格式以及多种不同参数下的资源文件都存在较大差异,通过AVAseet封装,让资源文件标准化,整个框架更加简介明确
AVAssetTrack
更加详细的媒体
元数据类,每个AVAseet可以对应多个用于描述更加细致的AVAssetTrack
对象
一个视频至少有2个轨道,一个播放声音,一个播放画面。AVFoundation有专门类承载多媒体track,就是这个。
@interface AVAsset (AVAssetTrackInspection)
/*!
@property tracks
@abstract Provides the array of AVAssetTracks contained by the asset
*/
@property (nonatomic, readonly) NSArray<AVAssetTrack *> *tracks AVF_DEPRECATED_FOR_SWIFT_ONLY("Use load(.tracks) instead", macos(10.7, 13.0), ios(4.0, 16.0), tvos(9.0, 16.0), watchos(1.0, 9.0));
@end
获取tracks
- (void)testMetaItem {
NSURL *assetUrl = [[NSBundle mainBundle] URLForResource:@"111" withExtension:@"mov"];
AVAsset *videoAsset = [AVAsset assetWithURL:assetUrl];
NSArray *keys = @[@"tracks", @"availableMetadataFormats"];
}
/*
(lldb) po videoAsset.tracks
<__NSArrayM 0x600002ba1c50>(
<AVAssetTrack: 0x6000027a8020, trackID = 1, mediaType = vide>,
<AVAssetTrack: 0x6000027a8130, trackID = 2, mediaType = soun>
)
(lldb) po [videoAsset trackWithTrackID:1]
<AVAssetTrack: 0x6000027a8020, trackID = 1, mediaType = vide>*/
获取
videoAsset.tracks
[videoAsset trackWithTrackID:1]
- tracksWithMediaType
通过AVMediaTypeAudio
类型获取
[videoAsset tracksWithMediaType:AVMediaTypeAudio];
/*
typedef NSString * AVMediaType NS_EXTENSIBLE_STRING_ENUM;
AVF_EXPORT AVMediaType const AVMediaTypeVideo API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(1.0));
AVF_EXPORT AVMediaType const AVMediaTypeAudio API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(1.0));
AVF_EXPORT AVMediaType const AVMediaTypeText API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(1.0));
AVF_EXPORT AVMediaType const AVMediaTypeClosedCaption API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(1.0));
AVF_EXPORT AVMediaType const AVMediaTypeSubtitle API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(1.0));
AVF_EXPORT AVMediaType const AVMediaTypeTimecode API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(1.0));
AVF_EXPORT AVMediaType const AVMediaTypeMetadata API_AVAILABLE(macos(10.8), ios(6.0), tvos(9.0), watchos(1.0));
AVF_EXPORT AVMediaType const AVMediaTypeMuxed API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(1.0));*/
- tracksWithMediaCharacteristic
根据媒体特征返回track数组
[videoAsset tracksWithMediaCharacteristic:AVMediaCharacteristicAudible];
/**
AVF_EXPORT NSString *const AVMediaTypeMetadataObject NS_AVAILABLE_IOS(9_0);
AVF_EXPORT NSString *const AVMediaCharacteristicVisual NS_AVAILABLE(10_7, 4_0);
AVF_EXPORT NSString *const AVMediaCharacteristicAudible NS_AVAILABLE(10_7, 4_0);
AVF_EXPORT NSString *const AVMediaCharacteristicLegible NS_AVAILABLE(10_7, 4_0);
AVF_EXPORT NSString *const AVMediaCharacteristicFrameBased NS_AVAILABLE(10_7, 4_0);
AVF_EXPORT NSString *const AVMediaCharacteristicIsMainProgramContent NS_AVAILABLE(10_8, 5_0);
AVF_EXPORT NSString *const AVMediaCharacteristicIsAuxiliaryContent NS_AVAILABLE(10_8, 5_0);
AVF_EXPORT NSString *const AVMediaCharacteristicContainsOnlyForcedSubtitles NS_AVAILABLE(10_8, 5_0);
AVF_EXPORT NSString *const AVMediaCharacteristicTranscribesSpokenDialogForAccessibility NS_AVAILABLE(10_8, 5_0);
AVF_EXPORT NSString *const AVMediaCharacteristicDescribesMusicAndSoundForAccessibility NS_AVAILABLE(10_8, 5_0);
AVF_EXPORT NSString *const AVMediaCharacteristicEasyToRead NS_AVAILABLE(10_8, 6_0);
AVF_EXPORT NSString *const AVMediaCharacteristicDescribesVideoForAccessibility NS_AVAILABLE(10_8, 5_0);
AVF_EXPORT NSString *const AVMediaCharacteristicLanguageTranslation NS_AVAILABLE(10_11, 9_0);
AVF_EXPORT NSString *const AVMediaCharacteristicDubbedTranslation NS_AVAILABLE(10_11, 9_0);
AVF_EXPORT NSString *const AVMediaCharacteristicVoiceOverTranslation NS_AVAILABLE(10_11, 9_0);
*/
AVMetadataItem
提供访问具体资源元数据,可以对存储在格式中的帧元数据进行访问。
- (void)startGraspAVAseet {
AVAsset *asset1 = [AVAsset assetWithURL:[NSURL URLWithString:@""]];
AVURLAsset *URLAsset = [[AVURLAsset alloc]initWithURL:[NSURL URLWithString:@""] options:@{}];
asset1.tracks;
NSLog(@"%@",asset1);
AVAssetTrack *assetTrack;
AVMetadataItem *metadataItem;
//获取元数据
NSArray *keys = @[@"availableMetadataFormats"];
[asset1 loadValuesAsynchronouslyForKeys:keys completionHandler:^{
//异步获取
asset1.availableMetadataFormats;
}];
//修改元数据
AVAssetExportSession *assetExportSession = [[AVAssetExportSession alloc]initWithAsset:asset1 presetName:AVAssetExportPresetPassthrough];
assetExportSession.outputURL = @""; //输出地址
assetExportSession.outputFileType = @""; //输出的类型
assetExportSession.metadata = @[]; //metadata元数据数组
[assetExportSession exportAsynchronouslyWithCompletionHandler:^{
AVAssetExportSessionStatus status = session.status; //导出状态
switch (status) {
case AVAssetExportSessionStatusCompleted:
NSLog(@"导出成功");
break;
default:
break;
}
}];
}
AVMediaSelectionGroup
媒体选择,以字幕为例。
videoAsset.availableMediaCharacteristicsWithMediaSelectionOptions;
AVMediaSelectionGroup *assetMediaSelectionGroup = [videoAsset mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicAudible];
网友评论