iOS5에서 필터 오디오 단위 효과 사용
-
12-11-2019 - |
문제
Remote IO 연결을 사용하고 오디오 입력을 내장 된 필터 효과 (iOS 5에서만)를 통해 라우팅 한 다음 하드웨어에서 다시 꺼냅니다.IT에서 입력에서 출력까지 똑바로 라우팅 할 수 있지만 필터를 사용할 수 없습니다.필터 오디오 단위 또는 잘못된 라우팅인지 확실하지 않습니다.
이 비트는 데이터가 처리되도록 필터를 설정하고 라우팅을 변경하는 시도 일뿐입니다.
도움이 감사합니다.
// ******* BEGIN FILTER ********
NSLog(@"Begin filter");
// Creates Audio Component Description - Output Filter
AudioComponentDescription filterCompDesc;
filterCompDesc .componentType = kAudioUnitType_Effect;
filterCompDesc.componentSubType = kAudioUnitSubType_LowPassFilter;
filterCompDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
filterCompDesc.componentFlags = 1;
filterCompDesc.componentFlagsMask = 1;
// Create Filter Unit
AudioUnit lpFilterUnit;
AudioComponent filterComponent = AudioComponentFindNext(NULL, &filterCompDesc);
setupErr = AudioComponentInstanceNew(filterComponent, &lpFilterUnit);
NSAssert(setupErr == noErr, @"No instance of filter");
AudioUnitElement bus2 = 2;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Output, bus2, &oneFlag, sizeof(oneFlag));
AudioUnitElement bus3 = 3;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Input, bus3, &oneFlag, sizeof(oneFlag));
// ******** END FILTER ******** //
AudioUnitConnection hardInToLP;
hardInToLP.sourceAudioUnit = remoteIOunit;
hardInToLP.sourceOutputNumber = 1;
hardInToLP.destInputNumber = 3;
setupErr = AudioUnitSetProperty (
remoteIOunit, // connection destination
kAudioUnitProperty_MakeConnection, // property key
kAudioUnitScope_Input, // destination scope
bus3, // destination element
&hardInToLP, // connection definition
sizeof (hardInToLP)
);
AudioUnitConnection LPToHardOut;
LPToHardOut.sourceAudioUnit = lpFilterUnit;
LPToHardOut.sourceOutputNumber = 1;
LPToHardOut.destInputNumber = 3;
setupErr = AudioUnitSetProperty (
remoteIOunit, // connection destination
kAudioUnitProperty_MakeConnection, // property key
kAudioUnitScope_Input, // destination scope
bus3, // destination element
&hardInToLP, // connection definition
sizeof (hardInToLP)
);
/*
// Sets up the Audio Units Connection - new instance called connection
AudioUnitConnection connection;
// Connect Audio Input's out to Audio Out's in
connection.sourceAudioUnit = remoteIOunit;
connection.sourceOutputNumber = bus1;
connection.destInputNumber = bus0;
setupErr = AudioUnitSetProperty(remoteIOunit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, bus0, &connection, sizeof(connection));
*/
NSAssert(setupErr == noErr, @"No RIO connection");
. 해결책
여기에있는 몇 가지 일들 :
- OSStatus를 반환 할 수있는 모든 호출 후 Assert (또는 일종의 체크 오류 및 로그 -I-IT)를 수행하면 많은 도움이 될 것입니다. 그런 식으로 당신이 얼마나 멀리 떨어져 있는지 알아낼 수 있습니다. 아마도 실제 OSStatus 값이= NoErr 일 때 실제 OSStatus 값을 기록하고 (Xcode 설명서 뷰어에서 "오디오 단위 구성 요소 서비스 참조"에서 시작하십시오).
- 필터 audiounit을 만드는 후에는 audiounitsetproperty () 호출로하는 일을 얻지 못합니다. 두 번째 매개 변수는 속성의 이름 (KaudiounitProperty ...으로 시작하는 것)이어야합니다. 거의 확실히 오류를 반환합니다.
- remoteiounit에는 두 개의 버스 만 있으며 특별한 의미가 있습니다. MIC에서 버스 1이 입력되면 버스 0이 하드웨어로 출력됩니다. 원격 IO 입력 범위 버스 3에 연결하려고하면 다른 오류가 발생할 것입니다
오디오 통과 작업을 수행 할 때 롤백 할 수 있습니다. 즉, 당신이 단지 remoorio를 가지고 있고, 출력 범위 / 버스 1에서부터 입력 범위 / 버스 0까지의 연결을 의미합니다.
다음 필터 장치를 만듭니다. 연결을 변경하십시오.
- 원격 출력 범위 버스 1 입력 범위 버스 0 을 필터링합니다.
- 필터 출력 범위 버스 0 to RemoteIO 입력 범위 버스 0
문제가 될 다른 것들은 이러한 모든 iOS 5 필터가 부동 소수점 LPCM 형식을 사용하고자하는 것으로 보이는 것으로 보이는 것으로 보이는 것입니다. 이는 다른 단위가 기본적으로 기본 형식이 아닙니다. 필터 유닛 (입력 또는 출력 범위가 동일 할 것인가)에서 스트림 형식을 가져와야 할 수 있습니다 (refterio 출력 범위 / 버스 1이 생성되고 Remoteio 입력 범위 / 버스 0이 수용되는 형식으로 설정하십시오. 또 다른 옵션은 필터 장치 전후에 Auconverter 유닛을 도입하는 것입니다.
다른 팁
여기에 주어진 첫 번째 답변은 저를 훨씬 더 좌절 시켰습니다.아니오 Apple 문서는 효과 단위의 파일 형식이 부동 소수점이 필요하다고 알려줍니다.이 게시물을 읽을 때까지 제대로 오디오를 재생하지 못하도록 유지하는 이유를 알아낼 수 없습니다.위의 조언을 따르고 저역 통과 필터 장치에서 스트림 형식을 검색하고 생성 된 2 개의 변환기 유닛을 설정하는 데 사용됩니다 (즉, 사전 필터 변환기의 출력 형식과 포스트 필터의 입력 형식 설정변환기. 일단 내가 그것을했고 모든 노드를 함께 연결했으면 예상대로 작업을 시작했습니다.
로우 패스 필터를 사용하려고하고 제안 된 일명을 제안한대로하려고 할 때 형식을 설정하면 "작업을 완료 할 수 없음"오류가 발생할 수 있습니다.이 코드에서는이 코드에 결함이 있습니까? LowpassUnit을 검색 한 후에도 오류가 발생하지만 아무 것도 없지만 아무도 없습니다.
result = AudioUnitSetProperty(lowpassUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &stereoStreamFormat, sizeof (stereoStreamFormat));
if (noErr != result)
{
NSLog(@"%@", [NSError errorWithDomain:NSOSStatusErrorDomain code:result userInfo:nil]);
return;
}
.
PS : 누구든지 적절한 오디오 단위 문서를 알고있는 경우 공식 문서가 실제로 부족한 것으로 공유하십시오