2011-08-25 6 views
14

멀티 트랙 레코더의 간단한 개념 증명을 디자인하고 있습니다. Record and play audio Simultaneously - - 세 가지 수준이있는 내가 작업 할 수 있다는 것을 지적iOS : 동시 레코딩 및 재생을위한 샘플 코드

명백한 출발점은 동시에

B.caf

파일에이 질문을 마이크 입력을 기록하는 동안 헤드폰에 파일 A.caf에서 재생하는 것입니다 :

  • AVFoundation의 API (AVAudioPlayer + AVAudioRecorder)
  • 오디오 큐 API
  • 오디오 장치 API (RemoteIO)

가장 좋은 수준은 무엇입니까? 분명히 일반적인 대답은 일을 끝내는 최고 수준에서 일하는 것이고 이것은 AVFoundation이 될 것입니다.

하지만이 문제를 피하기 위해 대기 시간 문제 (파일간에 0.3 초의 지연이 있음) 때문에 포기한 사람이이 작업을 수행하고 있습니다.

또한 스프링 보드에서 사용할 수있는 소스 코드는 무엇입니까? SpeakHere 샘플 (http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html)을보고 있습니다. 내가 더 간단한 것을 찾지 못하면 이것을 사용할 것이다.

하지만 누군가가 더 간단하게/다른 것을 제안 할 수 있습니까? 내가 그것을 피할 수 있다면 C++ 코드로 작업하지 않을 것이다.

누구나 AVFoundation을 사용하는 공개 코드를 알고 있습니까?

편집 : 여기 AVFoundation 예 : http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1

EDIT (2) : 훨씬 좋네요 여기에 하나를 찾고 : http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

EDIT (3) : How do I record audio on iPhone with AVAudioRecorder?

답변

5

Viraj가 제안한대로 대답은 다음과 같습니다.

예, AVFoundation을 사용하면 매우 좋은 결과를 얻을 수 있습니다. 먼저 플레이어와 레코더 모두 활성화하려면 두 단계 프로세스가 필요하다는 사실에주의해야합니다.

먼저 프라이밍하십시오.

그런 다음 재생합니다.

그래서 모든 것을 준비하십시오. 그런 다음 모든 것을 재생하십시오.

이렇게하면 지연 시간이 약 70ms가됩니다. 필자는 메트로놈 틱 (tick)을 녹음 한 후 스피커를 통해 iPhone을 스피커 위로 들고 동시에 녹음하면서 테스트했습니다.

두 번째 녹음에는 ~ 70ms 인 것으로 밝혀진 명확한 에코가 있습니다. Audacity의 신호를 분석하여 정확한 오프셋을 얻을 수있었습니다.

그래서 난 그냥 performSelector 모든 것을 줄을하기 위해 : X withObject : 예 afterDelay : 70.0/1000.0

가 숨겨져있을 수 있습니다 그루터기, 지연이 장치에 장치 다를 수 있습니다 예를 들어 있습니다. 장치 작동에 따라 다를 수 있습니다. 플레이어 시작과 레코더 시작 사이에 스레드가 인터럽트/재조정 될 수도 있습니다.

하지만 작동하며 오디오 대기열/유닛으로 어지럽게 울리는 것보다 훨씬 세련됩니다.

+1

어떻게 "프라이밍"합니까? 그게 무슨 뜻인지 설명해 주시겠습니까? –

+3

이 기능의 샘플 코드를 제공해 주시겠습니까? –

+1

슬프게도이 권리를 수행 할 수있는 방법이 없습니다 (최소한 내가 찾을 수는 있습니다). 70ms는 단순히 나에게 너무 많은 오프 싱크이며, 오늘날 다양한 장치의 범위에서, 비동기의 차이는 너무 큽니다. iPhone 5의 경우 약 66ms가 소요되지만 iPhone 6의 경우 약 40ms가 소요됩니다. 나는이 게시물이 2011 년에 있다는 것을 알아 냈습니다. 당신이 이것을하는 더 좋은 방법을 찾았습니까? – Sti

6

대기 시간 문제를 방지하려면, 당신이해야합니다 AVFoundation보다 낮은 수준에서 작동합니다. Apple에서이 샘플 코드를 확인하십시오 - Auriotouch. 원격 I/O를 사용합니다.

+1

사실 나는 AVFoundation을 사용하여 작업 현장을 얻었습니다. 당신은 당신이 그것을 걷어 차기 전에 모든 것이 준비되었는지 확인해야합니다. 그 외에도 플레이어가 70ms 후에 레코더를 시작해야하며 멋지게 정렬됩니다. (장치에 따라 다를 수 있음). –

+2

잘 알고 있습니다. 어쩌면 당신은 당신의 질문에 대답해야합니다. – Viraj

1

나는이 문제가있어서 AudioSessionPreferredHardwareIOBufferDuration 매개 변수를 변경하여 프로젝트에서 해결했습니다. 지금은 6ms의 대기 시간이 필요하다고 생각합니다. 이는 내 앱에 충분합니다.

좋은 설명이있는 this answer을 확인하십시오.

+0

코드를 제공해주십시오. 나는 지난 4 일 동안 고심하고있다. –

+0

물론, 제가 가지고있는 코드는 Xamarin에 있습니다.하지만 신속하거나 객관적으로 작성하는 것은 어렵지 않습니다. 대답에서 제공하는 링크를 살펴보면 예제가 있습니다. 또한 녹음기 (AVAudioRecorder 및 prepareToRecord를 사용)와 플레이어 (AVPlayer 인스턴스를 파일 이름으로 작성)를 준비한 후에 대기 시간이 짧아야합니다. 또한 AudioSession을 활성화 할 때 범주를 playAndRecord로 설정해야합니다. – ernewston

+0

나는 ActivateMyAudioSesion이라는 함수가있는 AudioSessionHelper 클래스를 가지고 있는데, 여기에서 카테고리를 설정하고, Mode, preferredIOBufferDuration을 설정 한 다음 (그 값을 true로 설정합니다.) 다음과 같이합니다. 나는 그것을 활성화시킨다. 첫 번째 녹음을 시작하기 전에이 함수를 호출합니다 (값 비싸면 매번 호출하지 마십시오). 또는 앱이 시작될 때 할 수 있습니다. 희망이 도움이됩니다! – ernewston