Bạn cũng có thể đạt được điều này bằng cách khởi tạo 2 AVAudioPlayers
tuần tự, và điều khiển âm lượng với [self.player setVolume:volumeFloat];
...
NSString *songA = [[NSBundle mainBundle] pathForResource:@"songA" ofType:@"mp3"];
NSError *soundError = nil;
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:songA] error:&soundError];
if(self.player == nil)
NSLog(@"%@",soundError);
else
{
[self.player setDelegate:self];
[self.player setVolume:0.75];
[self.player play];
}
NSString *songB = [[NSBundle mainBundle] pathForResource:@"songB" ofType:@"mp3"];
soundError = nil;
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:songB] error:&soundError];
if(self.player == nil)
NSLog(@"%@",soundError);
else
{
[self.player setDelegate:self];
[self.player setVolume:0.25];
[self.player play];
}
...
Trong trường hợp bạn được xác định để sử dụng DiracAudioPlayer, bạn có thể sử dụng phương pháp của riêng bạn để khởi tạo lại các AudioUnit với quyền tham số khối lượng trong DiracAudioPlayerBase.mm
:
-(void)setupInstanceWithUrl:(NSURL*)inUrl numChannels:(int)channels volume:(float)volume
{
mDelegate = nil;
mInUrl = [inUrl copy];
mIsPrepared = NO;
mIsProcessing = NO;
mWorkerThread = nil;
mTotalFramesInFile = 0;
mIsRunning = NO;
mVolume = volume;
mLoopCount = mNumberOfLoops = 0;
mHasFinishedPlaying = YES;
if (channels < 1) channels = 1;
else if (channels > 2) channels = 2;
mNumChannels = channels;
mPeak = new SInt16[mNumChannels];
mPeakOut = new SInt16[mNumChannels];
for (long v = 0; v < mNumChannels; v++) {
mPeakOut[v] = 0;
mPeak[v] = -1;
}
OSStatus status = noErr;
mTimeFactor = 1./kOversample;
mPitchFactor = kOversample;
// This is boilerplate code to set up CoreAudio on iOS in order to play audio via its default output
// Desired audio component
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
#if TARGET_OS_IPHONE
desc.componentSubType = kAudioUnitSubType_RemoteIO;
#else
desc.componentSubType = kAudioUnitSubType_HALOutput;
#endif
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
// Get ref to component
AudioComponent defaultOutput = AudioComponentFindNext(NULL, &desc);
// Get matching audio unit
status = AudioComponentInstanceNew(defaultOutput, &mAudioUnit);
checkStatus(status);
// this is the format we want
AudioStreamBasicDescription audioFormat;
mSampleRate=audioFormat.mSampleRate = 44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = mNumChannels;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = sizeof(short)*mNumChannels;
audioFormat.mBytesPerFrame = sizeof(short)*mNumChannels;
status = AudioUnitSetProperty(mAudioUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
checkStatus(status);
// here we set up CoreAudio in order to call our PlaybackCallback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = PlaybackCallback;
callbackStruct.inputProcRefCon = (__bridge void*) self;
status = AudioUnitSetProperty(mAudioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
checkStatus(status);
// Initialize unit
status = AudioUnitInitialize(mAudioUnit);
checkStatus(status);
// here we allocate our audio cache
mAudioBuffer = AllocateAudioBufferSInt16(mNumChannels, kAudioBufferNumFrames);
// Avoid delay when hitting play by making sure the graph is pre-initialized
AudioOutputUnitStart(mAudioUnit);
AudioOutputUnitStop(mAudioUnit);
[self prepareToPlay];
}
đúp kiểm tra rằng khối lượng của bạn đang được thiết lập bằng cách đăng nhập:
NSLog(@"Volume P1: %f", [player1 volume]);
NSLog(@"Volume P2: %f", [player2 volume]);
Ngoài ra bạn cũng có thể điều khiển âm lượng đầu ra của sự pha trộn, bởi cùng một phương pháp được sử dụng bởi các nút âm lượng phần cứng: (Điều này sẽ khởi động giao diện người dùng của một sự thay đổi khối lượng iOS)
-(void)addVolumeObserver {
MPVolumeView *volumeView = [MPVolumeView new];
volumeView.showsRouteButton = NO;
volumeView.showsVolumeSlider = NO;
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
[appDelegate.window.rootViewController.view addSubview:volumeView];
__weak __typeof(self)weakSelf = self;
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[UISlider class]]) {
__strong __typeof(weakSelf)strongSelf = weakSelf;
strongSelf->volumeSlider = obj;
[obj addTarget:strongSelf action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];
*stop = YES;
}
}];
}
- (void)handleVolumeChanged:(id)sender
{
NSLog(@"Volume: %f", volumeSlider.value);
}
- (void)setVolumeHandlerTo:(float)volume
{
volumeSlider.value = volume;
}
Bạn có thử giải pháp của tôi? Nó có hoạt động không? – Coder1000
Xin lỗi .. Nó không phải là –
@Elly_Philip Quá xấu:/ – Coder1000