我有这个问题。我正在通过AVAssetExportSession修剪声音文件。我设置时间范围,然后异步导出。我将输出文件保存在与输入文件不同的名称下。
它工作正常,但这是第一次。当我尝试修剪修剪过的文件时,它会以整个持续时间导出它,但CMTimeRangeShow会显示正确的时间范围。
任何人都知道,我做错了什么?
答案 0 :(得分:1)
我不确定我的代码现在可用,因为它适用于iOS7。我希望这会对你有所帮助。
- (BOOL)trimAudio :(NSURL *) url
{
float vocalStartMarker = timeFrom;
float vocalEndMarker = timeTo;
NSURL *audioFileInput = url_Audio;
NSURL *audioFileOutput = url;
if (!audioFileInput || !audioFileOutput)
{
return NO;
}
[[NSFileManager defaultManager] removeItemAtURL:audioFileOutput error:NULL];
AVAsset *asset = [AVAsset assetWithURL:audioFileInput];
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset
presetName:AVAssetExportPresetAppleM4A];
if (exportSession == nil)
{
return NO;
}
CMTime startTime = CMTimeMake((int)(floor(vocalStartMarker * 100)), 100);
CMTime stopTime = CMTimeMake((int)(ceil(vocalEndMarker * 100)), 100);
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime);
exportSession.outputURL = audioFileOutput;
exportSession.outputFileType = AVFileTypeAppleM4A;
exportSession.timeRange = exportTimeRange;
[exportSession exportAsynchronouslyWithCompletionHandler:^
{
if (AVAssetExportSessionStatusCompleted == exportSession.status)
{
// It worked!
}
else if (AVAssetExportSessionStatusFailed == exportSession.status)
{
// It failed...
[[[UIAlertView alloc]initWithTitle:@"Unknown Error" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]show];
}
}];
return YES;
}
答案 1 :(得分:0)
您确定正确使用CMTimeRangeMake吗?
你传递的是开始时间和持续时间,而不是开始时间和结束时间。
答案 2 :(得分:0)
您应该检查输出文件是否已存在。
" exportAsynchronouslyWithCompletionHandler"不会覆盖outputfile。
答案 3 :(得分:0)
检查state
中的导出会话的error
和exportAsynchronouslyWithCompletionHandler
信息,确保输出网址文件不存在。
参考这两个主题,祝你好运!