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