Android StageFrightMediaScanner源代码解析
来源:互联网 发布:淘宝换货 编辑:程序博客网 时间:2024/06/06 07:38
1. 简介
Android中在StageFrightMediaScanner实现对多媒体文件的处理。
此外在StageFrightMediaScanner定义了支持的多媒体文件类型。
文件位置
frameworks\av\media\libstagefright\StagefrightMediaScanner.cpp
编译目标
libstagefright.so
2. processFile
processFile并没有做什么处理,主要是调用processFileInternal。
另外可以看到在processFile中调用MediaScannerClient的beginFile和endFile方法,时间上google并没有实现beginFile和endFile方法。
(说实话Android5.0 真的很烂,很多功能根本就没有开发完全)
MediaScanResult StagefrightMediaScanner::processFile( const char *path, const char *mimeType, MediaScannerClient &client) { //MediaScannerClient根本就没有实现,所以不用关心 client.setLocale(locale()); client.beginFile(); MediaScanResult result = processFileInternal(path, mimeType, client); client.endFile(); return result;}
3. processFileInternal
processFileInternal可以说是MediaScanner处理多媒体文件最终节点
在此函数中通过调用MediaMetadataRetriever获取多媒体信息。
调用MediaMetadataRetriever获取媒体文件信息过程如下:
(1) MediaMetadataRetriever.setDataSource(file)
(2) MediaMetadataRetriever.extractMetadata(key)
MediaScanResult StagefrightMediaScanner::processFileInternal( const char *path, const char * /* mimeType */, MediaScannerClient &client) { const char *extension = strrchr(path, '.'); ///check file type if (!extension) { return MEDIA_SCAN_RESULT_SKIPPED; } if (!FileHasAcceptableExtension(extension)) { return MEDIA_SCAN_RESULT_SKIPPED; } //---------------------------------------- ///Init & setDataSource MediaMetadataRetriever sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever); int fd = open(path, O_RDONLY | O_LARGEFILE); status_t status; if (fd < 0) { // couldn't open it locally, maybe the media server can? status = mRetriever->setDataSource(NULL /* httpService */, path); } else { status = mRetriever->setDataSource(fd, 0, 0x7ffffffffffffffL); close(fd); } //---------------------------------------- ///get MIMETYPE const char *value; if ((value = mRetriever->extractMetadata( METADATA_KEY_MIMETYPE)) != NULL) { status = client.setMimeType(value); if (status) { return MEDIA_SCAN_RESULT_ERROR; } } //---------------------------------------- ......... ///get metadata for (size_t i = 0; i < kNumEntries; ++i) { const char *value; if ((value = mRetriever->extractMetadata(kKeyMap[i].key)) != NULL) { status = client.addStringTag(kKeyMap[i].tag, value); if (status != OK) { return MEDIA_SCAN_RESULT_ERROR; } } } return MEDIA_SCAN_RESULT_OK;}
0 0
- Android StageFrightMediaScanner源代码解析
- Android源代码结构解析
- Android源代码结构解析
- Android MediaScanner源代码解析
- android Message类源代码解析
- Android百分比布局源代码解析
- Android MediaScanner.cpp 源代码解析
- Android开发基础:Android源代码结构解析
- Android开发:AsyncTask源代码完全解析
- android LruCache 原理 以及 源代码解析
- (Android 开源项目 android pn) Android pn源代码解析
- Android开发之AIDL实现原理解析(源代码分享 )
- Android init源代码分析(2)init.rc解析
- Android系统设置settings应用学习(二)--源代码解析
- Android属性动画源代码解析(超详细)
- Android init源代码分析(2)init.rc解析
- Android源码解析之应用程序启动过程源代码分析
- 如何解析网页源代码
- 【转载】豆瓣最受欢迎的书评——《透明的哀伤》
- 第一周第四天([大小写变换问题][判断是否为email][求对角线的值] [生成数组][数字中添加逗号][生成10个两位随机数,然后再进行排序] [复制数组||将指定数组的指定范围复制到新的数组])
- NYoj 动态规划 聪明的KK
- 【小结】2-sat
- 【android】android studio下二维码类库zxing精简包的配置及第三方类库的导入
- Android StageFrightMediaScanner源代码解析
- mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
- 1059. Prime Factors (25)
- GCD—互斥锁实现单例
- <七> Linux 文件与目录管理
- Java中实现复制文件或文件夹
- 053第256题
- 有物品数量限制的背包问题
- 插入排序