gpt4 book ai didi

ios - AVAssetExportSession 无法从照片库转换 .mov。为什么?

转载 作者:搜寻专家 更新时间:2023-10-30 22:19:05 28 4
gpt4 key购买 nike

场景:
我希望减少 iTouch 照片库中单个视频的大小。

1. 从库中收集 videoAssets。
2. 获取 PHAsset 的缩略图 - 有效。
3. 从库中获取实际视频。
4. 从库中请求 AVAssetForVideo。
5. 通过 ExportSessions 转换视频...加载各种参数。
6. 尝试将导出运行到 tmp 目录以供使用。
* 失败 *

这是调试输出:

enter image description here

这是错误消息:
enter image description here

func getVideoFromPhotoLibrary() {
let videoAssets = PHAsset.fetchAssetsWithMediaType(.Video, options:nil)

videoAssets.enumerateObjectsUsingBlock {
(obj:AnyObject!, index:Int, stop:UnsafeMutablePointer<ObjCBool>) in
let mySize = CGSizeMake(120,120)
let myAsset = obj as! PHAsset

let imageManager = PHImageManager.defaultManager()
var myVideo:BlissMedium?

// Request the poster frame or the image of the video
imageManager.requestImageForAsset(myAsset, targetSize:mySize, contentMode: .AspectFit, options: nil) {
(imageResult, info) in
let thumbnail = UIImage(named:"videoRed")
myVideo = BlissMedium(blissImage: imageResult, creationDate:myAsset.creationDate)
myVideo!.mediumType = .video
}

// Actual Video:
imageManager.requestAVAssetForVideo(myAsset, options: nil, resultHandler: {result, audio, info in
let asset = result as! AVURLAsset
let mediaURL = asset.URL
let session = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetMediumQuality)
let filename = "composition.mp4"


session.outputURL = NSURL(string: NSTemporaryDirectory());
session.outputFileType = AVFileTypeQuickTimeMovie;

session.exportAsynchronouslyWithCompletionHandler({ () -> Void in
dispatch_async(dispatch_get_main_queue(), {
if session.status == AVAssetExportSessionStatus.Completed {
println("Success")
}
else {
println(session.error?.localizedDescription)
//The requested URL was not found on this server.
}
})
})
})

if nil != myVideo {
self.gBlissVideoMedia.append(myVideo!)
}
}
}


我检查以确保目标路径/文件存在;然后我添加了“AVFileTypeMPEG4”输出类型以匹配预期的 .mp4:

let targetDir = createTempDirectory("bliss/composition.mp4") as String?

if NSFileManager.defaultManager().fileExistsAtPath(targetDir!) {
println("*** file exists! ***")
} else {
return
}
session.outputURL = NSURL(string: targetDir!);
session.outputFileType = AVFileTypeMPEG4

我还有问题:

* file exists! *

Optional("The operation could not be completed")

我做错了什么;缺少什么?


更新:
我能够在 Objective-C 中成功运行到我的 NSHomeDirectory() 与 NSTemporaryDictory() 的导出。

但是......用 Swift 编写的相同代码失败了。

我注意到 Swift 中目标输出的绝对路径发生了变化,而在 Objective-C 中没有:
enter image description here

也许这是 Swift 1.2 的错误???

最佳答案

我不确定是否可以保存在临时目录的根目录中,我通常使用此功能来创建一个新的临时目录以供我使用:

func createTempDirectory(myDir: String) -> String? {
let tempDirectoryTemplate = NSTemporaryDirectory().stringByAppendingPathComponent(myDir)

let fileManager = NSFileManager.defaultManager()

var err: NSErrorPointer = nil
if fileManager.createDirectoryAtPath(tempDirectoryTemplate, withIntermediateDirectories: true, attributes: nil, error: err) {
return tempDirectoryTemplate
} else {
return nil
}
}

尝试在此函数返回的目录中进行转换。

希望对你有帮助!

关于ios - AVAssetExportSession 无法从照片库转换 .mov。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30699219/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com