CMSampleBufferからオーディオデータを取り出す

前回の続きというほどのものでもない内容になってしまいますが、CMSampleBufferからオーディオのデータを取り出す方法です。CMSampleBufferGetAudioBufferListWithRetainedBlockBufferという関数を使います。前回の内容も含めてDeveloper Forumsに書いてあったコードを参考に調べていたのですが、削るに削ってこれだけになりました。

CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];
CMBlockBufferRef blockBuffer;
AudioBufferList audioBufferList;
        
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer,
                                                        NULL,
                                                        &audioBufferList,
                                                        sizeof(audioBufferList),
                                                        NULL,
                                                        NULL,
                                                        0,
                                                        &blockBuffer);
//
//    ここでAudioBufferListから読み出す処理など
//
CFRelease(sampleBuffer);
CFRelease(blockBuffer);

とりあえずInterleavedなオーディオデータが読み出せればよいのであれば、上記のコードのようにAudioBufferListを作って、その中のデータを保持するCMBlockBufferをこの関数で取得するというだけで良いようです。引数がたくさんあって他にもいろいろ取得できるようですが、結構みんなNULLであっさり通ったので、あえてそれらを使って何かするのでなければいらないんじゃないでしょうか。

CMSampleBufferからオーディオデータを取り出す」への8件のフィードバック

  1. micono

    はじめまして、miconoといいます。
    SoftmodemTerminalを使ってゴニョゴニョやってるんですが、
    そもそもCoreAudioどころか、Cocoa・iOSプログラミングも、
    ままならない状態で、どうやればいいのか、どこを調べれば
    解決するのか困ってましす。
    SoftModemインターフェースボード
    http://code.google.com/p/arms22/wiki/SoftModemBreakoutBoard
    のページに、ソースコードが
    SoftModemTerminal-004.zip
    または、
    AppStoreから
    SoftModemTerminal.app
    http://itunes.apple.com/jp/app/id385096654?mt=8
    が、ダウンロードできますが、
    これを使って、オリジナルのApp
    http://micono.cocolog-nifty.com/blog/2011/01/softmodem-cdd7.html
    を作ってみました。
    で、これらのAppは、どれもイヤフォン端子からは音が出るんですが、
    DockコネクタのLineアウトからは出てないようなんです。あと、同じ意味かもしれませんが、Bluetoothヘッドフォンでも音は聞こえません。
    Dockコネクタを改造してLineアウトとSoftModemを繋いだり、BTで拾ったりしたいと考えているんですが、そもそもなんでイヤフォンから音がでて、ラインアウトからは出てないのかも意味不明で、出すためのプログラミングが別途必要なのかとか?
    音を作り出しているのは、FSKSerialGenerator.mm辺りでしょうか?kAudioFormatLinearPCMだとダメとかkAudioFormatMPEG4AACとか特定のformatじゃないとダメとか?
    兎に角、何をどうしていいのか全くわからないのです。
    まとまりのない文章で申し訳有りません、少しだけでも、
    何かヒントとなるようなことないでしょうか?
    よろしくお願いいたします。

    返信
  2. Yasoshima

    当方でも試してみましたが、純正のLineアウトケーブルでは問題なく音声が出力されています。純正でないもの(あるいは古いもの?)だとiPhoneに対応してない場合があったと思いますので、Lineアウトに関してはケーブルの可能性が大きいと思います。
    Bluetoothに関しましては、少なくともiPhoneではおそらくマイク入力付きのBluetoothヘッドセットなどでないと、サンプルのソースコードそのままでは出力されないと思います。その原因は、音声入力が生きている場合にAudioSessionCategoryをPlayAndRecordにしているからで、入力のアナライズが必要でなければ、その部分を消してしまって、常にCategoryをPlaybackになるようにしておけばBluetoothからも音声が出力されると思います。

    返信
  3. ishida

    ishidaと申します。
    記事を大変興味深く、拝読させて頂いております。
    iPod内の曲データを取り出して、エフェクトして再生させたいと考えているのですが、方法がわからず悩んでおります。
    CMSampleBufferRef sampleBufferで取り出したデータを、AudioUnitやRemote IO Unitに接続して再生するには、どのようにすればよろしいのでしょうか?
    ご教授頂ければ幸いです。
    以上、よろしくお願い致します。

    返信
  4. Yasoshima

    iPod Libraryの曲に限らず、オーディオファイルをAudioUnitで再生する場合は、一旦メモリにデータを読み込んでおいて、そこからコールバック内でデータを渡すことが必要です。単純にオーディオを再生するだけでしたらAudio Queue Serviceを使えばよいのですが、AudioUnitでエフェクトをかけるということですとAudio Queue Serviceは使えませんので、Audio Queue Serviceと同じようなバックグラウンドでメモリに読みこむ仕組みを独自に作らなければいけません。その仕組みさえあれば、バックグラウンドでのメモリ読み込みメソッド内でiPod Libraryから読み込めば大丈夫です。もちろん私は拙作のTouch the Waveで作ってやっていますが、まだどのような実装が良いかは研究途中ということもあり、今のところ公開する予定はありません。頑張ってご自身で実装してください。

    返信
  5. Simom

    はじめまして、シモムといいます。
    iPhone appの開発を初めたばかりの初心者です。
    iPod内のファイルへのアクセス方法を調べていてこの記事を知りました。
    とてもわかりやすい内容なので、良い勉強をさせていただきました。
    ありがとうございます。
    1点だけ、わかならい疑問がございます。
    iPod内のファイルの編集は行えますでしょうか?
    具体的には、レーティングや再生回数などを変更したいと考えております。
    いろいろ調べているのですが、有効な情報が見当たりません。。
    もしご存知ならば、教えていただけませんでしょうか。
    よろしくお願いいたします。

    返信
  6. Yasoshima

    iPod Libraryの中ファイルの情報はMPMediaItemで取得は出来ても、書き換える事は出来ないと思います。

    返信
  7. Simom

    ご回答ありがとうございます。
    そうですか・・・。
    やはり変更は無理なんですね。
    諦めます。
    スッキリしました。
    ありがとうございました。

    返信

Yasoshima へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です