iPhone で AudioFileStream および AudioQueue API を使用して再生中に mp4 (または m4a) オーディオ ファイル内でスキップまたはシークを実行するための適切な手法を見つけようとしています。
完全な mp4 ヘッダー (mdat ボックスまで) を開いている AudioFileStream に渡すと、基になるオーディオ ファイルの種類 (私の場合は AAC) が適切に識別され、ファイルの実際の mdat データ部分を渡すと、AudioFileStream正しくオーディオ パケットの生成を開始し、これらを AudioQueue に送信して再生を行うことができます。
ただし、ファイルの再生にランダム アクセス アプローチを試みると、mdat ボックスの最初のフレームを常に AudioFileStream に送信しない限り、適切に機能しないようです。代わりに、mp4 ヘッダーを AudioFileStream に送信した後、最初に AudioFileStreamSeek() を呼び出してから、関連するパケットのデータを渡すことによって、最初に mdat の後のフレームにスキップしようとすると、AudioFileStream はオーディオ パケットを生成するように見えます。しかし、これらを AudioQueue に渡して AudioQueuePrime() を呼び出すと、常に「いいえ」というエラーが返されます。
私の質問はこれです: mp4 ファイル内の他のパケットのランダム再生を試みる前に、少なくとも mdat ボックスの最初のパケットを常に渡す必要がありますか?
AudioFileStream と AudioQueue を使用しているときに、mp4 ファイルのセクションをランダムに再生する方法に関するドキュメントが見つからないようです。mp4 ファイル内をランダムにシークする手法について説明している Apple の QuickTime File Format pdf を見つけましたが、これは単なる高レベルの説明であり、特定の API (AudioFileStream など) の使用については言及されていません。
洞察をありがとう。