码迷,mamicode.com
首页 > 移动开发 > 详细

Android StageFrightMediaScanner源代码解析

时间:2015-07-20 16:36:33      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:frameworks   android   media   scanner   

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android StageFrightMediaScanner源代码解析

标签:frameworks   android   media   scanner   

原文地址:http://blog.csdn.net/matrix_laboratory/article/details/46932317

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!