4

就在另一个应用程序正在播放音频时录制音频而言,希望做 Shazam 正在做的事情。

1)录音很好,这里没问题

2)当应用程序启动并开始录制时,来自另一个应用程序的音乐停止(iTunes等)。

3) 我玩过所有 AV 音频设置的咒语,但没有运气让音频继续/恢复。

4) 当 Shazam 启动时,音频会停止一段时间,然后再恢复。我假设 Shazam 正在做一些事情来用音乐播放器重新启动音频?我搜索并找不到是否有办法做到这一点。

因此,如果有人有适当的设置来让它工作,我们将不胜感激。

另外,说,请阅读 AV 文档,这不是答案,我已经看过这些,但没有运气。

我试过在这里找到

http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategories/AudioSessionCategories.html

已经尝试过 AV 和 K 类型的设置。就 MIC 的工作原理而言,我确实看到设置有所不同,但在所有情况下,当我的应用程序获取麦克风时,它都会停止来自其他应用程序的音频。

如果我必须牺牲一只站在苹果方向的鸡,这很好,只要让我知道是什么类型的鸡 :-)

4

1 回答 1

1

经过一番来回,看起来使用 MixWithOthers 是关键。您还必须确保将音频路由设置为最后/当前音频路由...

仅供参考,这是使用 AudioQueue 接口

所以我们...

/ 使用 iPod 开始音乐 / 使用以下方式启动我们的应用程序

  • 音频队列新输入
  • AudioQueueAddPropertyListener
  • AudioQueueAllocateBuffer(s)
  • AudioQueueEnqueueBuffer(s)
  • setupCat
  • 设置鸭
  • 设置音频路由
  • 设置混合
  • AudioSessionSetActive (true)
  • 音频队列开始

typedef union 
{
    OSStatus propertyResult;
    char a[4];
} unionstatus;

unionstatus u2;

typedef union 
{
    UInt32 UI32sessionCat;
    char a[4];
} unionuint32;

unionuint32 usc2;

bool setAudioUInt32 ( UInt32 property, UInt32 value )
{
    bool result = true;

    UInt32 UI32 = value;
    UInt32 UI32size = sizeof(UI32);

    u2.propertyResult = AudioSessionSetProperty (property, UI32size , &UI32 );

    if ( u2.propertyResult )
    {
        printf("Error Set %ld %lx %c%c%c%c\n",u2.propertyResult,u2.propertyResult,u2.a[3],u2.a[2],u2.a[1],u2.a[0]);
        result = false;
    }
    return result;
}

UInt32 getAudioSettingInt ( UInt32 value )
{
    UInt32  I32;
    UInt32  I32size = sizeof(I32);

    u2.propertyResult = AudioSessionGetProperty ( value , &I32size, &I32 );

    if ( u2.propertyResult )
        printf("Error Get %ld %lx %c%c%c%c\n",u2.propertyResult,u2.propertyResult,u2.a[3],u2.a[2],u2.a[1],u2.a[0]);

    return (I32);
}

/// checking taken out

bool otherPlaying = getAudioSettingInt ( kAudioSessionProperty_OtherAudioIsPlaying );
if ( otherPlaying )
{
    setAudioUInt32 (kAudioSessionProperty_OtherMixableAudioShouldDuck, false);
    // this returns a string, arg, have to look for string values, etc.
    UInt32 audioRoute = getAudioSettingInt ( kAudioSessionProperty_AudioRoute );

    CFStringRef ar = (CFStringRef) audioRoute;
    CFStringEncoding encodingMethod = CFStringGetSystemEncoding();
    const char *car = CFStringGetCStringPtr(ar,encodingMethod);
    CFRange range = CFStringFind(ar,CFSTR("Headphones"),kCFCompareCaseInsensitive);

    if ( range.length == 0 ) // we have speakers
        result = setAudioUInt32 (kAudioSessionProperty_OverrideAudioRoute, kAudioSessionOverrideAudioRoute_Speaker);
    else // we have headphones
        {}
}
于 2012-06-04T19:12:44.060 回答