gpt4 book ai didi

ios - 在 IOS 9 中合并音频文件时 AVAssetExportSessionStatusFailed

转载 作者:行者123 更新时间:2023-11-29 10:22:48 25 4
gpt4 key购买 nike

我已经使用了这段代码,它在以前版本的 IOS 9 上工作得很好。但是在 IOS 9 版本上它总是 AVAssetExportSessionStatusFailed

AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/firstPart.caf",docsDir]] options:nil];
AVAsset *avAsset2 = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/New-Recording.caf",docsDir]] options:nil];

AVMutableComposition *composition = [[AVMutableComposition alloc] init];
[composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

AVAssetTrack *assetTrack1;
AVAssetTrack *assetTrack2;

if ([avAsset1 tracksWithMediaType:AVMediaTypeAudio].count > 0) {
assetTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
assetTrack2 = [[avAsset2 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
}

CMTime insertionPoint = kCMTimeZero;
[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset1.duration) ofTrack:assetTrack1 atTime:insertionPoint error:nil];
insertionPoint = CMTimeAdd(insertionPoint, avAsset1.duration);
[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset2.duration) ofTrack:assetTrack2 atTime:insertionPoint error:nil];

AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetAppleM4A];
exportSession.outputURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/mergedFilePart1.caf",documentsDirectory]];
exportSession.outputFileType = AVFileTypeAppleM4A;

[exportSession exportAsynchronouslyWithCompletionHandler:^{
if (AVAssetExportSessionStatusCompleted == exportSession.status) {

NSLog(@"AVAssetExportSessionStatusCompleted");

[self mergeAudioPart2];

} else if (AVAssetExportSessionStatusFailed == exportSession.status) {
NSLog(@"AVAssetExportSessionStatusFailed");
} else {
NSLog(@"Export Session Status: %ld", (long)exportSession.status);
}
}];

我在整个互联网上进行了搜索,但没有找到任何解决方案,我们将不胜感激。

最佳答案

您的代码应该 可以工作,但是如果没有看到您的输入文件就很难判断。然而,它仍然可以改进。

出于某种原因,您有一个未使用的可变轨道。您可以删除它:

AVMutableComposition *composition = [[AVMutableComposition alloc] init];
// This track is unused. Delete it!
// [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

当导出失败时 (AVAssetExportSessionStatusFailed == exportSession.status) 检查 exportSession.error 以获得更多信息。 AVFoundation 错误消息通常有很多不足之处,但您可能很幸运。

您正在导出 m4a 文件,但文件后缀为 .caf。将其更改为 .m4a(AVAssetExportSession 似乎不支持导出为 AVFileTypeCoreAudioFormat)。确保在导出之前始终删除输出 URL,您忘记这样做了:

NSURL *ouputURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/mergedFilePart1.m4a",documentsDirectory]];
[[NSFileManager defaultManager] removeItemAtURL:ouputURL error:nil];

AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetAppleM4A];
exportSession.outputURL = ouputURL;
exportSession.outputFileType = AVFileTypeAppleM4A;

insertTimeRange:ofTrack:error: 返回成功标志和错误!咨询他们!他们可能会指出您的代码存在问题!

NSError *error;
if (![track insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset1.duration) ofTrack:assetTrack1 atTime:insertionPoint error:&error]) {
NSLog(@"ERROR 1: %@", error);
}

这个条件很奇怪。您检查一项 Assets 中是否存在音轨,然后也使用另一项 Assets :

if ([avAsset1 tracksWithMediaType:AVMediaTypeAudio].count > 0) {
assetTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
assetTrack2 = [[avAsset2 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
}

关于ios - 在 IOS 9 中合并音频文件时 AVAssetExportSessionStatusFailed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34038977/

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