没有合适的资源?快使用搜索试试~ 我知道了~
StageFright框架介绍
5星 · 超过95%的资源 需积分: 29 97 下载量 78 浏览量
2011-09-08
16:27:28
上传
评论
收藏 586KB PDF 举报
温馨提示
试读
23页
介绍了Stagefright的框架以及播放过程的大致模型,针对Android的多媒体框架的初学者比较有用。
资源推荐
资源详情
资源评论
Stagefright (1) - Video Playback的流程...........................................................................................1
Stagefright (2) - 和Op
enMAX的運作 .............................................................................................6
Stagefright (3) - 選擇V
ideo Decoder...............................................................................................9
Stagefright (4) - Video Buffer傳輸流程.........................................................................................12
Stagefright (5) - Video Rendering...................................................................................................15
Stagefright (6) - Audio Playback的流程 ........................................................................................19
Stagefright (7) - Audio和Vid
eo的同步 ..........................................................................................21
Stagefright (1) - Video Playback的流程
在 Android 上,預設的多媒體框架(multimedia framework)是 OpenCORE。
OpenCORE 的優點是兼顧了跨平台的移植性,而且已經過多方驗證,所以相對
來說較為穩定;但是其缺點是過於龐大複雜,需要耗費相當多的時間去維護。
從 Android 2.0 開始,Google 引進了架構稍為簡潔的 Stagefright,並且有逐
漸取代 OpenCORE 的趨勢 (註 1)。
[圖 1] Stagefright 在 Android 多媒體架構中的位置
1
[圖 2] Stagefright 所涵蓋的模組 (註 2)。
以下我們就先來看看 Stagefright 是如何播放一個影片檔。
Stagefright在Android中是以shared library的形式存在(libstagefright.so),
其中的module -- AwesomePlayer可用來播放video/audio (註 3)。
AwesomePlayer提供許多API,可以讓上層的應用程式(Java/JNI)來呼叫,我
們以一個簡單的程式來說明video playback的流程。
在Java中,若要播放一個影片檔,我們會這樣寫:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE); ...... (1)
mp.prepare(); ........................ (2)
、(3)
mp.start(); .......................... (4)
在Stagefright中,則會看到相對應的處理;
(1) 將檔案的絕對路徑指定給mUri
status_t AwesomePlayer::setDataSource(const char* uri, ...)
{
return setDataSource_l(uri, ...);
}
status_t AwesomePlayer::setDataSource_l(const char* uri, ...)
{
mUri = uri;
2
}
(2) 啟動mQueue,作為event handler
status_t AwesomePlayer::prepare()
{
return prepare_l();
}
status_t AwesomePlayer::prepare_l()
{
prepareAsync_l();
while (mFlags & PREPARING)
{
mPreparedCondition.wait(mLock);
}
}
status_t AwesomePlayer::prepareAsync_l()
{
mQueue.start();
mFlags |= PREPARING;
mAsyncPrepareEvent = new AwesomeEvent(
this
&AwesomePlayer::onPrepareAsyncEvent);
mQueue.postEvent(mAsyncPrepareEvent);
}
(3) onPrepareAsyncEvent被觸發
void AwesomePlayer::onPrepareAsyncEvent()
{
finishSetDataSource_l();
initVideoDecoder(); ...... (3.3)
initAudioDecoder();
}
3
status_t AwesomePlayer::finishSetDataSource_l()
{
dataSource = DataSource::CreateFromURI(mUri.string(), ...);
sp<MediaExtractor> extractor =
MediaExtractor::Create(dataSource); ..... (3.1)
return setDataSource_l(extractor); ......................... (3.2)
}
(3.1) 解析mUri所指定的檔案,並且根據其header來選擇對應的extractor
<MediaExtractor> MediaExtractor::Create(const sp<DataSource>
ource->sniff(&tmp, ...);
if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)
eturn new MPEG4Extractor(source);
e if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG))
e if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)
使用extractor對檔案做A/V的分離
sp
&source, ...)
{
s
mime = tmp.string();
{
r
}
els
{
return new MP3Extractor(source);
}
els
{
return new AMRExtractor(source);
}
}
(3.2)
(mVideoTrack/mAudioTrack)
st
&extractor)
{
f
{
sp<MetaData> meta = extractor->getTrackMetaData(i);
atus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor>
or (size_t i = 0; i < extractor->countTracks(); ++i)
CHECK(meta->findCString(kKeyMIMEType, &mime));
4
if (!haveVideo && !strncasecmp(mime, "video/", 6))
etVideoSource(extractor->getTrack(i));
e if (!haveAudio && !strncasecmp(mime, "audio/", 6))
etAudioSource(extractor->getTrack(i));
id AwesomePlayer::setVideoSource(sp<MediaSource> source)
VideoTrack = source;
根據mVideoTrack中的編碼類型來選擇video decoder (3.3)
(mVideoSource)
st
{
m
mVideoTrack->getFormat
false,
mVideoTr
}
atus_t AwesomePlayer::initVideoDecoder()
VideoSource = OMXCodec::Create(mClient.interface(),
(),
ack);
4) 將mVideoEvent放入mQueue中,開始解碼播放,並交由mVideoRenderer(
來畫出
s
{
r
}
st
{
p
}
tatus_t AwesomePlayer::play()
eturn play_l();
atus_t AwesomePlayer::play_l()
ostVideoEvent_l();
5
剩余22页未读,继续阅读
mkterry
- 粉丝: 2
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页