我需要使用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)
有同步方法吗?
谢谢.
试图使用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) 我想将存储在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) 我找到了通过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)
以上这些有什么区别吗?
在这个问题中实现了编码视频(带音频)的解决方案,使用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) 我现在正在使用一个应用程序来传输来自网址的数据.我能够使用AVAsset和AVPlayer作为播放器实现流媒体.现在,我想要做的是将AVAsset中的流式字节保存到本地的音乐文件中.它基本上是将AvAsset写入音乐文件.我想到的是将AVAsset转换为NSData,但我认为这是不可能的.
我怎样才能做到这一点?这可能吗?
从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) 我正在做一个项目,该项目需要对大量短(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)
问题是这会导致音频和视频不同步(视频似乎滞后于音频。)一些观察:
我已经测试了许多不同的计算时间范围的策略,但似乎都没有解决问题:
enum CompositionStrategy: Int, CaseIterable …Run Code Online (Sandbox Code Playgroud) 我想修剪一个视频文件.我想从图库中选择视频并将其转换为15秒的视频.如果我使用拾取器视图控制器进行常规修剪,它不会指定时间并只显示帧,但我需要修复15秒.我怎样才能做到这一点?
我正在使用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永远不会调用(即使在等待几分钟后),因此我不知道何时向用户显示加载视频失败的消息.
我的问题是:
avasset ×10
ios ×5
avfoundation ×3
avplayer ×3
avplayeritem ×3
swift ×3
objective-c ×2
albumart ×1
cover ×1
ios5 ×1
ios8 ×1
iphone ×1
orientation ×1
save ×1
swift3 ×1
video ×1