2014-02-14 3 views
2

내 앱에는 사용자가 간단한 메시지를 녹음 할 수있는 기능이 포함되어 있습니다. 나는 녹음의 시작과 끝에서 어떤 묵음 (또는 정확하게 말하면, 음량이 주어진 임계 값 이하로 떨어지는 오디오)을 잘라 내고 싶습니다.iOS : .aif 오디오 녹음의 시작과 끝에서 무음을 다듬는 방법?

AVAudioRecorder로 오디오를 녹음하고 .aif 파일로 저장하고 있습니다. 나는 오디오 레벨이 임계 값에 도달 할 때까지 녹음을 시작할 때까지 기다릴 수있는 방법에 대해 언급했다. 그곳에서 저를 데려 오겠지 만 끝에서 침묵을 없애는 데는 도움이되지 않을 것입니다.

이렇게 간단한 방법이 있다면 나는 영원히 감사 할 것입니다!

감사합니다.

답변

3

이 프로젝트는 마이크에서 오디오를 가져 와서 조용한 상태에서 시끄러운 소리와 방해를 유발합니다. 또한 끝 부분을 트리밍하고 페이드 인/페이드 아웃합니다.

https://github.com/fulldecent/FDSoundActivatedRecorder

관련 코드 당신이 찾고 있습니다 : 응답에 대한

- (NSString *)recordedFilePath 
{ 
    // Prepare output 
    NSString *trimmedAudioFileBaseName = [NSString stringWithFormat:@"recordingConverted%x.caf", arc4random()]; 
    NSString *trimmedAudioFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:trimmedAudioFileBaseName]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:trimmedAudioFilePath]) { 
     NSError *error; 
     if ([fileManager removeItemAtPath:trimmedAudioFilePath error:&error] == NO) { 
      NSLog(@"removeItemAtPath %@ error:%@", trimmedAudioFilePath, error); 
     } 
    } 
    NSLog(@"Saving to %@", trimmedAudioFilePath); 

    AVAsset *avAsset = [AVAsset assetWithURL:self.audioRecorder.url]; 
    NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio]; 
    AVAssetTrack *track = [tracks objectAtIndex:0]; 

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

    // create trim time range 
    CMTime startTime = CMTimeMake(self.recordingBeginTime*SAVING_SAMPLES_PER_SECOND, SAVING_SAMPLES_PER_SECOND); 
    CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, kCMTimePositiveInfinity); 

    // create fade in time range 
    CMTime startFadeInTime = startTime; 
    CMTime endFadeInTime = CMTimeMake(self.recordingBeginTime*SAVING_SAMPLES_PER_SECOND + RISE_TRIGGER_INTERVALS*INTERVAL_SECONDS*SAVING_SAMPLES_PER_SECOND, SAVING_SAMPLES_PER_SECOND); 
    CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime, endFadeInTime); 

    // setup audio mix 
    AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix]; 
    AVMutableAudioMixInputParameters *exportAudioMixInputParameters = 
    [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; 

    [exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 
                 timeRange:fadeInTimeRange]; 
    exportAudioMix.inputParameters = [NSArray 
             arrayWithObject:exportAudioMixInputParameters]; 

    // configure export session output with all our parameters 
    exportSession.outputURL = [NSURL fileURLWithPath:trimmedAudioFilePath]; 
    exportSession.outputFileType = AVFileTypeAppleM4A; 
    exportSession.timeRange = exportTimeRange; 
    exportSession.audioMix = exportAudioMix; 

    // MAKE THE EXPORT SYNCHRONOUS 
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     dispatch_semaphore_signal(semaphore); 
    }]; 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 

    if (AVAssetExportSessionStatusCompleted == exportSession.status) { 
     NSLog(@"AVAssetExportSessionStatusCompleted"); 
     return trimmedAudioFilePath; 
    } else if (AVAssetExportSessionStatusFailed == exportSession.status) { 
     // a failure may happen because of an event out of your control 
     // for example, an interruption like a phone call comming in 
     // make sure and handle this case appropriately 
     NSLog(@"AVAssetExportSessionStatusFailed %@", exportSession.error.localizedDescription); 
    } else { 
     NSLog(@"Export Session Status: %d", exportSession.status); 
    } 
    return nil; 
} 
+0

GitHub u가 제공하는 오류의 예 : 캐치되지 않은 예외 'NSInvalidArgumentException'으로 인해 앱 종료 중, 이유 : '*** - [NSURL initFileURLWithPath :] : nil string parameter' –

0

AVAudioRecorder로 오디오를 녹음하고 .aif 파일로 저장합니다. 나는 오디오 레벨이 임계 값에 도달 할 때까지 녹음을 시작할 때까지 기다릴 수있는 방법에 대해 언급했다. 그 곳으로 나를 데려다 줄 게.

버퍼링이 적절하지 않으면 시작이 잘리지 않습니다.

나는 쉬운 방법을 모른다. 원하는 오디오 파일을 녹음하고 원하는 시작 및 끝 지점으로 분석 한 후에 새 오디오 파일을 작성해야합니다. AIFF 형식을 잘 알고 있으면 (많은 사람들이하지는 않지만) 파일의 샘플 데이터를 쉽게 읽을 수 있다면 기존 파일을 수정하는 것이 쉽습니다.

분석 단계는 기본 구현에 매우 쉽습니다. 임계 값을 초과 할 때까지 샘플 데이터의 평균 성능을 평가합니다. 끝까지 반대로 반복하십시오.

+0

감사합니다 ... 나는 프로그래밍 말하기, 오디오 처리에 대해 아무것도 옆에 알고있다. 내가해야 할 일은 임계 값을 설정 한 다음 파일의 앞뒤에서 그것을 만지지 않는 모든 오디오를 다듬는 것입니다. 내가 알아 내려고하는 것은 실제로 ios SDK 및/또는 모든 오픈 소스 도구를 사용하여 실제로 그렇게하는 것입니다. – DanM

+0

@DanM 오디오 파일을 읽고 쓰고 분석을 위해 샘플 데이터를 원하는 형식으로 변환하기 위해'ExtAudioFile' API를 사용할 수 있습니다. 간단한 방법이 아닙니다.이를 위해 몇 백 줄의 코드를 작성해야합니다. – justin