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

Ios AVAssetExportSession无法从照片库转换.mov。为什么?,ios,swift,video,avfoundation,Ios,Swift,Video,Avfoundation,场景: 我希望缩小iTouch照片库中单个视频的大小。 1.从图书馆收集录像资料 2.获取PHAsset-works的缩略图 3.从库中获取实际视频 4.从库中请求AVAssetForVideo 5.通过ExportSessions转换视频。。。加载各种参数 6.尝试将导出运行到tmp目录中以供使用。 *失败* 以下是调试输出: 下面是错误消息: 我仍然有问题: *文件存在* 可选(“操作无法完成”) 我做错了什么;少了什么 更新: 我能够在Objective-C中成功地将导出运

场景:
我希望缩小iTouch照片库中单个视频的大小。 1.从图书馆收集录像资料
2.获取PHAsset-works的缩略图
3.从库中获取实际视频
4.从库中请求AVAssetForVideo
5.通过ExportSessions转换视频。。。加载各种参数
6.尝试将导出运行到tmp目录中以供使用。
*失败* 以下是调试输出:

下面是错误消息:

我仍然有问题:

*文件存在*

可选(“操作无法完成”)

我做错了什么;少了什么


更新:
我能够在Objective-C中成功地将导出运行到我的NSHomeDirectory()与NSTemporaryDictory()。 然而。。。用Swift编写的相同代码失败。

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


可能是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
    }
}
尝试在此函数返回的目录中进行转换


我希望这对你有帮助

我不太明白代码的最后一部分做了什么,在那里你可以找到一个文件是否存在。您正在查找哪个文件

因为我不明白这可能与此无关,但在您最顶层的代码中,我注意到您将
文件名设置为
composition.mp4
,但将
输出URL设置为
NSURL(字符串:NSTemporaryDirectory())
。由于速度不够快,我可能遗漏了一些东西,但在我看来,您似乎根本没有使用文件名,而是试图将文件写入文件夹。我相信设置一个合适的URL可能会解决这个问题,但我不确定。这方面的一个客观例子是:

NSURL * outputURL = [[NSURL alloc] 
    initFileURLWithPath:[NSString pathWithComponents:
    @[NSTemporaryDirectory(), @"composition.mp4"]]];
outputURL应该指向实际的文件,而不是它所在的文件夹。我想

无论如何,如果这不起作用,我也有一些其他的想法。 你在实际设备上试过吗?模拟器可能有问题

此外,不幸的是,由于不同的根本问题,我已经无数次地遇到错误
-12780
,所以这没有多大帮助

如果session.status==AVAssetExportSessionStatus.Completed,我看到您检查了
,您是否检查了实际状态?是
.Failed
,还是
.Unknown
?有几种状态

这可能不太可能,但在我的一个应用程序中,我使用相机捕获视频/音频,然后使用
AVAssetExportSession
对其进行编码/转换。开始录制时以及录制(导出)后出现奇怪的错误。我发现我可以更改
AVAudioSession
,这显然与设备处理媒体的方式有关。 我不知道如何使用Swift,但这是我的代码(在相关视图的视图中)


类别
play和record
允许我更快地启动相机,并且摆脱了偶尔挂起的
AVAssetExportSessionStatus.Unknown
和偶尔发生的崩溃
。失败了
(这也引发了
-12780
-错误)。

我尝试了你的函数,但仍然得到了相同的错误:(您是否尝试手动转到该目录并保存文件?我加入了文件存在检查器;并添加了“AVFileTypeMPEG4”请求。输出没有任何更改。基本上,我只想能够从iOS设备上下载一些典型视频。我已经创建了一个接收文件(vs directory)在临时目录中,并测试了它是否存在。问题之一是导出程序无法导出到现有文件。因此,我确保在重新创建目标文件之前将其删除。我曾经让它在Objective-C中工作,但后来它停止了工作。我还没有发现模式。我希望苹果能够提供请向我们发送一条更具描述性的错误消息。@FrederickC.Lee Ok..但您是否尝试了我建议的
outputURL
?请查看您的变量
filename
。它从未使用过。并且您的
会话.outputURL
设置为临时文件夹。请尝试我回答的第一部分。
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
    }
}
NSURL * outputURL = [[NSURL alloc] 
    initFileURLWithPath:[NSString pathWithComponents:
    @[NSTemporaryDirectory(), @"composition.mp4"]]];
NSError *error;
AVAudioSession *aSession = [AVAudioSession sharedInstance];
[aSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

[aSession setMode:AVAudioSessionModeVideoRecording error:&error];
[aSession setActive: YES error: &error];