APIを使ったオーディオファイルの読み書きの方法を見て行きたいと思います。Converterを使うということになります。終わったらオーディオファイルを閉じるというのが基本的な流れになります。オーディオをファイルを開く関数は以下のものがあります。*outAudioFile)inFileRefには開きたいオーディオのファイルパスを渡します。inFileTypeHintには開こうとするファイルの種類(AIFFなど)が分かっていれば指定、何を読み込むか分かんなければ0を入れてもいいですし、間違っていても問題ありません。ヒントっていうくらいですから合ってれば効率的に開けるって位のものだと思います。outAudioFileは開いたオーディオファイルのIDが返ってきますので、開いたファイルに対して何か行う時にはこのAudioFileIDを使います。inPermissionsにはファイルを開く上でのアクセス権を設定します。以下のような定数が定義されています。0x04};読み込みで開くならfsRdPermというところでしょうか。Audioでおなじみのパターンの以下の関数です。*inPropertyData)inAudioFileにAudioFileIDを、プロパティの種類をinPropertyIDに、ioDataSizeには値を入れるプロパティのサイズを、outPropertyDataにはプロパティ取得・設定先を渡します。プロパティは以下のようなものがあります。'brat'};フォーマットとかファイルの長さの取得・設定あたりが主な使い道だと思います。名前のつけられ方がややこしいですが、FileFormatがAIFFなどのファイルタイプで、DataFormatがAudioStreamBasicDescriptionで表されるフォーマットになります。オーディオファイルからのデータの読み込みを行うのは、以下の関数です。*outBuffer)AudioFileReadBytesがバイトデータでの読み込みで、AudioFileReadPacketsがパケット単位での読み込みになります。ExtendedAudioFileでは読み込んだ分だけ読み込み位置が進んでくれましたが、こちらは毎度位置を自分で進めてinStartingByteに指定します。オーディオデータの読み込み先もAudioBufferListではなく普通のメモリ領域になります。読み込むオーディオデータのバイトオーダーは、オーディオファイルのフォーマットの種類に関わらず、ネイティブなエンディアンに変換された状態で読み込まれるようです。MP3とかAACとかの圧縮フォーマットを読み込んだり、サンプリング周波数を変換して読み込む場合は、パケット単位で読み込んでデコーダに渡したりする感じになりますが、Tiger以降ではExtendedAudioFileがあるので、特殊な事をするのでなければ、ExtendedAudioFileを使った方が良いと思います。ちなみに、ExtendedAudioFileの読み込み速度と、バイト単位での読み込み速度が10倍くらい差があると前回書いていましたが、改めて調べたらそんなには差がありませんでした。自分の計りそこないだったかも知れませんし、パケット単位での読み込みが改善されたのかもしれません。読み込みや書き込みが終わったオーディオファイルを閉じるのは、AudioFileClose関数です。inAudioFile)AudioFileIDを渡してファイルを閉じます。少なくとも書き込み時にはちゃんと閉じておかないとファイルが読めません。読み込みの時でも、開きっぱなしにしておけるファイルの数に上限があるようなので、必要なければ閉じておくようにしておいた方が良いと思います。いった流れになります。オーディオファイルを作成・上書きしてAudioFileIDを取得するには以下の関数を使います。*outAudioFile)FSRefでファイルパスを指定する方は、新規作成と上書きでAudioFileCreateとAudioFileInitializeという二つの関数に分かれていますが、URLで指定する方は新規作成も上書きもAudioFileCreateWithURL関数ひとつでまかなえます。当然ですが、読み込みと違ってinFileTypeにはちゃんとファイルタイプを指定します。それに合わせたフォーマットをinFormatに渡さないとエラーが返ってきてファイルを作成する事が出来ません。inFlagsに渡すフラグは以下のようなものが用意されています。2};0を指定すれば、既にファイルが存在していた場合はエラーが返って上書きされません。EraseFileなら上書きされます。DontPageAlignAudioDataは、上書き可能に加えて、データに余計なスペースをつけないって感じだと思いますが、何がどう差が出るかは良くわかりません。オーディオファイルへ実際に書き込みを行うには以下の関数を使います。*inBuffer)読み込みと同じような感じで、バイト単位とパケット単位の二つの書き込み方法があります。inStartingByteで毎度位置を指定しなくてはいけなかったり、ioNumBytesに実際に書き込まれた分だけの値が返ってくるのも同じです。読み込み時のデータのバイトオーダーは勝手にネイティブに変換されていましたが、書き込み時にはちゃんとフォーマットに合わせたエンディアンに変換しておかなければいけません。inStartingByteで書き込み位置を、まだ何も書き込んでいない位置に飛ばして指定すると、その間は無音が勝手に入ります。書き込み用の関数はこれくらいで、プロパティの設定・取得や、オーディオファイルを閉じるのは読み込みと共通です。サンプルコード(オーディオファイルのコピー)オーディオファイルの読み込みと書き込みを行うサンプルとして、オーディオファイルのコピーを行ってみたいと思います。ファイルタイプやフォーマットはリニアPCMに限定して、全く変えずコピーするようにしています。FoundationToolを新規作成して、AudioToolbox.Frameworkをプロジェクトに追加し、以下のコードのようにmain関数を記述します。inPathは適当に書いてあるだけなので、何かコピー元となるリニアPCMのオーディオファイルを指定してみてください。NSURLを取得するのにURLWithString:を使っていましたが、それだとスペースの含まれているファイルパスが開けないので、fileURLWithPath:に変更しました。//書き出し側のオーディオファイルを作成する。0;}プログラムを実行すると、微妙なファイル容量のずれはありますが、中身的には全く同じオーディオデータのコピーが出来るはずです。ファイルタイプによって読み込みと書き込みでエンディアンが変わってしまうので、スワップするようにしています。めんどくさいので、普通に書き込むだけだったらExtendedAudioFile使った方が良いのではないでしょうか。AMkAudioFileFlags_DontPageAlignAudioDataですが、kAudioFileWAVETypeで出力した場合はFLLRチャンクヘッダが出力されなくなるようです。コメントをキャンセルメールアドレスが公開されることはありません。