stagefright框架(六)-Audio Playback的流程

转自:http://blog.chinaunix.net/space.php?uid=10995602&do=blog&id=2918720

 

到目前為止,我們都只著重在video處理的部分,對於audio卻隻字未提。這篇文章將會開始audio處理的流程。

Stagefright中關於audio的部分是交由AudioPlayer來處理,它是在AwesomePlayer::play_l中被建立的。


(1) 當上層應用程式要求播放影音時,AudioPlayer同時被建立出來,並且被啟動

status_t AwesomePlayer::play_l()
{
  ...

  mAudioPlayer = new AudioPlayer(mAudioSink,...);
  mAudioPlayer->start(...);

  ...
}


(2) AudioPlayer在啟動的過程中會先去讀取第一筆解碼後的資料,並且開啟audio output


status_t AudioPlayer::start(...)
{
  mSource->read(&mFirstBuffer);

  if (mAudioSink.get()!= NULL)
  {
    mAudioSink->open(...,&AudioPlayer::AudioSinkCallback,...);
    mAudioSink->start();
  }
  else
  {
    mAudioTrack = new AudioTrack(...,&AudioPlayer::AudioCallback,...);
    mAudioTrack->start();
  }
}


AudioPlayer::start的程式碼來看,AudioPlayer似乎並沒有將mFirstBuffer傳給audio output

(3) 開啟audio output的同時,AudioPlayer會將callback函式設給它,之後每當callback函式被呼叫,AudioPlayer便去audio decoder讀取解碼後的資料

size_t AudioPlayer::AudioSinkCallback(audioSink, buffer, size, ...)
{
  return fillBuffer(buffer, size);
}
void AudioPlayer::AudioCallback(..., info)
{
  buffer = info;
  fillBuffer(buffer->raw, buffer->size);
}
size_t AudioPlayer::fillBuffer(data, size)
{
  mSource->read(&mInputBuffer,...);
  memcpy(data, mInputBuffer->data(),...);
}


解碼後audio資料的讀取就是由callback函式所驅動,但是callback函式又是怎麼由audio output去驅動的,目前從程式碼上還看不出來。另外一方面,從上面的程式片段可以看出,fillBuffer將資料(mInputBuffer)複製到data之後,audio output應該會去取用data

 

当然对于video,有一个AwesomePlayer::mQueue::start中创建的线程来处理视频,即通过向线程的等待队列mQueue(List<QueueItem>)发事件消息来驱动;而对于Audio,也有一个mAudioTrackThread::mAudioTrackThread(AudioTrackThread)线程调用回调函数来驱动。(AudioSink::open时也会创建一个AudioTrack来实现,具体代码参见:MediaPlayerService::AudioOutput::open)



(5) 至於audio decoder的工作流程則和video decoder相同,可參閱《Stagefright (4) - Video Buffer傳輸流程

 

转载于:https://my.oschina.net/abcijkxyz/blog/788949

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值