1

アプリケーションでオーディオファイル(CMK.mp3)の波形を描画する必要があります。このために私はこの解決策を試しました

このソリューションはAVAssetreaderを使用しているため、波形の表示に2時間かかります。

誰か助けてもらえますか、波形をすばやく表示する他の方法はありますか?ありがとう

4

1 に答える 1

0

AVAssetReaderはAVAssetを読み取る唯一の方法であるため、それを回避する方法はありません。不要なオーバーヘッドを発生させずにコードを処理するようにコードを調整する必要があります。そのコードはまだ試していませんが、時間があれば、できればすぐに、GitHubで共有するサンプルプロジェクトをビルドするために使用する予定です。

それを調整するための私のアプローチは、次のことを行うことです。

  1. すべてのObjective-Cメソッド呼び出しを削除し、代わりにCのみを使用します
  2. すべての作業をメインキューから離れたセカンダリキューに移動し、ブロックを使用して終了したものをコールバックします

波形をレンダリングする際の1つの障害は、少なくとも最後に試したときに、一度に複数のAVAssetReaderを実行できないことです。(iOS 6で変更された可能性があります)新しいリーダーが他のリーダーをキャンセルし、再生が中断されるため、順番に作業を行う必要があります。私はキューでそれを行います。

私が作成したオーディオアプリでは、CMSampleBufferRefをCMBufferQueueRefに読み込みます。CMBufferQueueRefは複数のサンプルバッファーを保持できます。(AVAssetReaderのcopyNextSampleBufferを参照)AVAssetReaderがアセットの読み取りを終了した後、波形を処理するのに十分な時間を提供するようにキューを構成して、現在の再生でCMBufferQueueRefの内容を使い果たしてから、さらにバッファーを読み取り始めることができます。次のトラック。それは私がそれを試みるときの私のアプローチになります。バッファを大きくしたり、バッファを大きくして再生に問題が発生したりして、メモリを使いすぎないように注意する必要があります。波形の処理にかかる時間がわからないので、古いiPodとiPhone 4でテストしてから、iPhone5で試してすべてが正常に機能するかどうかを確認します。

できるだけCに近づけてください。この処理中にObjective-Cリソースを呼び出すと、スレッドの切り替えやその他の実行時のオーバーヘッドコストが発生する可能性があります。これらのコストは、目立つほど重要です。あなたはそれを避けたいでしょう。私ができることは、キー値監視(KVO)を設定して、AVAssetReaderをトリガーし、次のタスクをすばやく開始して、トラック間のギャップのない再生を維持できるようにすることです。

オーディオ実験を開始したら、GitHubに配置します。この作業を行うリポジトリを作成しました。興味がある場合は、そのリポジトリを「監視」して、更新のコミットを開始したときにわかるようにすることができます。

https://github.com/brennanMKE/Audio

于 2013-01-07T16:21:56.717 に答える