美文网首页
16期_AVFoundation-核心AVAsset

16期_AVFoundation-核心AVAsset

作者: 萧修 | 来源:发表于2023-09-24 01:30 被阅读0次

元数据

先引入元数据概念

元数据可以理解为资源的基本描述数据,比如一个视频文件或者音频文件,它的时间,频率,声道等信息,其也可以表示更加详细的音视频流数据以及字幕等信息

在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];

相关文章

  • 2018-11-29

    AVAudioFoundation(1):使用 AVAsset AVFoundation(二):核心AVAsset

  • AVFoundation:资源和元数据

    AVAsset简介 AVFoundation最重要的类就是AVAsset,它是AVFoundation设计的核心,...

  • AVFoundation(二):核心AVAsset

    AVFoundation是一个对多媒体操作的库。多媒体一般以文件或者流的形式存在,显而易见,直接对多媒体进行操作并...

  • 三、资源和元数据 AVAsset

    简介 AV Foundation 最重要的类就是AVAsset,也是AV Foundation设计的核心。AVAs...

  • 从视频中提取音频

    AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithStri...

  • AVFoundation 基础知识

    基本知识 AVAsset正如官网文档所说——"AVAsset is an abstract class to re...

  • 视频裁剪

    AVAsset AVAsset是一个表现音视频媒体的抽象类.AVAsset对象给我们开发提供了媒体文件的访问接口....

  • iOS 视频压缩

    1.获取本地视频,fromUrl为本地视频链接 AVAsset*asset = [AVAsset assetWit...

  • iOS AVAsset

    GitHub地址(附代码) : iOS AVAsset 简书地址 : iOS AVAsset 博客地址 ...

  • AVAsset

    Asset的表示 AVAsset是AVFoundation框架中的核心的类,它提供了基于时间的音视频数据.(如电影...

网友评论

      本文标题:16期_AVFoundation-核心AVAsset

      本文链接:https://www.haomeiwen.com/subject/aayumdtx.html