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

更多相关文章

  1. android学习笔记---59_各种图形的使用介绍,android炫酷效果的实
  2. Android(安卓)C++层打印调用栈
  3. Activity详解 Intent显式跳转和隐式跳转
  4. Android(安卓)Wifi获取组播
  5. Android(安卓)原生 MediaPlayer 和 MediaCodec 的区别和联系(二)
  6. android win8效果实现进阶(一)
  7. android增加5G热点
  8. Android(安卓)Service详解(二)第一个Service
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Android(安卓)Studio之软件安装教程
  2. Android笔试总结
  3. Android中对Log日志文件的分析
  4. Android开发:ZXing条码扫描-竖屏解决方案
  5. Android(安卓)4.1源码编译找不到资源文件
  6. android EditText TextView的属性整理 最
  7. 在android用Google Geocoding API服务解
  8. Android(安卓)Launcher一些资源
  9. android RelativeLayout属性和布局实例
  10. Android应用程序的四个关键点