0

だから私はオーディオセッションをセットアップします

AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(true);

UInt32 audioCategory = kAudioSessionCategory_MediaPlayback; //for output audio
OSStatus tErr = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(audioCategory),&audioCategory);

次に、AudioQueue または RemoteIO セットアップをセットアップして、ファイルからオーディオを直接再生します。

AudioQueueStart(mQueue, NULL);

オーディオが再生されると、アプリのステータス バーに「再生アイコン」が表示されます。次に AVAssetReader をセットアップします。

AVAssetTrack* songTrack = [songURL.tracks objectAtIndex:0];

NSDictionary* outputSettingsDict = [[NSDictionary alloc] initWithObjectsAndKeys:

                                    [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
                                    //     [NSNumber numberWithInt:AUDIO_SAMPLE_RATE],AVSampleRateKey,  /*Not Supported*/
                                    //     [NSNumber numberWithInt: 2],AVNumberOfChannelsKey,   /*Not Supported*/

                                    [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                                    [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                                    [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                                    [NSNumber numberWithBool:NO],AVLinearPCMIsNonInterleaved,

                                    nil];

NSError* error = nil;
AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songURL error:&error];

//      {
//          AVAssetReaderTrackOutput* output = [[AVAssetReaderTrackOutput alloc] initWithTrack:songTrack outputSettings:outputSettingsDict];
//          [reader addOutput:output];
//          [output release];
//      }

{   
    AVAssetReaderAudioMixOutput * readaudiofile = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:(songURL.tracks) audioSettings:outputSettingsDict];
    [reader addOutput:readaudiofile];
    [readaudiofile release];
}

return reader;

[reader startReading] を呼び出すと、Audio の再生が停止します。RemoteIO と AudioQueue の両方のケースで、コールバックが呼び出されなくなります。

混合オプションを追加すると:

AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (UInt32), &(UInt32) {0});

その後、AudioQueueStart の後のオーディオが呼び出されたときに、「再生アイコン」が表示されなくなりました。電話は私を主要なオーディオ ソースとして認識しないため、他の機能もロックアウトされています。

AVAssetReader を使用してプライマリ オーディオ ソースのままにする方法を知っている人はいますか?

4

1 に答える 1

0

iOS 5 の時点で、これは修正されています。iOS 4 以下ではまだ動作しません。MixWithOthers は不要で (false に設定できます)、AVAssetReader が読み取り中であっても、AudioQueue/RemoteIO はコールバックを受信し続けます。

于 2011-11-01T16:06:56.610 に答える