Staggright AudioPlayerフロー
20029 ワード
ロゾー実験室:http://www.rosoo.net/a/201111/15264.html
Staggrightのaudioに関する部分はAudioPlayerによって処理され、出力はAudioSinkまたはAudioTrackを使用する。
TAG:オーディオ再生 Stage Fright
Staggrightのaudioに関する部分はAudioPlayerによって処理され、出力はAudioSinkまたはAudioTrackを使用する。 stagefrightフレーム(六)-Audio Playbackのフロー
AudioTrackを使ってPCMのオーディオ数を再生します。
MediaPlayerは完全なオーディオファイルのみを操作できます。直接にPCMのオーディオデータを操作することはできません。もし私たちが復号を通じてPCMデータソースを得たら、どうやってそれらを再生しますか?そうです。AudioTrackというクラス(MediaPlayer内部でもこのクラスを呼び出して本格的にオーディオストリームを再生します。)のDEMOでAudioTrackの使い方をデモンストレーションしました。
TAG:オーディオ再生 AudioTrack PCMを再生
AndroidのMediaPlayerはAudioとvideoの再生機能を含み、AndroidのインターフェイスではMusicとVideoの両方のアプリケーションがMediaPlayerを呼び出して実現される。MediaPlayerは、最下階にOpenCore(PacketVideo)のライブラリに基づいて実現され、MediaPlayerプログラムを構築するために、プロセス間通信などの内容も含まれています。このようなプロセス間通信の基礎はAndroidベースライブラリにおけるBinderメカニズムです。しかし、このクラスは完全なオーディオファイルのみを操作できます。直接にPCMのオーディオデータを操作することはできません。もし私たちが復号を通じてPCMデータソースを得たら、どうやってそれらを再生しますか?そうです。AudioTrackというカテゴリー(MediaPlayer内部でもこのクラスを呼び出して本格的にオーディオストリームを再生します。)のDEMOを使って、AudioTrackをどのように使うかをデモしました。
2011-5-21 07:04:17アップロード
添付ファイルをダウンロード(28.48 KB)
このクラスはAudioTrackに対して簡単にカプセル化されました。
Staggrightのaudioに関する部分はAudioPlayerによって処理され、出力はAudioSinkまたはAudioTrackを使用する。
TAG:オーディオ再生 Stage Fright
Staggrightのaudioに関する部分はAudioPlayerによって処理され、出力はAudioSinkまたはAudioTrackを使用する。
- status_t AwesomePlayer::play_l() {
- ...
- if (mAudioSource != NULL) {
- if (mAudioPlayer == NULL) {
- if (mAudioSink != NULL) {
- mAudioPlayer = new AudioPlayer(mAudioSink, this);
- mAudioPlayer->setSource(mAudioSource);
- ...
- }
- ...
- }
AwesomePlayerは、init AudioDecoder方法において、audio decoderを確立する。status_t AwesomePlayer::initAudioDecoder() {
...
if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
mAudioSource = mAudioTrack;
} else {
mAudioSource = OMXCodec::Create(
mClient.interface(), mAudioTrack->getFormat(),
false, // createEncoder
mAudioTrack);
}
...
}
プレイを呼び出すとlメソッドの場合はAudioPlayerを確立し、Audio Decoder[mAudioSource]をAudioPlayerに転送します。startメソッドを呼び出したときはaudio Sinkを開いて、AudioSicallback
- status_t AudioPlayer::start(bool sourceAlreadyStarted) {
- ...
- if (mAudioSink.get() != NULL) {
- status_t err = mAudioSink->open(
- mSampleRate, numChannels, AudioSystem::PCM_16_BIT,
- DEFAULT_AUDIOSINK_BUFFERCOUNT,
- &AudioPlayer::AudioSinkCallback, this);
- ...
- mAudioSink->start();
- ...
- }
の後にAudioSinkがSampleデータを必要とするときはAudioSink Cazeckにデータをフィードバックします。ここでfillBuffer関数を呼び出して、audio decoderから復号後のSampleデータを読みだします。
- size_t AudioPlayer::AudioSinkCallback(
- MediaPlayerBase::AudioSink *audioSink,
- void *buffer, size_t size, void *cookie) {
- AudioPlayer *me = (AudioPlayer *)cookie;
-
- LOGI("[%s:%d]_____ enter AudioPlayer::AudioSinkCallback size = %d"
- , __FUNCTION__, __LINE__, size);
-
- return me->fillBuffer(buffer, size);
- }
-
- void AudioPlayer::AudioCallback(int event, void *info) {
- if (event != AudioTrack::EVENT_MORE_DATA) {
- return;
- }
- AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info;
- size_t numBytesWritten = fillBuffer(buffer->raw, buffer->size);
- buffer->size = numBytesWritten;
- }
-
- size_t AudioPlayer::fillBuffer(void *data, size_t size) {
- ...
- size_t size_done = 0;
- size_t size_remaining = size;
- while (size_remaining > 0) {
- ...
- err = mSource->read(&mInputBuffer, &options);
- ...
- memcpy((char *)data + size_done,
- (const char *)mInputBuffer->data() + mInputBuffer->range_offset(),
- copy);
- mInputBuffer->set_range(mInputBuffer->range_offset() + copy,
- mInputBuffer->range_length() - copy);
- size_done += copy;
- size_remaining -= copy;
- ...
- }
- ...
- }
ここのmSourceは実はdecoderであり、そのread方法はmAudioTrackのread方法を呼び出してDataSourceの復号されていないデータを取得し、復号したデータを返す。総プロセスは以下の通りです。
- AudioSink
- |
- +- AudioPlayer#AudioSinkCallback
- |
- +- AudioDecoder#read
- |
- +- Extractor::MediaSource#read
を参照してください。AudioTrackを使ってPCMのオーディオ数を再生します。
MediaPlayerは完全なオーディオファイルのみを操作できます。直接にPCMのオーディオデータを操作することはできません。もし私たちが復号を通じてPCMデータソースを得たら、どうやってそれらを再生しますか?そうです。AudioTrackというクラス(MediaPlayer内部でもこのクラスを呼び出して本格的にオーディオストリームを再生します。)のDEMOでAudioTrackの使い方をデモンストレーションしました。
TAG:オーディオ再生 AudioTrack PCMを再生
AndroidのMediaPlayerはAudioとvideoの再生機能を含み、AndroidのインターフェイスではMusicとVideoの両方のアプリケーションがMediaPlayerを呼び出して実現される。MediaPlayerは、最下階にOpenCore(PacketVideo)のライブラリに基づいて実現され、MediaPlayerプログラムを構築するために、プロセス間通信などの内容も含まれています。このようなプロセス間通信の基礎はAndroidベースライブラリにおけるBinderメカニズムです。しかし、このクラスは完全なオーディオファイルのみを操作できます。直接にPCMのオーディオデータを操作することはできません。もし私たちが復号を通じてPCMデータソースを得たら、どうやってそれらを再生しますか?そうです。AudioTrackというカテゴリー(MediaPlayer内部でもこのクラスを呼び出して本格的にオーディオストリームを再生します。)のDEMOを使って、AudioTrackをどのように使うかをデモしました。
2011-5-21 07:04:17アップロード
添付ファイルをダウンロード(28.48 KB)
このクラスはAudioTrackに対して簡単にカプセル化されました。
- public class MyAudioTrack {
- int mFrequency;//
- int mChannel;//
- int mSampBit;//
- AudioTrack mAudioTrack;
- public MyAudioTrack(int frequency, int channel, int sampbit){
- mFrequency = frequency;
- mChannel = channel;
- mSampBit = sampbit;
- }
- public void init(){
- if (mAudioTrack != null){
- release();
- }
-
- //
- int minBufSize = AudioTrack.getMinBufferSize(mFrequency,
- mChannel, mSampBit);
-
- //STREAM_ALARM:
- //STREAM_MUSCI: , music
- //STREAM_RING:
- //STREAM_SYSTEM:
- //STREAM_VOCIE_CALL:
- mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
- mFrequency,mChannel,mSampBit,minBufSize, AudioTrack.MODE_STREAM);
- //AudioTrack MODE_STATIC MODE_STREAM 。
- //STREAM write audiotrack 。
- // socket , ,
- // PCM , write audiotrack。
- // JAVA Native , 。
- // STATIC , buffer, audiotrack,
- // write 。AudioTrack buffer 。
- // , 。
- mAudioTrack.play();
- }
- public void release(){
- if (mAudioTrack != null){
- mAudioTrack.stop();
- mAudioTrack.release();
- }
- }
-
- public void playAudioTrack(byte []data, int offset, int length){
- if (data == null || data.length == 0){return ;}
- try {
- mAudioTrack.write(data, offset, length);
- } catch (Exception e) {
- Log.i("MyAudioTrack", "catch exception...");
- }
- }
-
- public int getPrimePlaySize(){
- int minBufSize = AudioTrack.getMinBufferSize(mFrequency,
- mChannel, mSampBit);
- return minBufSize * 2;
- }
- }
m AudioTrack.write(data,off set,length);この関数は、ハードウエアの再生にデータを書き込む鍵です。