2012-03-14 122 views
9

我搜索了很多,但沒有找到任何相關信息......我的工作在iOS上的音頻文件,並在這裏就是我想要做的......iOS的音頻修剪

  1. 錄音和保存剪輯(查了一下,我這樣做是使用AVAudioRecorder
  2. 改變音高(選中,這篇利用狄拉克)
  3. 修剪:(

我有兩個標誌,即開始&終止位置,並使用此信息我想修剪錄製的文件並想將其保存回去。我不想使用「seek」,因爲之後我想要同步播放所有錄製的文件(就像時間軸上的Flash影片剪輯一樣),最後我想導出爲一個音頻文件。

+0

感謝mattjgalloway進行編輯... – 2012-03-14 09:31:39

回答

25

下面是我用來從預先存在的文件中修剪音頻的代碼。如果您保存或保存爲其他格式,則需要更改M4A相關的常量。

- (BOOL)trimAudio 
{ 
    float vocalStartMarker = <starting time>; 
    float vocalEndMarker = <ending time>; 

    NSURL *audioFileInput = <your pre-existing file>; 
    NSURL *audioFileOutput = <the file you want to create>; 

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

    return YES; 
} 

還有Technical Q&A 1730,它給出了一個稍微更詳細的方法。

+0

vocalStartMarker和vocalEndMarker的範圍是[0,1],對嗎? – 2013-11-28 11:02:16

+1

vocalStartMarker和vocalEndMarker在幾秒鐘內。例如,修剪10秒剪輯的中間秒,您將設置vocalStartMarker = 4.5和vocalEndMarker = 5.5。 – kyleobrien 2013-12-03 20:42:39

+0

我想我們只是使用:CMTime startTime = CMTimeMake(vocalStartMarker,1); – 2013-12-10 07:39:40

2

這裏是一個示例代碼,它從開始&結束偏移量修剪音頻文件並保存回去。 請檢查這個iOS Audio Trimming。下面的下面的代碼,你將能夠修剪的音頻文件有兩個大拇指的幫助兩個庫中的.m

#import "BJRangeSliderWithProgress.h" 
#import <AVFoundation/AVFoundation.h> 

和粘貼後

// Path of your source audio file 
NSString *strInputFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"abc.mp3"]; 
NSURL *audioFileInput = [NSURL fileURLWithPath:strInputFilePath]; 

// Path of your destination save audio file 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
    NSString *libraryCachesDirectory = [paths objectAtIndex:0]; 
    libraryCachesDirectory = [libraryCachesDirectory stringByAppendingPathComponent:@"Caches"]; 

NSString *strOutputFilePath = [NSString stringWithFormat:@"%@%@",libraryCachesDirectory,@"/abc.mp4"]; 
NSURL *audioFileOutput = [NSURL fileURLWithPath:strOutputFilePath]; 

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; 
} 
float startTrimTime = 0; 
float endTrimTime = 5; 

CMTime startTime = CMTimeMake((int)(floor(startTrimTime * 100)), 100); 
CMTime stopTime = CMTimeMake((int)(ceil(endTrimTime * 100)), 100); 
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime); 

exportSession.outputURL = audioFileOutput; 
exportSession.outputFileType = AVFileTypeAppleM4A; 
exportSession.timeRange = exportTimeRange; 

[exportSession exportAsynchronouslyWithCompletionHandler:^ 
{ 
    if (AVAssetExportSessionStatusCompleted == exportSession.status) 
    { 
     NSLog(@"Success!"); 
    } 
    else if (AVAssetExportSessionStatusFailed == exportSession.status) 
    { 
     NSLog(@"failed"); 
    } 
}]; 
2

進口。

- (void) viewDidLoad 
{ 
     [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

     mySlider = [[BJRangeSliderWithProgress alloc] initWithFrame:CGRectMake(20, 100, 300, 50)]; 

     [mySlider setDisplayMode:BJRSWPAudioSetTrimMode]; 

     [mySlider addTarget:self action:@selector(valueChanged) forControlEvents:UIControlEventValueChanged]; 

     [mySlider setMinValue:0.0]; 

     NSString *strInputFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"saewill.mp3"]; 

     NSURL *audioFileInput = [NSURL fileURLWithPath:strInputFilePath]; 

     audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:audioFileInput error:nil]; 

     [mySlider setMaxValue:audioPlayer.duration]; 

     [self.view addSubview:mySlider]; 
} 

-(void)valueChanged { 
     NSLog(@"%f %f", mySlider.leftValue, mySlider.rightValue); 
} 


-(IBAction)playTheSong 
{ 
     // Path of your source audio file 
     NSString *strInputFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"saewill.mp3"]; 
     NSURL *audioFileInput = [NSURL fileURLWithPath:strInputFilePath]; 

     // Path of your destination save audio file 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
     NSString *libraryCachesDirectory = [paths objectAtIndex:0]; 
     //libraryCachesDirectory = [libraryCachesDirectory stringByAppendingPathComponent:@"Caches"]; 

     NSString *strOutputFilePath = [libraryCachesDirectory stringByAppendingPathComponent:@"output.mov"]; 
     NSString *requiredOutputPath = [libraryCachesDirectory stringByAppendingPathComponent:@"output.m4a"]; 
     NSURL *audioFileOutput = [NSURL fileURLWithPath:requiredOutputPath]; 

     [[NSFileManager defaultManager] removeItemAtURL:audioFileOutput error:NULL]; 
     AVAsset *asset = [AVAsset assetWithURL:audioFileInput]; 

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


     float startTrimTime = mySlider.leftValue; 
     float endTrimTime = mySlider.rightValue; 

     CMTime startTime = CMTimeMake((int)(floor(startTrimTime * 100)), 100); 
     CMTime stopTime = CMTimeMake((int)(ceil(endTrimTime * 100)), 100); 
     CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime); 

     exportSession.outputURL = audioFileOutput; 
     exportSession.outputFileType = AVFileTypeAppleM4A; 
     exportSession.timeRange = exportTimeRange; 

     [exportSession exportAsynchronouslyWithCompletionHandler:^ 
     { 
      if (AVAssetExportSessionStatusCompleted == exportSession.status) 
      { 
       NSLog(@"Success!"); 
       NSLog(@" OUtput path is \n %@", requiredOutputPath); 
       NSFileManager * fm = [[NSFileManager alloc] init]; 
       [fm moveItemAtPath:strOutputFilePath toPath:requiredOutputPath error:nil]; 
       //[[NSFileManager defaultManager] removeItemAtURL:audioFileOutput error:NULL]; 

       NSURL *url=[NSURL fileURLWithPath:requiredOutputPath]; 
       NSError *error; 
       audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error]; 
       audioPlayer.numberOfLoops=0; 
       [audioPlayer play]; 

      } 
      else if (AVAssetExportSessionStatusFailed == exportSession.status) 
      { 
       NSLog(@"failed with error: %@", exportSession.error.localizedDescription); 
      } 
     }]; 

} 
+0

你可以通過添加一些關於 – arghtype 2014-07-29 13:39:05

+0

發生了什麼的評論來使這個答案更好,屏幕上會出現一個滑塊並且會有兩個拇指。在拇指的幫助下,您將能夠修剪音頻(.m4a)。 @iwantMyAnswerNow – 2014-07-30 06:39:03