講完了audio和video的處理流程,接下來要看的是audio和video同步化(synchronization)的問題。OpenCORE的做法是設置一個主clock,而audio和video就分別以此作為輸出的依據。而在Stagefright中,audio的輸出是透過callback函式來驅動,video則根據audio的timestamp來做同步。以下是詳細的說明:
(1) 當callback函式驅動AudioPlayer讀取解碼後的資料時,AudioPlayer會取得兩個時間戳 -- mPositionTimeMediaUs和mPositionTimeRealUs
size_t AudioPlayer::fillBuffer(data, size) { ...
mSource->read(&mInputBuffer, ...);
mInputBuffer->meta_data()->findInt64(kKeyTime, &mPositionTimeMediaUs); mPositionTimeRealUs = ((mNumFramesPlayed + size_done / mFrameSize) * 1000000) / mSampleRate;
... }
|
mPositionTimeMediaUs是資料裡面所載明的時間戳(timestamp);mPositionTimeRealUs則是播放此資料的實際時間(依據frame number及sample rate得出)。
(2) Stagefright中的video便依據從AudioPlayer得出來之兩個時間戳的差值,作為播放的依據
void AwesomePlayer::onVideoEvent() { ...
mVideoSource->read(&mVideoBuffer, ...); mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs);
mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs); mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; latenessUs = nowUs - timeUs;
... }
|
AwesomePlayer從AudioPlayer取得realTimeUs(即mPositionTimeRealUs)和mediaTimeUs(即mPositionTimeMediaUs),並算出其差值mTimeSourceDeltaUs。
(3) 最後我們將該video資料做排程
void AwesomePlayer::onVideoEvent() { ... if (latenessUs > 40000) { mVideoBuffer->release(); mVideoBuffer = NULL;
postVideoEvent_l(); return; } if (latenessUs < -10000) { postVideoEvent_l(10000); return; }
mVideoRenderer->render(mVideoBuffer);
... }
|
分享到:
相关推荐
Stagefright是Android平台上的核心多媒体框架,负责处理多媒体数据的解码、渲染和传输。本篇将深入探讨Stagefright的工作原理及其在Android系统中的作用。 一、Stagefright概述 Stagefright自Android 2.2(Froyo)...
Stagefright 框架在 Android 中以 shared library 的形式存在,名为 libstagefright.so,其中的 AwesomePlayer 模块可以用来播放视频和音频。AwesomePlayer 提供了许多 API,可以让上层的应用程序(Java/JNI)来调用...
Stagefright 框架具有简洁的架构和良好的跨平台移植性,是 Android 多媒体架构中的重要组件。 Stagefright 框架的架构 Stagefright 框架由多个模块组成,每个模块负责不同的多媒体处理任务。 AwesomePlayer 是 ...
### StageFright_Audio与Video的同步 #### StageFright框架简介 StageFright是Android系统中的多媒体框架,用于处理音频、视频等媒体文件的播放。该框架支持多种媒体格式,并且提供了高度优化的编解码器。在Stage...
AudioFlinger是Android音频系统的混音器,负责音频的播放和录制,而CodecDriver、DisplayDriver、AudioDriver和Linux Kernel则是底层的驱动和内核支持,为Stagefright框架提供硬件级别的支持。 Stagefright框架提供...
Stagefright是Google为Android平台设计的一套媒体框架,旨在提供高质量的音频、视频解码和播放功能。它位于Android系统的顶层应用与底层硬件之间,充当了桥梁角色,负责解析、解码各种多媒体格式,并将解码后的数据...
StageFright框架通过精心设计的音频和视频同步机制,实现了流畅的多媒体播放体验。音频由回调函数驱动,而视频则根据音频的时间戳进行精确同步,确保了音画一致。这一流程涉及多个关键时间戳的计算与对比,以及基于...
在Android系统中,多媒体处理是不可或缺的一部分,而Stagefright和OpenCore是两个重要的多媒体框架。它们各自在不同的时期和环境下承担着Android平台上的多媒体播放和处理任务。下面将详细对比这两个框架,以便理解...
其中,AwesomePlayer是Stagefright框架中负责视频和音频播放的关键模块,它提供了丰富的API接口,供上层应用程序(Java或JNI)调用进行多媒体操作。 当一个视频播放请求在Java层发起时,通常会执行以下步骤: 1. ...
在Android 2.3版本之前,OpenCORE是主要的多媒体框架,但其复杂的架构和维护成本促使Google引入了更为简洁的Stagefright框架。Stagefright自Android 2.0开始逐渐崭露头角,并在后续版本中逐步取代OpenCORE,成为...
stagefright + omx小结 stagefright + omx小结 stagefright + omx小结 stagefright + omx小结 stagefright + omx小结 stagefright + omx小结 stagefright + omx小结
因此,为了保证系统的安全性,Android开发者不断修复这些漏洞,并加强了对Stagefright框架的审查和安全更新。 总结来说,Stagefright是Android系统中处理多媒体内容的关键组件,它简化了媒体处理流程,提高了性能,...
标题中的"Stagefright-CVE-2015-3864"是一个重要的安全漏洞,它涉及到Android操作系统中的多媒体处理框架Stagefright。在2015年,这个漏洞被公开,它允许攻击者通过恶意MMS( Multimedia Messaging Service,多媒体...
stageFright_OpenMax系统.doc,对Android2.3的 stagefright框架和openMAx的深入分析
在Android系统中,Stagefright框架负责多媒体内容的播放,包括HTTP Live Streaming(HLS)。本文将深入探讨Stagefright处理HLS的缓冲机制,同时也会涉及到Android Binder机制,它是Android系统中进程间通信(IPC)的...
简述了android 的stagefright多媒体 框架 和 openmax 框架
本文详细介绍了Android多媒体框架下Stagefright的功能扩展策略,重点阐述了采用桥接设计模式以及整合FFmpeg框架来开发适配Stagefright的解包装和解码插件的过程。这种扩展方法能够使Android多媒体框架支持更多种类的...