Android-StageFright之数据流的封装和AwesomePlayer流程
来源:互联网 发布:jav网络机顶盒怎么样 编辑:程序博客网 时间:2024/06/07 07:04
第一部分:StageFright的数据流封装
一、由数据源DataSource生成MediaExtractor。
通过MediaExtractor::Create(dataSource)来实现。Create方法通过两步来生成相应的MediaExtractor:
1、通过dataSource->sniff来探测数据类型
2、生成相应的Extractor:
- if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)
- || !strcasecmp(mime, "audio/mp4")) {
- return new MPEG4Extractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
- return new MP3Extractor(source, meta);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)
- || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
- return new AMRExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV)) {
- return new WAVExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_OGG)) {
- return new OggExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA)) {
- return new MatroskaExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) {
- return new MPEG2TSExtractor(source);
- }
二、接下来,通过以下代码把音视频轨道分离:
- if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
- setVideoSource(extractor->getTrack(i));
- haveVideo = true;
- } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
- setAudioSource(extractor->getTrack(i));
- haveAudio = true;
通过setVideoSource()和setAudioSource()来生成mVideoTrack和mAudioTrack两个MediaSource。
三、到目前为止我们得到的这两个MediaSource只具有parser功能,没有decode功能。还需要对这两个MediaSource做进一步的包装:
- mVideoSource = OMXCodec::Create(
- mClient.interface(), mVideoTrack->getFormat(),
- false, // createEncoder
- mVideoTrack,
- NULL, flags);
- mAudioSource = OMXCodec::Create(
- mClient.interface(), mAudioTrack->getFormat(),
- false, // createEncoder
- mAudioTrack);
这回又获取了两个MediaSource,mVideoSource和mAudioSource,它们具有parse和decode功能。当调用MediaSource.start()方法后,它的内部就会开始从数据源获取数据并解析,等到缓冲区满后便停止。在AwesomePlayer里就可以调用MediaSource的read方法读取解码后的数据。
对于mVideoSource来说:
读取的数据:
mVideoSource->read(&mVideoBuffer,&options
交给显示模块进行渲染:
mVideoRenderer->render(mVideoBuffer);
对mAudioSource来说:
用mAudioPlayer对mAudioSource进行封装,然后由mAudioPlayer负责读取数据和播放控制。
第二部分:AwesomePlayer流程
URI,FD
---->DataSource
---->MediaExtractor
---->mVideoTrack, mAudioTrack//音视频数据流
---->mVideoSource, mAudioSource//音视频解码器
---->mVideoBuffer, mAudioPlayer
上面示意了数据由源到最终解码后的流程。
1、设置DataSource;
数据源有两种:URI和FD。URI可以是http://,rtsp://等;FD是一个本地文件描述符,能过FD,可以找到对应的文件。
2、由DataSource生成MediaExtractor;
通过sp extractor = MediaExtractor::Create(dataSource);来实现。
MediaExtractor::Create(dataSource)会根据不同的数据内容创建不同的数据读取对象,eg: MPEG4Extractor
3、通过调用setVideoSource()由MediaExtractor分解生成音频数据流(mAudioTrack)和视频数据流(mVideoTrack)。
4、 onPrepareAsyncEvent();
如果DataSource是URL的话,根据地址获取数据,并开始缓冲,直到获取到mVideoTrack和mAudioTrack。
mVideoTrack和mAudioTrack通过调用initVideoDecoder()和initAudioDecoder()来生成mVideoSource和mAudioSource这两个音视频解码器,然后调用postBufferingEvent_l()提交事件开启缓冲。
数据缓冲的执行函数是onBufferingUpdate(),缓冲区有足够的数据可以播放时,调用play_l()开始播放。
play_l()中关键是调用了postVideoEvent_l(),提交了 mVideoEvent。这个事件执行时会调用函数onVideoEvent()。这个函数通过调用 mVideoSource->read(&mVideoBuffer, &options)进行视频解码,音频解码通过mAudioPlayer实现。
视频解码器解码后通过mVideoSource->read读取一帧帧的数据,放到mVideoBuffer中,最后通过mVideoRenderer->render(mVideoBuffer)把视频数据发送到显示模块。
当需要暂停或停止时,调用cancelPlayerEvents来提交事件用来停止解码,还可以选择是否继续缓冲数据。
转自:http://blog.csdn.net/xiaoshi_xiaoshi/article/details/7045958
- Android-StageFright之数据流的封装和AwesomePlayer流程
- Android-StageFright之数据流的封装和AwesomePlayer流程
- Android-StageFright之数据流的封装和AwesomePlayer流程
- Android-StageFright之数据流的封装和AwesomePlayer流程
- Android-StageFright之数据流的封装和AwesomePlayer流程
- Android-StageFright之数据流的封装和AwesomePlayer流程
- Android-StageFright之数据流的封装和AwesomePlayer流程
- Stagefright AwesomePlayer 播放流程的函数调用
- Stagefright 之 AudioPlayback的流程
- awesomeplayer 数据流
- Android Multimedia框架总结(八)Stagefright框架之AwesomePlayer及数据解析器
- Android Multimedia框架总结(八)Stagefright框架之AwesomePlayer及数据解析器
- Android Multimedia框架总结(八)Stagefright框架之AwesomePlayer及数据解析器
- Android Multimedia框架总结(八)Stagefright框架之AwesomePlayer及数据解析器
- Android多媒体开发-stagefright及AwesomePlayer相关知识梳理
- Stagefright 之 Video Playback的流程
- stagefright框架下的awesomeplayer设置数据源阶段
- stagefright框架下的awesomeplayer播放准备阶段
- 问题:客户端从服务器分页获取列表,如何保证流量最少,且客户端和Server数据的一致性?
- Google App Engine的app.yaml详细说明
- 斯帅:没料到詹姆斯会耗光时间再投
- Cocos2d-x 中北景的无限游动的方法
- 【数据结构】堆排序
- Android-StageFright之数据流的封装和AwesomePlayer流程
- 偶遇一种复制内容到剪贴板的工具
- Python类、模块、包
- C++11中值得关注的几大变化
- HDU2708-模拟题
- Zepto.js
- 数据结构之约瑟夫问题---猴子选大王
- JS实现文件下载
- 逢年过节了。好热闹呢