3

この投稿を読んだ後: MTAudioProcessingTap をどのようにリリースしますか? 、1回のタップに対するchrisの提案に従って、機能しているようで、準備解除およびファイナライズのコールバックが呼び出されます。

ただし、複数のオーディオ トラックがあり、それぞれに 1 つのタップがあります。Apple の WWDC の例とは異なり、 myMYAudioTapProcessorはオーディオ ミックスを生成しなくなりました。複数のトラックが存在するため、AVMutableAudioMixInputParameters複数audioMixinputParameters.

複数のタップを使用する場合、プレーヤーへMYAudioTapProcessor_audioProcessors強い参照であると. プレーヤーを解体するときは、次のパターンに従います。playerItemaudioMixAVPlayer

for (int i = 0; i < _audioMix.inputParameters.count; i++) {
    MTAudioProcessingTapRef tap = ((AVMutableAudioMixInputParameters *)_audioMix.inputParameters[i]).audioTapProcessor;
                CFRelease(tap);
}
_audioMix = nil;
_playerItem = nil;
_player = nil;
_audioProcessors = nil;

しかし、ほとんどの場合、タップの unprepare コールバックと finalize コールバックのいずれかが呼び出されず、MTAudioProcessingTap がメモリ内でハングアップします。各タップのコールバックが確実に発生するように、複数のタップを保存して割り当てを解除する適切な方法は何ですか?

4

1 に答える 1

1

参照された投稿が適切な方法のようです。

私の場合、それはプレーヤーの解体とは無関係の問題でした。periodicTimeObserversへの強い参照があり、boundaryTimeObserversまだ上にあるAVPlayerと、プレーヤーが予想よりも長くぶらぶらする原因 となったことが判明しました。

ビューコントローラーを離れるとき(を破棄したいとき)、スーパービューから作成されたAVPlayerすべての を削除し、それらを nil-ed してから、個々のタップを解放しなかったことを除いて、上記と同じ手順を実行しました. これは nil-ingとによって処理されました。AVPlayerLayerAVPlayerCFRelease_audioMix_playerItem

于 2013-10-14T23:13:14.440 に答える