avassetwriter / avaudioplayerの対立?
-
25-10-2019 - |
質問
数週間前、私はAvassetWriterで抱えていた問題に関してこのスレッドを投稿しました。 avassetwriterの悲惨
さらなる研究は、Avashioplayerまたは実際にはすべてのオーディオシステムでオーディオを再生しながら、AvassetWriterを使用した競合につながるようです。私もオープンで試しました。
これが背景です:
avassetwriterを使用して、画像または画像のセットからビデオにフレームを書き込み、[Avaudioplayer Play]が呼ばれるまで正常に機能します。
これは、シムではなく、デバイスでのみ発生します。
エラーは、cvpixelbufferpoolcreatepixelbufferからピクセルバッファーを作成しようとするときに発生します。
オーディオの再生が開始されると、avassetwriterputpixelbufferadaptor.pixelbufferpoolが存在する前に存在していました。
ここから代表プロジェクトをダウンロードできます: http://www.mediafire.com/?5k7kqyvtbfdgdgv
Avaudioplayer Playをコメントすると、デバイスで動作します。
どんな手がかりも感謝しています。
解決
この問題の解決策を見つけました。
AvaudioplayerとAvassetWriterを正しく一緒に動作させたい場合は、「混合可能」のオーディオセッションカテゴリを持っている必要があります。
AvaudioSessionCategoryAmbientのように混合可能なカテゴリを使用できます。
ただし、AvaudioSessionCategoryPlayandRecordを使用する必要がありました。
これを実装することにより、任意のカテゴリを混合可能に設定できます。
OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty (
kAudioSessionProperty_OverrideCategoryMixWithOthers, // 1
sizeof (allowMixing), // 2
&allowMixing // 3
);
他のヒント
この上の答えは完全です。うまくいきません。代わりにこれを行います
// 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)];