2012-03-09 6 views
3

내가 원하는 것은 오디오 파일 (비디오가 포함되지 않음)에 해당하는 AVAsset의 출력 샘플을 취해 샘플 블록을 가져 오는 오디오 효과 클래스로 보내고, 나는 이것을 실시간으로하고 싶다.avplayer 항목의 리디렉션 재생 출력

현재 AVfoundation 클래스 참조 및 프로그래밍 가이드를보고 있지만 플레이어 항목의 출력을 리디렉션하여 내 효과 클래스로 보내고 변환 된 샘플을 다음 위치로 보내지 않습니다. 오디오 출력 (AVAssetReaderAudioMixOutput 사용)? 거기서 들어요. 나는 AVAssetReader 클래스 나에게

[myAVAssetReader addOutput:myAVAssetReaderTrackOutput]; 
[myAVAssetReaderTrackOutput copyNextSampleBuffer]; 

를 사용하여 샘플의 블록을 얻을 수있는 방법을 제공하지만 애플의 문서는 AVAssetReader 클래스가 만들어되지 않고 실시간 상황에 사용되지 않도록 지정하는 것을 알 수있다. 아무도 어디서 볼지 또는 올바른 접근 방식을 사용하고 있는지 제안 할 수 있습니까?

답변

0

iOS 6 및 Mac OS 10.8에는 새로운 MTAudioProcessingTap 개체가 있습니다. WWDC 2012의 세션 517 비디오를 확인하십시오. 그들이 원하는 것을 정확히 보여주었습니다.

WWDC Link

4

MTAudioProcessingTap이 적합합니다. AVPlayer를 활용하면 AVAssetReaderOutput을 사용하여 샘플을 직접 차단 한 다음 오디오 대기열 또는 오디오 장치에서 샘플을 직접 렌더링하지 않아도됩니다.

대신 MTAudioProcessingTap을 AVAsset의 audioMix의 inputParameters에 연결하면 쉽게 효과 유닛에 던져 넣을 수있는 샘플로 샘플이 제공됩니다.

또 다른 이점은 사용자의 iPod 라이브러리와 같은 다른 Apple API (예 : 오디오 파일 서비스)에서 열 수없는 URL에서 파생 된 AVAssets와 함께 작동한다는 것입니다. 또한 AVPlayer가 무료로 제공하는 오디오 중단에 대한 허용 오차 같은 모든 기능을 제공합니다. AVPlayer는 AVAssetReader 솔루션을 함께 사용하는 경우 수동으로 구현해야합니다.

탭을 설정하려면 재생 중에 시스템이 적절하게 호출하는 콜백을 설정해야합니다. 이러한 처리를위한 전체 코드는 this tutorial here에서 확인할 수 있습니다.

+0

나는 잠시 동안 알고있다. 그러나 AVPlayer의 플레이어 항목을 변경할 때 꼭지를 찢어 버리는 법을 알고있다 (제 경우에는 AVQueuePlayer가 다음 항목으로 넘어갈 때)? playerItem 및 관련 audioMix가 ARC의 범위를 벗어날 때 우아하게 dealloc합니까? 나는 unprepare를 보지 않으며 탭 콜백을 호출합니다. – Tenfour04

+0

다음 질문을 만들었습니다. http://stackoverflow.com/q/19202306/506796 – Tenfour04

0

AVAssetReader은 사용자를 위해 디코딩을 처리하기 때문에 실시간으로 사용하기에 적합하지 않으며 다양한 경우에 임의의 시간 동안 차단할 수 있습니다 (copyNextSampleBuffer).

즉, AVAssetReader은 순환 버퍼를 제공하는 제작자 스레드에서 훌륭하게 사용될 수 있습니다. 그것은 당신의 요구되는 사용법에 달렸지 만,이 방법을 사용하여 RemoteIO 출력을 공급하고 RemoteIO 콜백에서 내 효과/신호 처리를 성공적으로 수행했습니다.