cocoa-touch – 使用iOS修剪音频

我想实现一个功能,让用户修剪他以前记录的音频文件(.caf).录音部分已经可以使用,但是我如何添加类似于Voicememos应用程序中的修剪功能.苹果使用的音频修剪器是否有api?
任何帮助都会很棒……

解决方法

使用AVFoundation怎么样?将音频文件导入AVAsset(合成等),然后您可以将其 – 设置首选持续时间 – 导出到文件.

我之前编写了一个将资产导出到文件的股票函数,你也可以指定一个audiomix.如下所示,它导出所有文件,但你可以将一个NSTimeRange添加到exporter.timeRange,然后你去.我没有测试过,但应该工作(?).另一种方法是在创建AVAsset轨道时调整时间范围.当然,出口商只处理m4a(AAC).对不起,如果这不是你想要的.

-(void)exportAsset:(AVAsset*)asset toFile:(Nsstring*)filename overwrite:(BOOL)overwrite withMix:(AVAudioMix*)mix {
//NSArray* availablePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:asset];

AVAssetExportSession* exporter = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetAppleM4A];

if (exporter == nil) {
    DLog(@"Failed creating exporter!");
    return;
}

DLog(@"Created exporter! %@",exporter);

// Set output file type
DLog(@"Supported file types: %@",exporter.supportedFileTypes);
for (Nsstring* filetype in exporter.supportedFileTypes) {
    if ([filetype isEqualToString:AVFileTypeAppleM4A]) {
        exporter.outputFileType = AVFileTypeAppleM4A;
        break;
    }
}
if (exporter.outputFileType == nil) {
    DLog(@"Needed output file type not found? (%@)",AVFileTypeAppleM4A);
    return;
}

// Set outputURL
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
Nsstring* parentDir = [Nsstring stringWithFormat:@"%@/",[paths objectAtIndex:0]];

Nsstring* outPath = [Nsstring stringWithFormat:@"%@%@",parentDir,filename];

NSFileManager* manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:outPath]) {
    DLog(@"%@ already exists!",outPath);
    if (!overwrite) {
        DLog(@"Not overwriting,uh oh!");
        return;
    }
    else {
        // Overwrite
        DLog(@"Overwrite! (delete first)");
        NSError* error = nil;
        if (![manager removeItemAtPath:outPath error:&error]) {
            DLog(@"Failed removing %@,error: %@",outPath,error.description);
            return;
        }
        else {
            DLog(@"Removed %@",outPath);
        }
    }
}

NSURL* const outUrl = [NSURL fileURLWithPath:outPath];
exporter.outputURL = outUrl;
// Specify a time range in case only part of file should be exported
//exporter.timeRange =

if (mix != nil)
    exporter.audioMix = mix; // important

DLog(@"Starting export! (%@)",exporter.outputURL);
[exporter exportAsynchronouslyWithCompletionHandler:^(void) {
    // Export ended for some reason. Check in status
    Nsstring* message;
    switch (exporter.status) {
        case AVAssetExportSessionStatusFailed:
            message = [Nsstring stringWithFormat:@"Export Failed. Error: %@",exporter.error.description];
            DLog(@"%@",message);
            [self showAlert:message];
            break;
        case AVAssetExportSessionStatusCompleted: {
            /*if (playfileWhenExportFinished) {
             DLog(@"playfileWhenExportFinished!");
             [self playfileAfterExport:exporter.outputURL];
             playfileWhenExportFinished = NO;
             }*/
            message = [Nsstring stringWithFormat:@"Export completed: %@",filename];
            DLog(@"%@",message);
            [self showAlert:message];
            break;
        }
        case AVAssetExportSessionStatusCancelled:
            message = [Nsstring stringWithFormat:@"Export cancelled!"];
            DLog(@"%@",message);
            [self showAlert:message];
            break;
        default:
            DLog(@"Export unhandled status: %d",exporter.status);
            break;
    }       
}];
}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...