• スポンサードリンク

音&動画の同時キャプチャがした〜い(その2)

Android Camera MediaCodec 非同期

MediaCodec+MediaMuxerを使って音&動画の同時キャプチャがした〜いの第2弾♪
前回は前置きが長かったせいか、抽象クラスのMediaEncoderだけで終わってしまったので、今回は頑張らねば。と言う事でいきなりコード(^^)v 簡単な音声の方から行きます。

MediaAudioEncoder

抽象クラスのMediaEncoderを継承しています(2行目)。実装するのは、#prepare, #startRecording, #release, とsourceスレッドであるAudioThreadと、#prepareのヘルプ用の#selectAudioCodecです。簡単な方から説明します。

#startRecording

#startRecordingでは親の#startRecordingを呼び出した後、sourceスレッド(AudioThread)の生成と実行開始をしていますが、#prepareの最後に移動することも出来ます。ただし、その場合にはAudioThread内でstartRecording待ちの処理を追加しないといけません。
わざわざ#startRecordingというメソッドを作ったのに、AudioThread内にも待機処理を追加しないといけないのでは芸がありませんので、#startRecordingが呼ばれた時に初めてsourceスレッドを生成・実行するようにしています。

#release

これはまぁわざわざ説明するまでも無いですし、必須でもありませんがGCを確実にするためにnull代入しています。実際にはmAudioThreadフィールド自体をなくしてしまうことも可能ですが、個人的に気持ち悪いのでこんな事をしています。

#prepare

ここは、MediaCodec関係の実装で一番大事なものの1つです。これを間違えると最悪catch出来ない例外でクラッシュします。audioでは経験無いですが、videoだと端末丸ごとリセットっていうパターンもありです(´・ω・`)。と言ってもワンパターンなので大抵は丸ごとコピーですね(-_-;)
全ての機種でサポートされていることが保証されているサンプリングレートは44.1[KHz]のみらしいです。なので特に理由がない限りサンプリングレートには44100を指定しましょう。
端末内蔵マイクでステレオの物は見たことの聞いたこともないので、モノラル指定。ということはビットレートは64Kbpsもあれば十分でしょう。ステレオなら128Kbps相当ですね。ビットレートを上げれば基本的には音質が良くなっていきます。ただ端末の種類にもよりますが端末内蔵マイクからの入力自体がそんなに高音質ではないのでほどほどがいいかも。確か320Kbps程度まで設定出来たと思いますが、サポートしてない再生ソフトもありますし、高ビットレートにするとvideo側の帯域にも影響してしまいます。最新機種はともかく少し古くなるとNexus7(2012)等の様にaudio+video合計で1Mbps出ない機種も多くあります。
後は普通に、コーデックを選択・MediaFormatを設定・MediaCodec#createEncoderByTypeでコーデックを生成・configure・startの順に実行するだけです。

AudioThread

sourceスレッドの実体です。AudioRecordを使って16ビット無圧縮PCM音声データを取得してバイト配列として#encodeへ引き渡すだけです。後は上位クラスのMediaEncoderが勝手に処理してくれます。便利ですね〜わざわざ抽象クラスを作ったかいが有るというものです。
ここで気を付けるのは、AudioRecord#getMinBufferSizeが返してきた値をそのまま使うのはあまり良くないということです。2倍以上を指定するのが定番でしょう。小さすぎると音声が途切れたりします。端末の性能が低かったり他の処理の負荷が重い場合は大きめにした方が良いのかもしれません。でも大きすぎるとメモリの無駄遣いでGCが多くなってかえって思ったように動かなくなります。今回は余裕を見て4倍に設定しています。
なお、ここでの処理は単純で直線的なので余計なことはせずに全て#run内に押し込めています。

#selectAudioCodec

ここも説明は必要ないでしょうけど。
別の記事MediaCodecInfo#getCapabilitiesForTypeが激遅になる件に書いたとおり、コーデックの選択方法は2通りありますが、たぶんこっちの方がいいと思います。
今日は家の近所も時々大雨でしたが、ソースの嵐もまだまだ続きます。次はvideoです。

« »

  • スポンサードリンク