博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android StageFrightMediaScanner源码解析
阅读量:5276 次
发布时间:2019-06-14

本文共 2625 字,大约阅读时间需要 8 分钟。

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
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;}

转载于:https://www.cnblogs.com/yfceshi/p/7365750.html

你可能感兴趣的文章
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>
旅途上看的电影和观后感
查看>>