2009-11-19 3 views
5

녹음 된 파일에서 음성 레벨 (dB)을 나타내는 시각적 그래프를 만들어야합니다. 나는 이렇게하려고했습니다 :AVAudioPlayer - 미터링 - 파형 (그래프)을 만들고 싶습니다.

NSError *error = nil; 
AVAudioPlayer *meterPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.recording.fileName] error:&error]; 

if (error) { 
    _lcl_logger(lcl_cEditRecording, lcl_vError, @"Cannot initialize AVAudioPlayer with file %@ due to: %@ (%@)", self.recording.fileName, error, error.userInfo); 
} else { 
    [meterPlayer prepareToPlay]; 
    meterPlayer.meteringEnabled = YES; 

    for (NSTimeInterval i = 0; i <= meterPlayer.duration; ++i) { 
     meterPlayer.currentTime = i; 
     [meterPlayer updateMeters]; 
     float averagePower = [meterPlayer averagePowerForChannel:0]; 
     _lcl_logger(lcl_cEditRecording, lcl_vTrace, @"Second: %f, Level: %f dB", i, averagePower); 
    } 
} 
[meterPlayer release]; 

그러나 효과가 없다면 멋질 것입니다. 나는 항상 -160 dB를 얻는다. 그 구현 방법에 대한 다른 아이디어가 있습니까? 내가 나 자신을 사용하지 않은,하지만 애플의 avTouch 아이폰 샘플 AVAudioPlayer에 의해 구동 막대 그래프를 가지고

alt text http://img22.imageshack.us/img22/5778/waveform.png

+0

[https://github.com/prodia/AudioVisualizer](https://github.com/prodia/AudioVisualizer) –

답변

0

사람들, 내 자신의 질문에 다시 답할 것 같습니다 : http://www.supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/ 구체적인 내용은 없지만 적어도 Apple이 읽어야 할 문서를 알게 될 것입니다.

+1

저는이 사실이 1 년 전의 일임을 알고 있습니다.하지만 원래 게시물에서 오픈 소스 구성 요소를 게시 할 것이라고 말했습니까? 나는 당신의 블로그 포스트를 읽었지만 다운로드 가능한 것을 보지 못했습니다. 내가 뭔가를 놓쳤습니까, 아니면 마음이 바뀌 었습니까? –

+0

나는 내 마음을 바꾸지 않았지만, 단순히 그 일을 할 수있는 기회를 얻지 못했습니다. 귀하의 필요에 따라 저에게 이메일을 보내주십시오. 아마 당신을 도울 수있을 것입니다. –

3

, 당신은 쉽게 확인할 수 있습니다 :

UPD : 여기에 드디어 도착 무엇인가 그들이 어떻게하는지보십시오.

+0

이 샘플을 알고 있으며 주요 차이점은 오디오 파일이 재생된다는 것입니다. 나는 그것을 할 필요가 없다. 나는 실제로 그것을 연주하지 않고 임의의 순간에 파일의 임의의 부분을 조사 할 필요가있다. 그리고 그 특성을 시각화하는 그래프를 작성하십시오. –

+0

Ahhhh ... 데이터를 직접 읽고 선택한 기간의 레벨을 찾아야합니다. 파일이 압축 해제되지 않았기 때문에 압축을 풀거나 다른 프레임 워크를 사용하여 PCM 데이터를 가져와야합니다. ExtAudio, Audio Queue 및 Remote IO AudioUnit을 살펴보아야 할 부분입니다. 나는 아직도 나 자신을 배우고있다. – mahboudz

+0

>> 그리고 파일이 압축 해제되지 않았기 때문에 해독해야합니다 -> 제발, 응답을 모르는 경우 회신하지 마십시오. 압축 된 데이터 또는 원시 데이터를 읽는 데 차이가 없습니다. SDK가이 모든 것을 처리하고 있습니다. 따라서 당신은 나중에 당신을 읽을 사람들을 오도하는 것입니다. –

0

제약 조건에 따라 AVAudioPlayer을 사용할 수 있다고 생각하지 않습니다. 실제로 사운드 파일을 재생하지 않고도 "시작"할 수 있다고하더라도 오디오 파일이 스트리밍되는 것처럼 빨리 그래프를 작성하는 데 도움이됩니다. 당신이 말하는 것은 소리의 정적 분석을하는 것입니다. 이것은 훨씬 다른 접근법을 필요로합니다. 파일을 직접 읽고 수동으로 파싱해야합니다. SDK에있는 모든 것을 사용하는 빠른 해결책이 없다고 생각합니다.

6

나는이 같은 질문에 와서 많은 시간을 들여 검색하는 사람들을 돕고 싶다. 시간을 절약하기 위해 나는 대답했다. 나는 기사 주변 검색에 대한 extaudioservice, 오디오 큐avfoundation 후 비밀의 일종으로이 치료 여기 사람 ...

을 싫어한다.

AVFoundation을 사용해야한다는 것을 알았습니다. 이유는 간단합니다. 최신 번들이며 Objective C이지만 CTP 스타일은 아닙니다. 그것을 할 수

그래서 단계는 복잡하지 않습니다 :

  1. avassettrack
  2. 에서 avassetreadertrackoutput 만들기 avasset
  3. 에서 작성 avasset
  4. 에서 avassettrackavassetreader 만들기 오디오 파일에서 AVAsset 만들기
  5. avassetreadertrackoutput을 이전에 추가하십시오. 의 avassetreader는 avassettrackoutput 에서 오디오 데이터

을 읽기 시작 할 수 있습니다 copyNextSampleBuffer 하나 하나 (이 모든 데이터를 읽을 수있는 루프).

copyNextSampleBuffer 당신에게 CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer에 의해 AudioBufferList를 얻을하는 데 사용할 수있는 CMSampleBufferRef을 제공합니다. AudioBufferList의 배열은 AudioBuffer입니다. AudioBuffermData 부분에 저장된 오디오 데이터입니다.

위의 내용은 extAudioService에서도 구현할 수 있습니다. 그러나 나는 위의 avfoundation 접근법이 더 쉽다고 생각합니다.

그럼 다음 질문, mData과 어떻게해야하나요? avassetreadertrack 출력을으로 설정하면 출력 형식을 지정할 수 있으므로 출력을 lpcm으로 지정합니다.

마지막으로 얻은 mData은 실제로 float 형식의 진폭 값입니다.

쉬운 권리? 비록 내가 여기에서 조각으로 이것을 구성하기 위해 많은 시간을 사용했지만.

주에 대한 두 가지 유용한 자원 : 기본 용어와 개념을 알고이 기사를 읽기 : https://www.mikeash.com/pyblog/friday-qa-2012-10-12-obtaining-and-interpreting-audio-data.html

샘플 코드 : https://github.com/iluvcapra/JHWaveform 당신은 위의 직접이 샘플에서 코드를 언급의 대부분을 복사하여 자신의 목적을 위해 사용될 수 있습니다 .