我正在编写一个使用AVFoundation处理视频的应用程序。

我的应用程序的行为很简单:我从相机胶卷上拍摄视频,然后创建带有一些音轨的AVMutableComposition。使用混合合成,我初始化了一个AVAssetExportSession,它将视频文件存储在我的应用程序的documents目录中。

到目前为止,一切正常:我的视频已存储,并且可以在另一个 Controller 中播放。如果我将刚刚存储在我的文档文件夹中的视频进行编辑(与第一次AVmutableComposition,AVAssetExportSession相同),就可以了。

但是我第三次执行此过程来编辑视频时,AVASsetExportSession状态变为“失败”,并出现以下错误:



我读到这是无法导出 session 的一般错误。这是什么意思?为什么只第三次进行编辑?可能是内存管理错误吗?一个错误?这是我的AVAssetExportSession的代码:

 _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
_assetExport.shouldOptimizeForNetworkUse = YES;

///data odierna
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"ddMMyyyyHHmmss"];

NSDate *now = [[NSDate alloc] init];

NSString *dateString = [format stringFromDate:now];
[now release];
[format release];
NSString* ext = @".MOV";
NSString* videoName=[NSString stringWithFormat:@"%@%@", dateString, ext];

///data odierna
NSString *exportPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:videoName];

if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath])
{
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}


_assetExport.outputFileType = AVFileTypeQuickTimeMovie;

[_assetExport setTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)];
NSURL    *exportUrl = [NSURL fileURLWithPath:exportPath] ;

_assetExport.outputURL = exportUrl ;

[_assetExport exportAsynchronouslyWithCompletionHandler:^
{
    switch (_assetExport.status)
    {
        case AVAssetExportSessionStatusFailed:
        {
            NSLog (@"FAIL %@",_assetExport.error);
            if ([[NSFileManager defaultManager] fileExistsAtPath:[_assetExport.outputURL path]])
            {
                [[NSFileManager defaultManager] removeItemAtPath:[_assetExport.outputURL path] error:nil];
            }

            [self performSelectorOnMainThread:@selector (ritenta)
                                   withObject:nil
                                waitUntilDone:NO];
            break;
        }
        case AVAssetExportSessionStatusCompleted:
        {
            NSLog (@"SUCCESS");

            [self performSelectorOnMainThread:@selector (saveVideoToAlbum:)
                                   withObject:exportPath
                                waitUntilDone:NO];
            break;
        }
        case AVAssetExportSessionStatusCancelled:
        {
            NSLog (@"CANCELED");

            break;
        }
    };
}];

我在网络上进行了许多搜索,有些人在 session 的outputURL中遇到了问题,但是我已经尝试过了,并且在我的代码中似乎还可以。为了给文件分配一个唯一的名称,我使用了NSDate。出于调试目的,我尝试恢复标准字符串名称,但问题仍然存在。有任何想法吗?有人可以向我建议另一种方法,用AssetWriter插入AVassetExportSession的 Assets 将其导出到文档文件夹吗?

最佳答案

问题是您已将_assetExport.outputFileType设置为AVFileTypeQuickTimeMovie类型。不太可能支持的类型。

尝试使用以下代码找出_assetExport支持的输出文件类型,并使用合适的代码。

NSLog (@"created exporter. supportedFileTypes: %@", exporter.supportedFileTypes);

或者
只需更改
_assetExport.outputFileType = AVFileTypeQuickTimeMovie;


exporter.outputFileType = @"com.apple.m4a-audio";

也不要忘记将扩展名从
NSString* ext = @".MOV";  to @".m4a"

这应该工作。它为我工作。

10-08 04:31