2011-07-23 12 views
1

週間前、私はAVAssetWriterを持っていた問題について、このスレッドの投稿:AVAssetWriter WoesAVAssetWriter/AVAudioPlayer Conflict?

さらなる研究は、本当に、任意のオーディオシステムをAVAudioPlayerでオーディオを再生したりしながら、AVAssetWriterを使用して紛争につながるようです。私もOpenALで試してみました。 [AVAudioPlayer再生]が呼び出されるまで

  • 画像の画像や設定から動画にフレームを書き込むためにAVAssetWriterを使用して正常に動作します:ここで

    は背景があります。

  • これはデバイスでのみ起こり、simでは発生しません。

  • CVPixelBufferPoolCreatePixelBufferからピクセルバッファを作成しようとするとエラーが発生します。

  • オーディオが再生を開始すると、以前に存在していたAVAssetWriterInputPixelBufferAdaptor.pixelBufferPoolがnildになります。 http://www.mediafire.com/?5k7kqyvtbfdgdgv

    コメントアウトAVAudioPlayerを再生すると、それは、デバイス上で動作します:

あなたはここに代表プロジェクトをダウンロードすることができます。

すべての手がかりは評価されています。

答えて

0

私はこの問題の解決策を見つけました。

AVAudioPlayerとAVAssetWriterが正しく動作するようにするには、オーディオセッションのカテゴリが「混合可能」である必要があります。

AVAudioSessionCategoryAmbientのように混合可能なカテゴリを使用できます。

しかし、AVAudioSessionCategoryPlayAndRecordを使用する必要がありました。

あなたはこれを実装することによって混合可能であることを任意のカテゴリを設定することができます。

OSStatus propertySetError = 0; 

UInt32 allowMixing = true; 

propertySetError = AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryMixWithOthers, // 1 
         sizeof (allowMixing),         // 2 
         &allowMixing           // 3 
        ); 
0

これ以上の答えは完全です。それは動作しません。代わりにこれを行う

// Setup to be able to record global sounds (preexisting app sounds) 
    NSError *sessionError = nil; 
    if ([[AVAudioSession sharedInstance] respondsToSelector:@selector(setCategory:withOptions:error:)]) 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDuckOthers error:&sessionError]; 
    else 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; 

    // Set the audio session to be active 
    [[AVAudioSession sharedInstance] setActive:YES error:&sessionError]; 

//then call your asset writer 
movieWriter = [[AVAssetWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];