标签: avasset

同步将PHAsset(视频)转换为AVAsset

我需要使用AVAsset对象,以便使用AVPlayer和AVPlayerLayer播放它.我开始使用Photos框架,因为不推荐使用AssetsLibrary.现在我到了我有一个PHAsset对象数组的点,我需要将它们转换为AVAsset.我尝试通过PHFetchResult枚举并使用PHAsset的本地化描述分配新的AVAsset,但是当我播放时它似乎没有显示任何视频.

    PHAssetCollection *assetColl = [self scaryVideosAlbum];

    PHFetchResult *getVideos = [PHAsset fetchAssetsInAssetCollection:assetColl options:nil];

    [getVideos enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
            NSURL *videoUrl = [NSURL URLWithString:asset.localizedDescription];
            AVAsset *avasset = [AVAsset assetWithURL:videoUrl];
            [tempArr addObject:avasset];
    }];
Run Code Online (Sandbox Code Playgroud)

我假设本地化描述不是视频的绝对URL.

我还偶然发现了PHImageManager和requestAVAssetForVideo,但是,当涉及到视频时,options参数没有isSynchrounous属性,image参数就是这种情况.

        PHVideoRequestOptions *option = [PHVideoRequestOptions new];
        [[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:option resultHandler:^(AVAsset * _Nullable avasset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
Run Code Online (Sandbox Code Playgroud)

有同步方法吗?

谢谢.

video ios avasset photosframework

11
推荐指数
2
解决办法
1万
查看次数

AVAsset方向/旋转问题

试图使用Ray伟大的教程来解决方向问题.

左 - 视频应该如何(纵向),右边 - 不需要的旋转结果

在此输入图像描述

使用的代码

   func setUpVideoNew()
    {

        let originalVideoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]
        let composition = AVMutableComposition()
        let videoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: 1)
        let timeRange = originalVideoTrack.timeRange
        do {
            try videoTrack.insertTimeRange(timeRange, ofTrack: originalVideoTrack, atTime: kCMTimeZero)
        } catch {

        }
        let mainInstruction = AVMutableVideoCompositionInstruction()
        mainInstruction.timeRange = timeRange

        let firstlayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
        let firstAssetTrack = originalVideoTrack


        //MARK - Fix Rotation
        var firstAssetOrientation_ = UIImageOrientation.Up

        var isFirstAssetPortrait_ = false

        var firstTransform = videoTrack.preferredTransform;
        if firstTransform.a == 0 && firstTransform.b …
Run Code Online (Sandbox Code Playgroud)

orientation avplayer avasset swift avplayeritem

9
推荐指数
1
解决办法
2256
查看次数

通过AVAssetExportSession将资产导出到文件系统总是失败 - Swift 3

我想将存储在AVPlayerItem中的.mp4-video导出到文件系统.如果成功,我想把它变成一个NSData变量(但这不是问题的一部分,只是想告诉你为什么我想把它存储到文件系统中).

//This is the AVPlayerItem-Object
let item = self.talentView.getCurrentItem()

//They return all true, so the item itself is not the issue
print(item.asset.isPlayable)
print(item.asset.isReadable)
print(item.asset.isExportable)

//Creating Path, where the file will be stored, also tried "video.mp4" at the appending string
var exportPath: NSString = NSTemporaryDirectory().appendingFormat("/video.mp4")
var exportUrl: NSURL = NSURL.fileURL(withPath: exportPath as String) as NSURL

let session = AVAssetExportSession(asset: item.asset, presetName: AVAssetExportPresetPassthrough)             
session?.outputFileType = AVFileTypeMPEG4
session?.outputURL = exportUrl as URL

session?.exportAsynchronously(completionHandler: { 

    //case is always .failed
    switch session!.status {
           case .failed: …
Run Code Online (Sandbox Code Playgroud)

avassetexportsession avasset swift avplayeritem swift3

9
推荐指数
0
解决办法
1043
查看次数

使用 AVPlayer、AVPlayerItem 和 AVPlayerAsset 之间有什么区别吗?

我找到了通过URL播放视频的三种方式。

let url = "some url"

// first way
AVPlayer(url: url)

// second way
let playerItem = AVPlayerItem(url: url)
AVPlayer(playerItem: playerItem)

// third way
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
AVPlayer(playerItem: playerItem)
Run Code Online (Sandbox Code Playgroud)

以上这些有什么区别吗?

ios avplayer avasset swift avplayeritem

9
推荐指数
1
解决办法
2770
查看次数

在设备上编码带有音频的视频时,AVAssetReaderOutput copyNextSampleBuffer会挂起

在这个问题中实现了编码视频(带音频)的解决方案,使用AVAssetWriter的视频编码 - CRASHES后,我发现代码在iPhone模拟器中正常工作.不幸的是,某些视频在实际的iPhone 5(和其他设备)上运行时无法对其音频进行编码.

例如,从WWDC 2011示例代码RosyWriter(https://developer.apple.com/library/IOS/samplecode/RosyWriter/Introduction/Intro.html)生成的视频不会完全编码,因为该函数-[AVAssetReaderOutput copyNextSampleBuffer]永远不会返回.

视频缓冲区正确输入,但一旦尝试复制第一个音频CMSampleBufferRef,呼叫就会挂起.当我在其他来源的视频上尝试此操作时,例如原生iOS相机应用中记录的视频,音频导入正确.

此线程https://groups.google.com/forum/#!topic/coreaudio-api/F4cqCu99nUI记录了copyNextSampleBuffer与AudioQueues一起使用时挂起的功能,并建议将操作保留在单个线程上.我已经尝试将所有内容保存在主线程上的单独线程中,但没有运气.

有没有其他人经历过这个并有可能的解决方案?

编辑:从RosyWriter生成的视频相对于来自本机Camera应用程序的视频,即音频流作为流0,视频流作为流1,其视频相反.

Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 60 kb/s
Metadata:
  creation_time   : 2013-10-28 16:13:05
  handler_name    : Core Media Data Handler
Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080, 8716 kb/s, 28.99 fps, 29.97 tbr, 600 tbn, 1200 tbc
Metadata:
  rotate          : 90
  creation_time   : 2013-10-28 16:13:05
  handler_name    : Core Media Data Handler …
Run Code Online (Sandbox Code Playgroud)

avfoundation ios avassetreader avasset

8
推荐指数
1
解决办法
2706
查看次数

IOS - 如何将AVAsset写入文件?

我现在正在使用一个应用程序来传输来自网址的数据.我能够使用AVAsset和AVPlayer作为播放器实现流媒体.现在,我想要做的是将AVAsset中的流式字节保存到本地的音乐文件中.它基本上是将AvAsset写入音乐文件.我想到的是将AVAsset转换为NSData,但我认为这是不可能的.

我怎样才能做到这一点?这可能吗?

objective-c save ios avasset

8
推荐指数
0
解决办法
1972
查看次数

iOS 8专辑封面

从iOS 8开始,来自iPad和iPhone设备的专辑封面的所有数据阵列都返回一个空数组.从本地文件(NSBundle)中提取时,我可以获得专辑封面或封面艺术,但从iTunes或设备本身购买的任何歌曲都会返回空白.

我已经更新到最新的XCode,两台设备上的最新iOS以及iTunes.我已经在iPad 4,iPad Air,iPhone 5,iPhone 6上进行了测试.希望有人知道发生了什么,它现在似乎是iOS 8中的一个已知错误.此外,我可以播放资产并检索歌曲名称和艺术家等内容.

MPMediaQuery *songQuery = [MPMediaQuery songsQuery];
NSArray *itemsFromGenericQuery = [songQuery items];
NSMutableArray *songsList = [[NSMutableArray alloc] initWithArray:itemsFromGenericQuery];
MPMediaItem *mediaItem = (MPMediaItem *)[songsList objectAtIndex:0];

NSURL *url = [mediaItem valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *commonArray = [assets commonMetadata];

//Test A
NSArray *albumArray = [AVMetadataItem metadataItemsFromArray:commonArray filteredByIdentifier:AVMetadataIdentifieriTunesMetadataCoverArt];
NSLog(@"commonArray = %lu",(unsigned long)[commonArray count]); //Returns 3
NSLog(@"albumArray has %lu",(unsigned long)[albumArray count]); //Returns 0 or null

//Test B
for (AVMetadataItem *metadataItem in asset.commonMetadata) {

    if …
Run Code Online (Sandbox Code Playgroud)

cover albumart avasset ios8

8
推荐指数
1
解决办法
738
查看次数

对 AVAssets 进行排序时使用的正确时间范围是多少?

我正在做一个项目,该项目需要对大量短(1-5 秒)AVAssets进行排序(问题在 n = 30 或更少时可见)。我可以找到的所有参考资料和示例项目都指向使用范围CMTimeRange(start: .zero, end: asset.duration)插入合成轨道,因此:

let audioTrack: AVAssetTrack = ...
let videoTrack: AVAssetTrack = ...
var playhead = CMTime.zero

for asset in assets {
  let assetRange = CMTimeRange(start: .zero, end: asset.duration)
  let (sourceAudioTrack, sourceVideoTrack) = sourceTracks(from: asset)
  try! audioTrack.insertTimeRange(assetRange, of: sourceAudioTrack, at: playhead)
  try! videoTrack.insertTimeRange(assetRange, of: sourceVideoTrack, at: playhead)
  playhead = playhead + assetRange.duration
}

Run Code Online (Sandbox Code Playgroud)

问题是这会导致音频和视频不同步(视频似乎滞后于音频。)一些观察:

  • 当我使用较少的剪辑时,问题似乎消失或不那么严重
  • 剪辑在自己播放时不会表现出这种行为
  • 某些资产具有时间范围不同的视频和音频轨道。我认为这可能是因为这里讨论的启动框架问题
  • 过滤掉轨道长度不同的资产并不能解决问题
  • 时间范围都是由系统在 44100 时间尺度给出的,所以这里讨论的时间尺度不匹配/四舍五入似乎不适用

我已经测试了许多不同的计算时间范围的策略,但似乎都没有解决问题:

enum CompositionStrategy: Int, CaseIterable …
Run Code Online (Sandbox Code Playgroud)

avfoundation avcomposition avasset

8
推荐指数
1
解决办法
239
查看次数

如何修剪视频文件并使用iOS SDK转换为15秒视频?

我想修剪一个视频文件.我想从图库中选择视频并将其转换为15秒的视频.如果我使用拾取器视图控制器进行常规修剪,它不会指定时间并只显示帧,但我需要修复15秒.我怎样才能做到这一点?

iphone avassetwriter ios5 avassetexportsession avasset

7
推荐指数
1
解决办法
5448
查看次数

AVPlayer/AVPlayerItem如何通知我的应用程序无法访问网络故障?

我正在使用AVPlayeriOS应用程序中的自定义视频播放器.要从网络播放视频我分配了一个播放器:

[[AVPlayer alloc] initWithURL:_URL];
Run Code Online (Sandbox Code Playgroud)

创建资产:

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}];
Run Code Online (Sandbox Code Playgroud)

playable异步加载密钥:

NSArray *keys = @[@"playable"];
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
    dispatch_async(dispatch_get_main_queue(), ^{
        for (NSString *key in keys) {
            NSError *error;
            AVKeyValueStatus status = [asset statusOfValueForKey:key error:&error];

            if (status == AVKeyValueStatusFailed) {
                NSLog(@"Failed to load asset key %@ error %@", key, [error localizedDescription]);
                [self fail];
                return;
            }
        }

        if (asset.isPlayable) {
            [self.player replaceCurrentItemWithPlayerItem:self.playerItem];
        }
        else {
            [self fail];
        }
    });
}];
Run Code Online (Sandbox Code Playgroud)

问题是,当设备没有互联网连接或高丢包时,completionHandler永远不会调用(即使在等待几分钟后),因此我不知道何时向用户显示加载视频失败的消息.

我的问题是:

  1. 我错过了什么/是否有更好的方法来处理这个问题?
  2. 我应该推出自己的超时逻辑或者我应该只是从来没有 …

objective-c avfoundation ios avplayer avasset

7
推荐指数
1
解决办法
3471
查看次数