2012-03-14 5 views
9

Я искал много и не мог найти что-либо отношение ... Я работаю на IOS аудио файлов, а вот то, что я хочу сделать ...IOS Аудио Обрезка

  1. Запись аудио и сохранить Clip (Проверено, я сделал это с помощью AVAudioRecorder)
  2. изменения высоты (Checked, ли это с помощью Дирак)
  3. Обрезка :(

у меня есть два маркера, то есть начиная & конечное смещение и использование этой информации Я хочу обрезать записанный файл и хочу сохранить его обратно. Я не хочу использовать «искать», потому что позже я хочу синхронизировать все записанные файлы (так же, как флеш-ролики на временной шкале), а затем, наконец, я хочу экспортировать как один аудиофайл.

+0

благодаря mattjgalloway для редактирования ... –

ответ

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], не так ли? –

+1

vocalStartMarker и vocalEndMarker находятся в секундах. Например, обрезая среднюю секунду 10-секундного клипа, вы должны установить vocalStartMarker = 4.5 и vocalEndMarker = 5.5. – kyleobrien

+0

Я думаю, что мы просто используем: CMTime startTime = CMTimeMake (vocalStartMarker, 1); –

2

Вот пример кода, который обрезает аудиофайл с начала &, заканчивая смещение и сохраняет его обратно. Пожалуйста, проверьте это iOS Audio Trimming.

// 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

импорт следующих двух библиотек в .м

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

и после этого вставить следующий код, вы сможете обрезать аудиофайл с помощью двух больших пальцев.

- (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

+0

. На экране появится слайдер, и будут два больших пальца. с помощью больших пальцев вы сможете обрезать аудио (.m4a). @iwantMyAnswerNow –